初心不负:用Django搭建我的第一个Python网站

小而美开发者
2025-06-17 04:11
阅读 285

开篇:缘起于一次“被迫”上手的实战机会

开篇:缘起于一次“被迫”上手的实战机会

记得我刚入职的第一周,团队老大把一个内部管理后台的任务丢给了我。他说:“我们之前尝试过几个框架都不太理想,你来试试用 Django 写一个试试。”当时的我,对 Python 还算熟悉,但真正用它开发 Web 项目还是头一回。内心慌得不行,但嘴上还得硬着头皮答应下来。

现在想来,正是那次“被迫”让我对 Django 从陌生到喜欢,再到深入使用。今天我想分享的就是那次实战经验,希望能帮到那些正在入门 Django 的小伙伴。


问题描述:小需求背后的挑战不小

负载均衡配置-1

问题描述:小需求背后的挑战不小

这个项目的背景很简单——公司内部需要一个用于记录员工培训记录的系统,功能包括:

  • 员工信息管理(增删改查)
  • 培训课程分类与维护
  • 每位员工对应参与过的培训记录
  • 按部门统计培训覆盖率
  • 简单的权限控制(HR可以看全部,普通用户只能看自己)

听起来不复杂吧?可对于刚接触后端开发的我来说,挑战不少:

  1. 数据库模型怎么设计才清晰合理
  2. 接口设计怎么做才能方便前端对接
  3. 权限机制怎么搞?用户、角色、权限之间如何映射
  4. 性能方面需要注意什么?会不会因为查询太多拖慢响应速度
  5. 静态文件、日志、部署等运维相关的问题也得考虑进去

这些问题像一座座山一样压在我头上,但我深知,真正的成长往往就藏在这些挑战里。


解决方案:选型与架构的思考

解决方案:选型与架构的思考

为什么选 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.pyINSTALLED_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 模块,统一格式化日志输出。

建议大家一开始就按模块分好日志等级,别图省事,后期真的会哭。


效果总结:一次成功的尝试,带来了意想不到的收益

负载均衡配置-2

项目上线后运行稳定,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

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