从零开始搭一个网站:Django 入门实战记录

数据清洗工
2025-06-28 17:52
阅读 231

开篇:为什么我想写这篇文章

开篇:为什么我想写这篇文章

去年年初,我在一家初创公司负责搭建一个新的内部管理系统。项目要求快速上线、支持基础的用户管理、权限系统和数据展示功能。作为刚转岗到后端不久的开发人员,我选择了 Django 作为技术栈。

现在回想起来,那时我对 Python Web 框架的认识还很浅,虽然知道 Flask 更简单,但还是被 Django 的“自带电池”理念吸引了。于是,在没有系统学习过 Django 的情况下,我开始了第一次独立搭建网站的过程。

这篇文章就记录了当时的真实经历,包括遇到的问题、踩过的坑,以及最终上线后的收获。如果你是一个刚接触 Django、想通过项目实践来上手的同学,我相信这篇文章会对你有帮助。


问题描述:一个看似简单的任务

问题描述:一个看似简单的任务

项目初期,我们团队只有一个前端工程师和我这个刚接手后端的小白。需求说起来很简单:

  • 用户注册/登录
  • 用户可以上传文件并查看列表
  • 管理员可以删除文件、禁用账户
  • 页面要响应式(不过这部分主要由前端处理)

看起来就是一个典型的 CRUD 系统,但我当时面对的最大挑战是:

  1. 如何快速搭建起整个系统的骨架
  2. 如何设计数据库模型结构
  3. 如何确保用户数据安全
  4. 如何部署上线

我之前用过 Flask 做过一些小项目,但 Django 是第一次正式使用。虽然框架文档很全面,但对于新手来说,直接看官方文档常常像在看天书一样——太多术语、很多选项不知道怎么选。


解决方案:选择 Django 的理由与思路

为什么是 Django?

  • 自带认证系统:节省了大量开发时间。
  • ORM 强大又灵活:不用自己写 SQL 就能完成大部分查询操作。
  • Admin 后台自动生成功能:特别适合内部系统。
  • REST Framework 支持:为后续可能的 API 接口预留空间。
  • 社区活跃,资料丰富:遇到问题基本都能在 Stack Overflow 找到答案。

技术架构初步设计

我的系统大致分为以下几个模块:

├── users        # 用户模块(登录、注册)
├── files        # 文件上传与展示
├── core         # 公共配置、中间件等
└── config       # Django 配置目录

一开始我把数据库设计得很简单,users 表继承了 AbstractUser,而 files 表关联用户 ID,并保存文件路径和状态信息。


代码实践:关键代码片段与实现思路

下面是一些我觉得非常有价值的核心代码部分,分享给你参考。

1. 创建项目与应用

django-admin startproject mysite
cd mysite
python manage.py startapp users
python manage.py startapp files

然后记得把新建的应用添加到 settings.py 中的 INSTALLED_APPS

2. 自定义用户模型

由于 Django 默认的 User 表无法满足业务需求(比如我们要加手机号字段),所以我们创建了自己的模型:

# users/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    phone = models.CharField(max_length=20, blank=True)
    is_staff = models.BooleanField(default=False)

    def __str__(self):
        return self.username

别忘了在 settings.py 中指定:

AUTH_USER_MODEL = 'users.CustomUser'

3. 文件上传模型

# files/models.py
from django.db import models
from users.models import CustomUser

