用Django搭建我的第一个Python网站:从零开始的实战经历
引子:为什么我要学Django?

2021年刚入职时,我在一家创业公司做后端开发。老板扔来一个任务:“下个月要上线一个内部管理系统,你负责。”我当时心里一慌——虽然大学里写过Java和PHP项目,但真正独立交付一个完整的系统还是头一次。
那会儿我还在用Flask,虽然轻巧但越用越吃力,特别是用户权限、数据库迁移、后台管理这些功能都需要自己手写或者集成插件。后来同事一句话点醒了我:“你试试Django吧,它几乎什么都有。”
抱着试试看的心态,我开始研究Django。没想到这个“大而全”的框架真的帮了大忙,我们团队在一个月内完成了从立项到上线的全过程,系统运行至今都没出过啥大问题。这篇教程就基于那次实战经验写成,希望你能少走弯路。
项目背景:一个小而全的员工管理系统

我们的目标是搭建一个内部员工管理系统(EMS),主要需求包括:
- 员工信息管理(增删改查)
- 部门结构展示与管理
- 系统用户权限控制(管理员/普通用户)
- 后台日志记录
- 提供REST接口供其他模块调用
这听起来是不是挺简单的?别急,后面我会讲几个“看似简单实则坑爹”的地方。
开发挑战:第一次遇到的问题比代码还多


刚上手Django没多久,我就遇到了好几个“拦路虎”:
挑战1:项目结构不清楚
Django默认生成的目录结构看起来很简洁,但作为一个新手,我根本不知道该把业务逻辑放哪儿。models.py写了上千行代码?views.py像面条一样缠在一起?这些都是我亲身踩过的坑。
解决方法:我后来按照功能模块组织项目,比如 employees/, departments/,每个模块都包含自己的 models, views, serializers 和 urls。这样结构清晰很多,也方便后期扩展。
挑战2:数据库设计太随意导致后期返工
一开始为了图方便,我把所有字段都放在一个表里,结果后面发现员工部门变更历史、职位变动这些需求压根实现不了。
解决方法:重新设计数据库结构,引入外键、软删除字段,并使用Django ORM的强大能力进行关联查询。
挑战3:REST API 接口设计混乱
我一开始用视图函数手动写接口,结果每新增一个接口就要重复写一堆序列化、验证、错误处理的代码。后来才知道 Django REST Framework (DRF) 是多么强大。
解决方法:切换到了DRF,结合ModelViewSet和Serializer机制,大大减少了样板代码,接口一致性也提升了。
技术方案:Django + DRF 的黄金组合

