初心不负:用Django搭建我的第一个Python网站
开篇:缘起于一次“被迫”上手的实战机会

记得我刚入职的第一周,团队老大把一个内部管理后台的任务丢给了我。他说:“我们之前尝试过几个框架都不太理想,你来试试用 Django 写一个试试。”当时的我,对 Python 还算熟悉,但真正用它开发 Web 项目还是头一回。内心慌得不行,但嘴上还得硬着头皮答应下来。
现在想来,正是那次“被迫”让我对 Django 从陌生到喜欢,再到深入使用。今天我想分享的就是那次实战经验,希望能帮到那些正在入门 Django 的小伙伴。
问题描述:小需求背后的挑战不小


这个项目的背景很简单——公司内部需要一个用于记录员工培训记录的系统,功能包括:
- 员工信息管理(增删改查)
- 培训课程分类与维护
- 每位员工对应参与过的培训记录
- 按部门统计培训覆盖率
- 简单的权限控制(HR可以看全部,普通用户只能看自己)
听起来不复杂吧?可对于刚接触后端开发的我来说,挑战不少:
- 数据库模型怎么设计才清晰合理?
- 接口设计怎么做才能方便前端对接?
- 权限机制怎么搞?用户、角色、权限之间如何映射?
- 性能方面需要注意什么?会不会因为查询太多拖慢响应速度?
- 静态文件、日志、部署等运维相关的问题也得考虑进去
这些问题像一座座山一样压在我头上,但我深知,真正的成长往往就藏在这些挑战里。
解决方案:选型与架构的思考

