用Django搭建我的第一个Python网站:从零开始的实战经历

Prompt造梦师
2025-06-16 00:37
阅读 457

引子:为什么我要学Django?

引子:为什么我要学Django?

2021年刚入职时,我在一家创业公司做后端开发。老板扔来一个任务:“下个月要上线一个内部管理系统,你负责。”我当时心里一慌——虽然大学里写过Java和PHP项目,但真正独立交付一个完整的系统还是头一次。

那会儿我还在用Flask,虽然轻巧但越用越吃力,特别是用户权限、数据库迁移、后台管理这些功能都需要自己手写或者集成插件。后来同事一句话点醒了我:“你试试Django吧,它几乎什么都有。”

抱着试试看的心态,我开始研究Django。没想到这个“大而全”的框架真的帮了大忙,我们团队在一个月内完成了从立项到上线的全过程,系统运行至今都没出过啥大问题。这篇教程就基于那次实战经验写成,希望你能少走弯路。


项目背景:一个小而全的员工管理系统

项目背景:一个小而全的员工管理系统

我们的目标是搭建一个内部员工管理系统(EMS),主要需求包括:

  • 员工信息管理(增删改查)
  • 部门结构展示与管理
  • 系统用户权限控制(管理员/普通用户)
  • 后台日志记录
  • 提供REST接口供其他模块调用

这听起来是不是挺简单的?别急,后面我会讲几个“看似简单实则坑爹”的地方。


开发挑战:第一次遇到的问题比代码还多

服务器部署方案-1

开发挑战:第一次遇到的问题比代码还多

刚上手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 的黄金组合

技术方案: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

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