用 Django 搭建你的第一个网站:一个后端工程师的实战分享
引言:为什么选 Django?

记得我刚入行做后端开发那会儿,项目是使用 Laravel 的 PHP 系统。虽然功能齐全,但随着项目规模扩大,代码结构逐渐混乱,接口耦合严重,维护起来越来越吃力。后来公司决定转型 Python 技术栈,我也第一次接触到了 Django。
说实话,第一次看到 models.py 和 views.py 的时候我还挺懵的——这玩意真能撑得起复杂的业务系统?但没过多久我就被“打脸”了。用了 Django 之后,我发现它不仅自带了一整套开箱即用的功能(比如 ORM、认证系统、后台管理),而且组织清晰、文档完善,社区活跃,真的让人越用越顺手。
今天,我想结合自己这几年在实际项目中使用 Django 的经验,带大家一步步搭建一个属于你自己的 Django 网站。这不是一篇理论堆砌的文章,而是基于真实开发场景的经验分享,过程中我会告诉你遇到的坑是怎么踩的,又是怎么爬出来的。
项目背景:为一个线上问卷平台搭建基础框架

我们先设定一个具体的项目背景。假设你要给一个市场调研团队搭建一个在线问卷收集平台,需求如下:
- 用户可以创建和编辑问卷
- 支持匿名填写,支持登录用户查看提交记录
- 后台需要有数据统计功能
- 支持导出结果(CSV)
这个需求看起来不复杂,但涉及到用户系统、权限控制、表单设计、数据持久化等多个方面,非常适合用来练手。
第一步:环境准备与项目初始化

工具链选择
- Python 3.10+
- Django 4.2+
- PostgreSQL(生产环境推荐)
- 开发建议:使用虚拟环境(venv 或 pipenv)
✨小贴士:如果你是新手,可以用 SQLite 开始,方便又快,等熟悉后再换成 PostgreSQL。
安装 Django:
pip install django
然后创建项目:
django-admin startproject survey_platform .
注意后面的点号 . 表示将文件生成在当前目录下,而不是新建一个目录。
启动开发服务器试试看:
python manage.py runserver
打开浏览器访问 http://localhost:8000,如果看到 Django 的欢迎页面,说明项目初始化成功啦!
第二步:创建 App —— 功能模块的划分起点

在 Django 中,一个项目由多个 App 组成,每个 App 对应一个功能模块。我们先创建两个核心 App:
python manage.py startapp surveys
python manage.py startapp accounts
surveys 负责问卷本身的内容管理,accounts 则负责用户系统。接下来,在 settings.py 中注册这些 App:
INSTALLED_APPS = [
...
'surveys',
'accounts',
]
别忘了设置数据库(如果是 PostgreSQL):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'survey_db',
'USER': 'your_user',
'PASSWORD': 'your_password',
'HOST': 'localhost',
'PORT': '',
}
}
运行迁移命令:
python manage.py migrate
到这一步,我们的网站已经有骨架了。
第三步:开始写模型 —— 数据库的设计才是根本
这是我早期经常忽略的一点:没有好的数据结构,再牛逼的逻辑也救不了你。
来看一下我们最核心的数据模型 —— Survey(问卷)
# surveys/models.py
from django.db import models
from django.contrib.auth import get_user_model
User = get_user_model()
class Survey(models.Model):
title = models.CharField("标题", max_length=100)
description = models.TextField("描述", blank=True, null=True)
creator = models.ForeignKey(User, on_delete=models.CASCADE, related_name='created_surveys')
is_active = models.BooleanField("是否启用", default=True)
created_at = models.DateTimeField(auto_now_add=True)

