用Django搭建你的第一个Python网站:从零开始的心得体会

技术慢生活
2025-06-29 15:54
阅读 780

背景介绍:为什么是Django?

背景介绍:为什么是Django?

作为一名后端开发者,我接触过不少开发框架,比如Flask、Spring Boot、Express,甚至早期的PHP裸写。但如果你让我推荐给新人一个既强大又上手快的Web框架,我会毫不犹豫地选 Django

去年,我在一家初创公司负责内部系统的开发任务。其中一项核心工作就是为公司的销售和客服团队搭建一个统一的数据管理平台。我们团队人数不多,时间紧迫,业务需求也在不断变化。这时候我决定选用Django——因为它内置了很多功能,开箱即用,非常适合快速开发,而且结构清晰,易于后期维护。

今天我就以这个项目为例,结合自己第一次使用Django搭网站的经历,带你一步步搭建属于你自己的Python网站,并分享一路上踩过的坑和积累的经验。


遇到的问题:从无到有的挑战

遇到的问题:从无到有的挑战

在接到项目初期,我发现几个关键问题:

  1. 快速搭建原型:我们需要尽快让产品经理看到页面结构,以便确认交互细节。
  2. 数据模型复杂度不高,但需要可扩展:虽然当前只有客户信息和订单管理两个模块,但后续要加上审批流程、工单系统等功能。
  3. 团队协作问题:我们的前端同事习惯Vue.js,我们需要前后端分离的设计架构,这样不影响各自进度。
  4. 权限控制:不同角色(如销售代表、主管)要有不同的访问权限。
  5. 部署与运维:生产环境下的性能与稳定性也必须考虑到。

这五个问题,其实就是Django非常擅长应对的场景。下面我就带着你一步步看怎么解决这些问题,并且亲手写出代码来。


解决方案:Django为什么适合这个项目

解决方案:Django为什么适合这个项目

Django框架的优势一览

功能点 Django优势
快速开发 带有admin后台、ORM支持
数据模型设计 MVT架构 + 强类型Model定义
权限控制 内置用户认证系统、分组与权限粒度控制
RESTful接口 通过djangorestframework轻松构建
部署成熟 支持Gunicorn + Nginx,社区文档完善

我们最终采用了以下技术栈:

  • 后端:Python + Django + DRF(Django REST Framework)
  • 前端:Vue.js + Axios
  • 数据库:PostgreSQL
  • 部署:Docker + Gunicorn + Nginx + uWSGI

实战演练:从创建项目到跑起来

微服务架构示意图-1

第一步:创建Django项目和应用

# 创建虚拟环境(别省略这步!)
python3 -m venv env
source env/bin/activate

# 安装Django
pip install django

# 新建项目
django-admin startproject mysite
cd mysite

# 新建app
python manage.py startapp customers

⚠️ 小贴士:Django项目中建议不要把所有的models都放在全局models.py中,应按功能划分apps,每个app有自己的models、views、urls、serializers等。

第二步:配置数据库

打开mysite/settings.py,找到DATABASES部分:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydb',
        'USER': 'myuser',
        'PASSWORD': 'mypassword',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

如果是开发阶段,也可以继续使用默认的SQLite,但在生产环境中务必使用PostgreSQL或MySQL。

运行迁移命令前,先确保PostgreSQL服务已启动:

sudo service postgresql start

然后创建数据库和用户(记得授权):

CREATE DATABASE mydb;
CREATE USER myuser WITH PASSWORD 'mypassword';
ALTER ROLE myuser SET client_encoding TO 'utf8';
ALTER ROLE myuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myuser SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

接着再回到Django里执行:

python manage.py migrate

不出意外的话,Django会自动帮你创建初始数据库表。


关键功能实现:用户认证 & REST API 设计

用户认证机制搭建

Django自带auth模块已经足够强大。我们在settings.py中启用DRF:

pip install djangorestframework

添加到INSTALLED_APPS:

INSTALLED_APPS += [
    'rest_framework',
    'rest_framework.authtoken',  # 如果你需要Token-based认证
]

然后配置REST Framework:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ]
}

数据模型设计(以客户管理为例)

customers/models.py中:

from django.db import models
from django.contrib.auth.models import User