class File(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    file = models.FileField(upload_to='uploads/%Y/%m/%d')
    uploaded_at = models.DateTimeField(auto_now_add=True)
    status = models.CharField(max_length=20, default='active')

    def __str__(self):
        return f"{self.user} - {self.file.name}"

注意:这里用了 FileField,后面在生产环境上线时还需要配合 Nginx 来处理静态资源访问。

4. 登录视图示例

# users/views.py
from django.contrib.auth import login, logout
from django.shortcuts import render, redirect
from .forms import LoginForm

def login_view(request):
    if request.method == "POST":
        form = LoginForm(data=request.POST)
        if form.is_valid():
            user = form.get_user()
            login(request, user)
            return redirect('home')
    else:
        form = LoginForm()

    return render(request, 'login.html', {'form': form})

这里用了标准的 Django 登录机制,Form 继承自 AuthenticationForm。


踩坑经验:那些让我崩溃的夜晚

说实话,真正开始开发后才发现,很多细节光看书是体会不到的。下面这些是我踩得比较深的一些坑,希望你不要再重蹈覆辙。

1. 静态文件配置搞不定

本地开发的时候一切正常,但一到生产环境页面样式全乱了。后来发现是因为没配置好 STATIC_ROOT 和 MEDIA_ROOT。

最终解决方案是:

# settings.py
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

# urls.py 添加:
from django.conf import settings
from django.conf.urls.static import static

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

上线前一定要运行 collectstatic!

2. ORM 查询性能差得离谱

最开始为了图方便,直接在模板里嵌套调用 ORM 查询。结果某天测试发现首页加载要将近 5 秒……

后来学会了使用 select_related()prefetch_related(),加上缓存装饰器,性能提升非常明显。

3. CSRF 设置出错导致登录不了

因为前后端分离的需求,我们在某些接口用了 REST Framework,结果因为跨域设置不正确,CSRF token 总是验证失败。

最后解决方法是在 settings.py 中加上:

CORS_ORIGIN_ALLOW_ALL = True
CSRF_TRUSTED_ORIGINS = ['http://yourdomain.com']

还要记得在 middleware 加上 CsrfViewMiddleware。

4. 数据库迁移引发的数据丢失

有次误删了某个 migration 文件,结果运行 makemigrations 时报错,差点清空数据重新来。后来养成了两个习惯:

  • 不轻易修改已存在的 migration 文件
  • 上线前备份数据库,本地也保留一份 dump 文件

效果总结:最终成果与反思

微服务架构示意图-1

经过两周多的开发和部署,系统顺利上线,目前稳定运行了将近一年时间,期间几乎没有出现重大故障。主要达到了几个目标:

  • 系统响应速度快,平均请求耗时控制在 200ms 以内
  • 权限系统清晰可控,管理员可随时封禁用户
  • 可扩展性强,未来可以轻松接入第三方登录或移动端 App

从个人角度来说,这次开发经历让我对 Django 的理解大大加深,尤其是在:

  • 认证系统的定制化
  • ORM 的高级用法
  • 生产环境的部署优化

最重要的是,我对构建一个完整的 Web 系统有了整体的认知——从前端请求、路由处理、模型交互,再到日志监控和权限控制。


经验分享:给正在入门 Django 的你

如果你也在学 Django 或打算用它做项目,结合我这段时间的经历,给你几点建议:

✅ 1. 学好基础概念比急于动手更重要

虽然网上有很多“五分钟建站”教程,但那只是演示而已。真要做出可用的东西,必须理解中间件、信号、表单验证、静态资源处理这些核心概念。

✅ 2. 实践是最好的老师

哪怕是最简单的博客系统、留言本、todo list,只要亲手做完一遍,都会有很大收获。别怕报错,去查文档,去问 ChatGPT,去翻 GitHub issue。

✅ 3. 别太迷恋“自动化”

Django Admin 很强大,但如果不是纯后台管理类项目,建议尽早使用自定义模板,避免后期调整成本高。

✅ 4. 多关注安全性与性能

比如设置合适的密码策略、启用 HTTPS、限制上传类型、定期清理日志等。这些都不是“附加项”,而是必须做的工作。

✅ 5. 结合 DevOps 工具链一起玩

部署 Django 最爽的方式就是配合 Gunicorn + Nginx + Docker + CI/CD 流水线。虽然一开始看起来有点复杂,但熟练之后效率大幅提升。


写在最后:框架只是一个工具,解决问题才是目的

Django 并不是万能的,也没有必要把它用在所有地方。但在需要快速搭建一套稳定、功能齐全的 Web 系统时,Django 绝对是一个值得信赖的选择。

这篇文章记录了我初入 Django 世界时的迷茫、挣扎、坚持和成长。如果你也在学习这条路上,希望这些经验能让你少走点弯路,更早体会到编程的乐趣。

记住一句话:不要追求完美,而是追求完成。 真正的好东西,都是在不断迭代中慢慢打磨出来的。

加油!欢迎你在评论区跟我交流你的 Django 学习之旅。

评论 0

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