def __str__(self):
return self.title
然后还有问题(Question)和回答(Answer)模型:
class Question(models.Model):
survey = models.ForeignKey(Survey, on_delete=models.CASCADE, related_name='questions')
text = models.CharField(max_length=255)
question_type = models.CharField(
max_length=20,
choices=[
('text', '文本'),
('choice', '单选'),
('multiple_choice', '多选'),
]
)
class Answer(models.Model):
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
question = models.ForeignKey(Question, on_delete=models.CASCADE)
response_text = models.TextField(blank=True, null=True)
selected_options = models.JSONField(default=list, blank=True) # 多选用JSON保存
💡经验提醒:尽量用 JSONField 来存储一些非标准化的数据,比如多选答案、动态字段等。
执行数据库迁移:
python manage.py makemigrations
python manage.py migrate
现在数据库表已经创建好了!
第四步:写视图 + URL 分发 —— 接口设计的艺术
Django 支持类视图(Class-Based Views),这对提高开发效率帮助很大。我们可以使用 ListView, DetailView, CreateView, UpdateView 这些通用视图快速搭建 CRUD 页面。
举个例子:展示所有问卷的列表页
# surveys/views.py
from django.views.generic import ListView
from .models import Survey
class SurveyListView(ListView):
model = Survey
template_name = "surveys/list.html"
context_object_name = "surveys"
然后配置 URL 路由:
# surveys/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.SurveyListView.as_view(), name='survey-list'),
]
在主项目的 urls.py 引入:
path('surveys/', include('surveys.urls')),
然后你就可以访问 /surveys/ 查看到所有问卷了(前提是模板存在 😂)
第五步:编写前端模板 —— 保持前后端松耦合
模板放在每个 App 的 templates 目录下。例如:
/surveys/templates/surveys/list.html
Django 使用的是自己的模板引擎(也可以换 Jinja2),基本语法如下:
<!-- surveys/list.html -->
<h1>问卷列表</h1>
<ul>
{% for survey in surveys %}
<li><a href="{% url 'survey-detail' survey.id %}">{{ survey.title }}</a></li>
{% empty %}
<li>还没有问卷哦。</li>
{% endfor %}
</ul>
是不是很像 Flask 或者 Vue 的写法?没错,Django 自带的模板系统就是为了快速上手,不用引入额外框架。
第六步:实现用户登录与权限控制
Django 自带了非常强大的认证系统,我们要充分利用这一点。
首先,创建登录视图:
# accounts/views.py
from django.contrib.auth.views import LoginView
class CustomLoginView(LoginView):
template_name = 'accounts/login.html'
然后加路由:
path('login/', views.CustomLoginView.as_view(), name='login'),
接下来是对某些页面添加权限控制:
from django.contrib.auth.mixins import LoginRequiredMixin
class SurveyCreateView(LoginRequiredMixin, CreateView):
model = Survey
fields = ['title', 'description', 'is_active']
template_name = 'surveys/create.html'
success_url = reverse_lazy('survey-list')
这样就能保证只有登录用户才能创建问卷。
🧪实战小技巧:可以在模板里判断用户是否登录,展示不同的内容。
{% if user.is_authenticated %}
<a href="{% url 'logout' %}">退出</a>
{% else %}
<a href="{% url 'login' %}">登录</a>
{% endif %}
第七步:部署上线前的准备工作
终于写完了主要功能,准备上线了吧?别急,来点部署前的关键准备。
静态文件收集
Django 在开发环境下自动帮你处理静态文件(CSS、JS、图片),但在生产环境必须手动收集:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
然后执行:
python manage.py collectstatic
设置 SECRET_KEY 和 DEBUG=False
不要把 SECRET_KEY 提交到 Git 上!用 .env 文件管理敏感信息是一个好习惯。
推荐使用 python-decouple 来读取 .env:
pip install python-decouple
修改 settings.py:
from decouple import config
SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', default=False, cast=bool)
.env 内容:
SECRET_KEY=your_super_secret_key_here
DEBUG=False
配置数据库连接池(生产必备)
默认情况下 Django 不启用连接池,如果你并发量稍大点就会出现性能瓶颈。推荐使用 dj-pool 或 pgBouncer,或者直接交给云服务商处理。
踩坑经验总结
这部分是我最有感触的,很多同学卡在这里。
1. makemigrations 有时不起作用?
原因可能是:
- 忘记在
INSTALLED_APPS中注册应用 - 数据库已经存在字段冲突
- 旧 migration 文件未删除干净
解决方法:进入数据库检查 django_migrations 表,删除相关记录,重新执行。
2. 模板路径找不到怎么办?
确保:
- 模板路径正确(按 App 名命名)
- 每个 App 下都有
templates/app_name/结构 TEMPLATES配置正确,特别是'APP_DIRS': True
3. 静态文件不加载?
检查是否漏掉了 collectstatic,有没有正确的 Nginx 配置指向 STATIC_ROOT
最终部署方式建议
生产环境推荐组合:
- Gunicorn 作为 WSGI 容器
- Nginx 反向代理静态资源
- Postgres 作为数据库
- 使用 Docker 或 PM2 管理进程
你可以写一个简单的 Dockerfile 做容器化部署,提升可移植性。
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "survey_platform.wsgi:application", "--bind", "0.0.0.0:8000"]
然后构建并运行:
docker build -t survey_app .
docker run -d -p 8000:8000 survey_app
效果总结:这套系统上线后带来了什么?
我之前参与过一个客户调研系统的开发,就是基于类似的 Django 架构。最终效果如下:
| 项目指标 | 结果 |
|---|---|
| 响应时间 | 平均 < 300ms |
| 日 PV 访问量 | 10k+ |
| 扩展性 | 新增功能模块只需新增 App 即可 |
| 开发效率 | 从零到上线仅用两周 |
最重要的是,这种架构让团队协作变得轻松了许多,各个模块职责清晰,代码易于维护。
我的建议:给 Django 新手的几点忠告
✅ 一定要理解 MVC 架构的思想
Django 是 MTV 模式(Model-Template-View),跟传统 MVC 类似。理解清楚 Model 层负责数据操作、View 层处理请求、Template 层渲染页面,你会更顺畅地写出结构清晰的代码。
✅ 多用 Admin 后台
别低估 Django admin 的作用。它的自动生成表单、权限控制、审计日志等功能都非常实用,特别适合内部管理系统。
✅ 不要过度追求高并发优化
初期先把功能跑通,再说优化的事。别一上来就想着用 Redis 缓存、Celery 异步任务,那只会让你更慢起步。
✅ 学会用 Shell 调试模型
python manage.py shell
这里可以导入模型对象,测试查询语句,非常有用。
✅ 接口设计要统一风格
无论是 REST 还是普通视图,保持 URL 设计一致、响应结构统一,会让你的前后端对接更加高效。
结语:Django 是你值得掌握的后端利器
一路走来,Django 已经陪伴我多年。从一个小白成长为能够独立承接项目的后端开发者,Django 给了我很大的助力。
这篇文章不是教学手册,也不是官方文档,而是一个从业五年工程师的真实经历和体会。我希望通过这种方式,能让你少走一点弯路,早点享受编程的乐趣。
当你搭建起人生第一个完整的网站时,那种成就感,真的很爽。
如果你对 Django 感兴趣,欢迎关注我后续的技术更新。我们下次见!
文章首发于个人技术博客 🛠️ www.linuxdeep.com/django-tutorial

评论 0