class Customer(models.Model):
    name = models.CharField(max_length=100)
    phone = models.CharField(max_length=20)
    email = models.EmailField()
    address = models.TextField(blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

然后生成并执行迁移:

python manage.py makemigrations customers
python manage.py migrate

编写API接口(View层 + Serializer)

首先安装依赖:

pip install djangorestframework

然后建立serializer:

# customers/serializers.py
from rest_framework import serializers
from .models import Customer

class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = '__all__'

再写view:

# customers/views.py
from rest_framework import viewsets, permissions
from .models import Customer
from .serializers import CustomerSerializer

class CustomerViewSet(viewsets.ModelViewSet):
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer
    permission_classes = [permissions.IsAuthenticated]

别忘了在项目的urls.py中注册路由:

# mysite/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from customers.views import CustomerViewSet

router = DefaultRouter()
router.register(r'customers', CustomerViewSet)

urlpatterns = [
    path('api/', include(router.urls)),
]

启动服务器测试:

python manage.py runserver

访问 http://localhost:8000/api/customers/ 应该可以看到JSON格式的输出了!


踩坑经验:那些让我熬夜的小问题

1. 中文编码与请求体解析失败

有时候前端发来的POST请求体是application/json,但是Django却报错说无法解析数据。

🛠️ 原因:DRF默认的JSONParser在某些情况下对中文编码处理有问题。

解决方案:

pip install pygments  # 用于DRF的调试显示美化

并在settings.py中加入:

REST_FRAMEWORK['DEFAULT_PARSER_CLASSES'] = [
    'rest_framework.parsers.JSONParser',
    'rest_framework.parsers.FormParser',
    'rest_framework.parsers.MultiPartParser'
]

另外注意在requests发起POST时,确保头部带有正确的Content-Type。


2. 生产环境下静态资源加载失败

这个问题发生在部署上线之后。我们在本地用runserver没问题,但是放到线上Nginx后,CSS、JS文件都加载失败。

🛠️ 原因:Django不处理静态资源,在生产环境中需要用Nginx代理或者配合whitenoise中间件。

解决方法:

安装:

pip install whitenoise

在settings.py中:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',  # 插入到CommonMiddleware之前
    ...
]

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'

# 优化静态资源压缩
WHITENOISE_USE_FINDERS = True
WHITENOISE_MANIFEST_STRICT = False

最后执行:

python manage.py collectstatic --noinput

效果总结:我们得到了什么

项目上线三个月后,我们收获如下成果:

  • 开发效率大幅提升:相比传统的Flask项目,Django帮我们节省了大量重复造轮子的时间;
  • 权限控制系统灵活稳定:基于Group和Permission实现了细粒度的权限分配;
  • 前后端分离设计合理:Django作为API Server只负责逻辑和数据接口,前端用Vue调用即可;
  • 生产部署稳定:Docker打包+Gunicorn+Nginx的组合经受住了流量高峰的考验;
  • 后期扩展性强:新增工单模块只需要加个新App,完全不影响现有结构。

经验分享:给Django新手的几点建议

系统架构设计图-2

1. 不要一开始就追求“完美架构”

很多人刚学完教程就想着搞微服务、高并发,其实一开始能做出一个“可用”的产品最重要。别陷入过度设计的陷阱。

2. 利用好Admin后台

Django Admin是真的香!即使是非技术人员也能快速上手录入数据、做简单查询,强烈建议开启它:

# 在customers/admin.py中:
from django.contrib import admin
from .models import Customer

admin.site.register(Customer)

3. 学会用Django Extensions插件

开发工具链也很重要。推荐装几个常用插件:

pip install django-extensions

然后你可以用:

python manage.py shell_plus

直接进入带自动导入model的交互式终端,极大提升调试效率。

4. 接口设计保持一致性

在开发REST API的时候,一定要遵循标准风格。比如:

  • URL使用复数名词(如 /api/users/ 而不是 /api/user/
  • 返回统一字段结构(如 {"code": 200, "data": ..., "msg": "ok"}
  • 使用状态码规范响应(不要所有错误都返回200)

总结

回想第一次用Django搭网站的经历,其实有很多不确定的瞬间。刚开始我也担心会不会太重?学习曲线会不会太陡?但事实证明,Django真的是“越用越顺手”的框架。

这次实战不仅帮我完成了公司的项目交付,更重要的是,我对整个Web开发流程有了更深的理解:从数据模型设计、接口构建,到权限控制、部署上线,每一步都充满了挑战,但也带来了成长。

希望你能通过这篇文章,少走一些弯路,早点跑起你的第一个Django网站。如果遇到任何问题,欢迎留言交流,我们一起探讨!


最后送一句老话:

“真正的编程是从项目开始的。”
别光看教程,动手做出来才是正道。祝你coding愉快 😊

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