为什么选 Django?
其实当时还想过 Flask 和 FastAPI,但最终选择 Django 是基于以下几个判断:
- 自带 ORM,数据建模非常方便
- Admin 后台开箱即用,能快速看到效果,尤其适合管理类系统
- 内置认证模块,权限部分省了不少事
- 成熟稳定,在社区资源和文档方面有明显优势
架构设计思路
考虑到这是一个中短期的轻量级项目,我采用了比较经典的 MVC 架构:
- Model层:定义数据模型,包含 Employee、TrainingCourse、TrainingRecord
- View层:处理业务逻辑和 HTTP 请求,返回 JSON 或模板页面
- Template层:使用 Django 的模板引擎渲染前端展示(虽然是个管理后台,但老板希望简单直观)
此外,我在早期就引入了 REST Framework,为后续可能的 API 对接预留空间。
代码实践:一步一步搭出你的网站
第一步:初始化项目
首先用 django-admin startproject 初始化项目结构:
django-admin startproject training_portal
cd training_portal
python manage.py runserver
访问 http://localhost:8000 能看到“恭喜页”,说明项目跑起来了。
接下来创建应用(app):
python manage.py startapp employees
python manage.py startapp trainings
将这两个 app 加入 settings.py 的 INSTALLED_APPS 中:
INSTALLED_APPS = [
...
'employees',
'trainings',
]
第二步:设计数据模型
以 employees/models.py 为例:
from django.db import models
class Department(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Employee(models.Model):
name = models.CharField(max_length=100)
department = models.ForeignKey(Department, on_delete=models.PROTECT)
email = models.EmailField(unique=True)
def __str__(self):
return f"{self.name} ({self.department})"
Trainings 类似,略去。
运行迁移:
python manage.py makemigrations
python manage.py migrate
第三步:配置 Admin 后台
为了让 HR 能够直接操作数据,我把模型注册到 admin:
# employees/admin.py
from django.contrib import admin
from .models import Employee, Department
admin.site.register(Employee)
admin.site.register(Department)
登录后台(记得先创建 superuser),就能进行基本的数据管理了。
第四步:构建简单的 API 接口
安装 DRF:
pip install djangorestframework
加入 settings.py:
INSTALLED_APPS += ['rest_framework']
然后写一个视图和 serializer:
# employees/serializers.py
from rest_framework import serializers
from .models import Employee
class EmployeeSerializer(serializers.ModelSerializer):
class Meta:
model = Employee
fields = '__all__'
# employees/views.py
from rest_framework.viewsets import ModelViewSet
from .models import Employee
from .serializers import EmployeeSerializer
class EmployeeViewSet(ModelViewSet):
queryset = Employee.objects.all()
serializer_class = EmployeeSerializer
最后配置 URL:
# urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from employees.views import EmployeeViewSet
router = DefaultRouter()
router.register(r'employees', EmployeeViewSet)
urlpatterns = [
...
path('api/', include(router.urls)),
]
这样就可以通过 /api/employees/ 获取数据了。
踩坑经验:一路走来的坑和教训
1. 数据库关联设计不合理,后期改表痛苦
最开始我没意识到 ForeignKey 的 on_delete 行为会影响后期删除操作。比如一开始用了 CASCADE,后来发现误删部门会导致整个部门员工都被连带删除,吓了一跳,赶紧改成 PROTECT,并且加了软删除标志。
💡 建议:设计表结构时务必谨慎评估关联关系,必要时做软删除 + 日志记录。
2. 查询没优化,接口响应慢得离谱
在写培训记录列表接口时,我用了类似这样的逻辑:
for record in TrainingRecord.objects.all():
print(record.employee.name, record.course.title)
结果发现,每取一个字段都要触发一次 SQL 查询,效率极差。后来用 .select_related() 改写:
records = TrainingRecord.objects.select_related('employee', 'course').all()
响应时间从秒级降到了几十毫秒。
💡 建议:用好 ORM 提供的预加载功能,避免 N+1 查询。
3. 部署前忘记设置 DEBUG=False,导致暴露敏感信息
在测试环境跑了几天都没事,上线后有人用 IP 直接访问服务器,居然返回了完整的错误堆栈。这下意识不对劲,检查才发现 settings.py 里的 DEBUG 还开着!
紧急关闭并配置好日志输出路径后才算解决问题。
💡 建议:所有生产环境都必须关闭 DEBUG,并且设置好 ALLOWED_HOSTS。
4. 没有统一的日志规范,定位问题困难
最初为了方便调试,各种 print 输出满天飞,后来排查权限问题的时候根本找不到线索。最后不得不引入 logging 模块,统一格式化日志输出。
建议大家一开始就按模块分好日志等级,别图省事,后期真的会哭。
效果总结:一次成功的尝试,带来了意想不到的收益

项目上线后运行稳定,HR 部门反馈很好,原本需要手动 Excel 统计的内容,现在只需要点几下鼠标就能搞定。而且后来市场部听说我们做了这个平台,主动要求接入他们的新人培训流程,相当于间接推动了一个跨部门协作系统的诞生。
技术层面来看:
- 使用 Django ORM 提高了开发效率
- Admin 后台节省了大量重复工作
- DRF 让前后端分离成为可能
- 权限体系设计也为后续扩展打下了基础
经验分享:给新手的一些真诚建议
1. 不要怕慢,前期设计多花点时间是值得的
很多初学者急于写出功能,忽略了设计阶段。记住,好的结构比快写完更重要。特别是涉及到数据库的这部分,一旦上线改起来很麻烦。
2. 学会在浏览器开发者工具中观察请求和响应
不要只依赖 print 或 logger,要学会用 Chrome DevTools 观察 API 请求状态、耗时、返回内容。这能帮你更快定位问题。
3. 多看官方文档和 GitHub Issues
很多时候你以为的 Bug,其实只是用法不对。Django 文档写得非常棒,而且社区活跃,遇到问题不妨多搜搜 GitHub 上有没有类似 issue。
4. 养成良好的版本控制习惯
每一项功能提交一次 commit,分支结构清晰,哪怕出错了也可以轻松 rollback。别问我怎么知道的 😅
结语:Django 并不只是玩具框架
很多人觉得 Django 是传统框架,不如 FastAPI 新潮,但在实际企业开发中,它的稳定性和生态完整性依然有着不可替代的价值。
尤其是当你面对的是内部管理系统、后台服务、内容发布平台这类偏重 CRUD 的项目时,Django 就像是一个全能选手,既能让你快速开发,又能支撑得起一定的业务规模。
愿你在学习 Django 的路上少些弯路,多些收获。不忘初心,砥砺前行!如果你也有类似的实战经历,欢迎留言交流,我们一起成长 🚀

评论 0