用 Django 快速搭建一个网站:我的第一个项目实战记录
我第一次接触 Django,是在一家创业公司做后端开发的时候。公司业务发展快,需要快速上线一个内部管理系统,用来支持销售、客户管理以及报表统计等功能。当时团队只有我和一个前端小伙伴,时间紧任务重。考虑到 Python 的生态和上手速度,我们决定用 Django 来搭建后台服务。
说实话,虽然之前在学校里学过一点 Python,但真正要用 Django 搭建一个完整的 Web 应用,对我来说还是个不小的挑战。好在我身边有同事指点,加上网上教程很多,很快就入了门。不过在实际操作过程中,还是踩了不少坑。今天就来分享一下那次的经历,希望能帮刚入门的你少走些弯路。
背景与需求:为什么选择 Django?

项目的需求相对明确:我们要构建一个面向内部员工使用的 Web 系统,主要功能包括:
- 用户注册与登录
- 客户信息管理(增删改查)
- 订单数据维护
- 简单的数据统计页面
整个系统不需要复杂的性能优化,但要求上线快、结构清晰、后期容易扩展。我们选择了 Python + Django 的技术栈,主要原因如下:
- 开发效率高:Django 提供了很多开箱即用的功能,比如 Admin 后台、ORM、用户认证模块等。
- 结构规范:MVC 分离思想清晰,团队协作方便。
- 生态成熟:大量现成的库可以直接用,节省开发时间。
- 易于部署:生产环境可用 Nginx + Gunicorn 部署,稳定可靠。
初次尝试:从新建项目开始

安装完 Django 之后,第一步就是创建项目。执行下面这条命令就能生成基础目录结构:
django-admin startproject mysite
进入目录后你会看到类似这样的结构:
mysite/
├── manage.py
└── mysite/
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
接下来运行服务器试试看:
python manage.py runserver
不出意外的话,访问 http://127.0.0.1:8000 就能看到“Welcome to Django”的默认页面。这一步看起来简单,但也有一些小问题要注意:
💡小插曲:刚开始我不小心在虚拟环境中安装了不同版本的 Django,导致启动时报错。后来意识到是因为环境配置混乱,立即用了
virtualenv搞定。建议大家一定要用虚拟环境,避免依赖冲突!
创建应用:组织你的代码结构

Django 中项目的概念比较宏观,里面可以包含多个“app”,每个 app 对应不同的功能模块。于是我又执行:
python manage.py startapp customer
这里我新建了一个叫 customer 的 app,用于处理客户相关功能。
然后不要忘记把这个 app 加入到 INSTALLED_APPS 里,不然 Django 是不会识别它的。打开 mysite/settings.py,把 'customer.apps.CustomerConfig' 添加进去:
INSTALLED_APPS = [
...
'customer.apps.CustomerConfig',
]
数据模型设计:数据库部分
这是我遇到的第一个挑战点。作为一个后端新手,我对数据库设计不太熟。当时的思路是:
- 每个客户应该有基本的信息字段,比如姓名、电话、邮箱、地址等。
- 每个订单对应一个客户。
- 系统要支持用户登录才能操作。
因此我定义了一个 Customer 模型类:
# customer/models.py
from django.db import models
from django.contrib.auth.models import User
class Customer(models.Model):
name = models.CharField(max_length=100)
phone = models.CharField(max_length=20)
email = models.EmailField()
address = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)

