用 Django 搭建你的第一个网站:一个后端工程师的实战分享

工单终结者
2025-06-29 04:01
阅读 755

引言:为什么选 Django?

引言:为什么选 Django?

记得我刚入行做后端开发那会儿,项目是使用 Laravel 的 PHP 系统。虽然功能齐全,但随着项目规模扩大,代码结构逐渐混乱,接口耦合严重,维护起来越来越吃力。后来公司决定转型 Python 技术栈,我也第一次接触到了 Django

说实话,第一次看到 models.pyviews.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 —— 功能模块的划分起点

第二步:创建 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)


![服务器部署方案-1](https://code-guide.oss.shanghai.autogptai.club/common/file/download?name=date2025062904/c784c7de-a778-46a3-bd36-f3811178d1e4.jpg)


    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-poolpgBouncer,或者直接交给云服务商处理。


踩坑经验总结

这部分是我最有感触的,很多同学卡在这里。

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

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