整个项目采用的是经典的 MTV 架构(Model-Template-View),但由于我们主要是前后端分离,所以模板部分基本没怎么用。
技术栈
- Python 3.9
- Django 3.2 LTS
- Django REST Framework
- PostgreSQL
- Gunicorn + Nginx 部署
- Redis 作为缓存
核心架构图(简化)
[前端 Vue.js] --> [Nginx 反向代理]
↓
[Gunicorn 处理请求]
↓
[Django 应用服务器]
↓
[PostgreSQL / Redis]
代码实践:从创建项目开始
第一步:初始化项目
# 创建虚拟环境
python -m venv venv
source venv/bin/activate
# 安装Django
pip install django djangorestframework
# 创建项目
django-admin startproject ems_project .
# 创建应用
python manage.py startapp employees
第二步:数据库设计 —— Employee 模型
# employees/models.py
from django.db import models
from departments.models import Department
class Employee(models.Model):
GENDER_CHOICES = (
('M', 'Male'),
('F', 'Female'),
('O', 'Other')
)
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)
birth_date = models.DateField()
hire_date = models.DateField()
department = models.ForeignKey(Department, on_delete=models.PROTECT)
is_active = models.BooleanField(default=True)
def __str__(self):
return f"{self.first_name} {self.last_name}"
小贴士:
on_delete=models.PROTECT是为了避免误删部门时连带删掉员工。
第三步:使用DRF构建API接口
# employees/api_views.py
from rest_framework import viewsets
from .models import Employee
from .serializers import EmployeeSerializer
class EmployeeViewSet(viewsets.ModelViewSet):
queryset = Employee.objects.filter(is_active=True)
serializer_class = EmployeeSerializer
# 可以重写destroy方法实现软删除
def perform_destroy(self, instance):
instance.is_active = False
instance.save()
第四步:路由配置
# ems_project/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from employees.api_views import EmployeeViewSet
router = DefaultRouter()
router.register(r'employees', EmployeeViewSet)
urlpatterns = [
path('api/', include(router.urls)),
]
踩坑日记:那些让你抓狂的小细节
坑1:忘记迁移数据库
Django最让人崩溃的地方就是,改完model不跑迁移就不会生效。建议每次提交代码前都跑一遍:
python manage.py makemigrations
python manage.py migrate
还有一个小技巧:你可以用 -n 参数查看SQL而不实际执行。
坑2:静态资源部署不一致
开发阶段没问题,一上线404一堆CSS、JS文件。最后发现是Nginx没正确设置:
# 示例 nginx 配置
location /static/ {
alias /path/to/your/project/static_root/;
}
别忘了收集静态文件:
python manage.py collectstatic --noinput
坑3:跨域请求被浏览器拦截
前端访问API时总是报错CORS。后来加了这个中间件就好了:
pip install django-cors-headers
然后在 settings.py 中:
INSTALLED_APPS = [
...
'corsheaders',
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
...
]
CORS_ALLOWED_ORIGINS = [
"http://localhost:8080",
"https://your-frontend.com"
]
成果展示:项目上线后的样子
项目最终上线后,表现得非常稳定。以下是几个关键指标:
- QPS稳定在10~30之间
- 平均响应时间<100ms
- 使用Redis缓存热点数据后CPU利用率降低约20%
- 用户反馈几乎没有卡顿或出错的情况
更令人欣慰的是,后续新功能开发也变得轻松很多,很多基础逻辑都已经沉淀好了。
总结心得:Django适合谁?什么时候该用它?
Django的优点很明显:
- 快速开发,自带工具丰富(Admin、ORM、认证等)
- 社区活跃,文档全面
- 适合中大型Web项目,尤其是内容管理系统、API平台、内部管理系统
当然也有局限性:
- 过于“重”,不适合微服务或特别灵活的需求
- ORM虽然好用,但复杂查询可能不如原生SQL高效
- 对异步支持早期不太友好(新版Django 3+已改进)
给初学者的一些建议
初期别折腾太多插件
刚开始先把Django本身的套路搞清楚。很多人一上来就想加JWT、Celery、Docker,结果把自己绕晕了。
学会使用Admin后台
Admin是你快速搭原型的神器。别小看它,熟练掌握可以省去80%的CRUD工作。
把数据库设计当重点
Django ORM很好用,但这并不意味着你可以随便设计表结构。建议多花时间画ER图,设计好索引和外键。
多看看官方文档和源码
别光看中文博客!Django官方文档写得非常详细且通俗,而且更新及时。有时候你看一遍看不懂没关系,边用边学是最好的方式。
做个小项目练手
与其死磕教程,不如直接动手做个迷你项目,比如博客系统、图书管理系统、投票系统,这些都是很好的练手机会。
写在最后:Django是我用过最舒服的Web框架
从第一次安装到真正能做出一个可用的产品,大概花了我半个月的时间。虽然过程中有焦虑、有抓狂,但回过头来看,这次经历让我对Web开发有了更深的理解。
如果你也在找一个能“又快又好”地开发Web项目的方法,我真心推荐Django。它不会让你成为神,但一定会让你成为一个高效的开发者。
最后想说一句:编程没有捷径,只有不断实践。 加油!
如果你觉得这篇文章对你有帮助,欢迎留言交流,我可以分享更多Django实战案例。一起成长,才是技术路上最美的风景 🌟

评论 0