def __str__(self):
return self.name
还有一个关联订单的模型:
class Order(models.Model):
customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
amount = models.DecimalField(max_digits=10, decimal_places=2)
status = models.CharField(max_length=20, choices=[('pending', 'Pending'), ('paid', 'Paid')])
created_at = models.DateTimeField(auto_now_add=True)
写完模型后,记得生成迁移文件并同步数据库:
python manage.py makemigrations
python manage.py migrate
这时候数据库表会自动创建好了,默认使用的是 SQLite 数据库。如果你要做正式项目,建议换成 MySQL 或 PostgreSQL。
🧠 经验总结:
- 不要把所有内容放在一个 model 文件中,随着业务变复杂,建议拆分成
models/目录结构。- 使用外键时注意
on_delete参数的选择。- 多用
auto_now_add和auto_now字段,简化时间戳管理。- 如果将来想对接移动端或开放 API 接口,建议一开始就考虑 RESTful 风格的设计。
Django Admin:快速搭建后台管理界面
这是让我眼前一亮的一块功能。Django 自带了一个后台管理系统,只需要注册模型就能自动生成 CRUD 页面。
在 customer/admin.py 中加入:
from django.contrib import admin
from .models import Customer, Order
admin.site.register(Customer)
admin.site.register(Order)
然后创建管理员账户:
python manage.py createsuperuser
登录后台后你会发现界面已经帮你做好了搜索、排序、列表展示、新增编辑这些功能。这对于早期验证产品逻辑非常有用。
⚠️小贴士:
后来我发现,在生产环境下不建议直接暴漏这个后台,建议限制访问 IP 或者做二次封装。
视图与路由:搭建页面交互流程
现在数据层准备好了,下一步是提供页面给用户访问。
我首先在 views.py 写了一个简单的视图函数,用来展示客户列表:
# customer/views.py
from django.shortcuts import render
from .models import Customer
def customer_list(request):
customers = Customer.objects.all()
return render(request, 'customer/list.html', {'customers': customers})
接着配置 URL:
# customer/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('customers/', views.customer_list, name='customer_list'),
]
主项目的 urls.py 还要 include 这个 app 的路由:
from django.urls import path, include
urlpatterns = [
path('', include('customer.urls')),
]
最后写一个简单的 HTML 模板,放在 customer/templates/customer/list.html:
<h1>客户列表</h1>
<ul>
{% for customer in customers %}
<li>{{ customer.name }} ({{ customer.phone }})</li>
{% endfor %}
</ul>
浏览器访问 /customers/ 成功看到了页面!
💬心得体会:
Django 的模板语法非常直观,而且支持继承复用。不过如果你打算用前后端分离的方式,那就可以跳过这一步,用 DRF(Django REST Framework)来返回 JSON 数据。
接口设计与 DRF:为未来扩展做铺垫
后面我们确实遇到了一个问题:前端小伙伴说他不想用 Django 模板引擎,想自己用 Vue.js 做组件化开发。
于是我决定引入 Django REST Framework 来提供接口。
先装包:
pip install djangorestframework
再把它加进 INSTALLED_APPS:
INSTALLED_APPS = [
...
'rest_framework',
]
接着是写一个视图集和序列化器:
# customer/serializers.py
from rest_framework import serializers
from .models import Customer
class CustomerSerializer(serializers.ModelSerializer):
class Meta:
model = Customer
fields = '__all__'
# customer/views.py
from rest_framework import viewsets
from .models import Customer
from .serializers import CustomerSerializer
class CustomerViewSet(viewsets.ModelViewSet):
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
配置路由:
# customer/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import CustomerViewSet
router = DefaultRouter()
router.register(r'customers', CustomerViewSet)
urlpatterns = [
path('', include(router.urls)),
]
这样就暴露出了 RESTful API 接口,前端可以直接通过 fetch 请求拿到数据,再也不用 Django 的模板引擎了。
👍效果:
一套系统既可以作为传统 MVC 的网站使用,也可以作为前后端分离的 API 接口服务。这套架构灵活度很高,适合后续扩展。
上线部署:从开发机走向生产环境
本地跑得飞起,不代表在线上也能这么顺利。我们最终选择了 Nginx + Gunicorn + Supervisor + PostgresSQL 的组合。
主要步骤如下:
把数据库从 SQLite 换成 PostgreSQL(修改
settings.py)安装 gunicorn:
pip install gunicorn测试运行:
gunicorn mysite.wsgi:application配置 nginx 反向代理:
server { listen 80; server_name example.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }使用 supervisor 管理进程(防止崩溃重启)
[program:mysite] command=/path/to/virtualenv/bin/gunicorn mysite.wsgi:application directory=/path/to/project user=www-data autostart=true autorestart=true redirect_stderr=true stdout_logfile=/var/log/mysite.log
部署完成后,网站终于跑起来了。虽然过程繁琐,但这一步非常重要 —— 实战中大多数 Bug 并不是出在代码上,而是部署环节的细节。
效果与收获:一次成功的尝试
项目上线后,整个团队都反馈很好:
- 开发效率高:两天内完成了用户登录+客户管理+订单模块的核心功能。
- 架构灵活:既可以当传统网站,又能作为 API 服务端。
- 便于迭代:模块化结构让后续新功能开发更轻松。
- 运维成本可控:用成熟的方案部署,稳定性较高。
更重要的是,这次实战让我对 Django 的整体架构有了更深的理解:
- MVT 模式如何组织代码
- ORM 如何简化数据库交互
- Admin 后台如何提升产品验证效率
- REST Framework 怎么配合前端使用
- 部署流程怎么一步步来操作
给初学者的几点建议
如果你也正在学习 Django,或者打算做一个自己的小项目,我有几个实用的小建议送给你:
✅ 用好虚拟环境
一开始我就忽略了虚拟环境的重要性,直到因为不同项目的依赖冲突浪费了一下午时间。所以强烈建议你:
- 用
virtualenv或conda创建独立的开发环境 - 用
.gitignore忽略掉venv/和__pycache__/ - 用
pip freeze > requirements.txt锁定依赖版本
📦 模块化组织代码
一个项目如果只有一个 app,很快就会变得臃肿。建议按功能分多个 apps,比如:
users: 管理登录注册orders: 管理订单数据api: 放所有接口视图
这样不仅结构清晰,后期微服务拆分也更容易。
🛠️ 合理使用中间件和第三方库
比如:
django-debug-toolbar:调试神器,查看 SQL 查询次数和耗时django-extensions:提供更多便捷命令,如shell_plusdrf-yasg:自动生成 API 文档,特别适合前后端联调sentry:错误日志收集,线上 bug 一眼看出
🚀 生产部署不要怕麻烦
不要图省事直接 runserver 上线,那是测试专用的。正式上线一定要:
- 用 Gunicorn 替代 devserver
- 加上 Nginx 做反向代理
- 用 Supervisor 或 systemd 做进程管理
- 配好 HTTPS(Let's Encrypt 很方便)
结语:Django,一个值得投入学习的框架
回望那段快速成长的时光,Django 在其中起到了关键的作用。它不像 Flask 那样“裸奔”,也不像 Java Spring Boot 那样繁重。它介于两者之间,既能让你专注于业务逻辑本身,又有丰富的生态支持。
对于想入门 Web 开发的开发者来说,Django 是一个非常适合的选择。希望这篇文章能带你迈出第一步,并在未来走得更远。
如果你还有问题,欢迎留言讨论,我们一起交流成长。毕竟,谁不是从一个小 demo 开始,一路跌跌撞撞走到现在的呢?

评论 0