创建并激活虚拟环境
从零搭建你的第一个 Django 网站:实战经验分享

记得我刚入行那会儿,老板让我两周内上线一个内部使用的资产管理后台。说实话,我当时对 Python 还算熟悉,但从来没用 Django 做过项目。面对这个任务,心里其实有点发虚。不过好在 Django 的文档很清晰,社区活跃,再加上自己一点点摸索和踩坑,最后顺利完成了任务,还收获了不少宝贵的经验。
今天我想以亲身经历为基础,结合一些常见问题,带大家一步步完成一个基础但完整的 Django 网站搭建流程。不是那种“hello world”级别的演示,而是真正面向实际开发、贴近生产环境的实战教程。
初识 Django:为什么选择它?
我们先来简单介绍一下 Django。Django 是一个基于 Python 的高级 Web 框架,内置了 ORM(对象关系映射)、Admin 后台、模板引擎、用户认证系统等一系列功能,特别适合快速开发数据库驱动型网站。
它的官方口号是:“为完美主义者设计的框架”。这话不假,Django 的设计理念强调“约定优于配置”,让我们能更专注于业务逻辑而不是底层细节。
项目背景:一个小型资产管理系统
为了方便说明,我将以我当初那个资产管理系统的开发过程为例,带大家走一遍 Django 的基本使用流程。
这个系统的业务需求相对简单:
- 登录认证;
- 展示公司内部设备的基本信息(如电脑、服务器、打印机等);
- 支持增删改查操作;
- 提供搜索与分类展示的功能;
- 有权限控制,普通用户只能查看,管理员可编辑。
这正是 Django 擅长处理的场景。
第一步:搭起项目骨架
我们先安装 Django。建议使用虚拟环境,这样不会污染全局的 Python 环境。
python3 -m venv venv
source venv/bin/activate
# 安装 Django
pip install django
接下来创建项目:
django-admin startproject asset_management .
此时你会看到这样的目录结构:
asset_management/
├── manage.py
└── asset_management/
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
运行一下测试服务器:
python manage.py runserver
如果看到“Starting development server...”说明一切正常。
小插曲:有一次我在 Windows 上跑 runserver 总是失败,后来发现是因为杀毒软件拦截了本地服务绑定端口。这个问题虽然不大,但也提醒我们要留意环境层面的限制。
第二步:创建 App 和模型
Django 鼓励模块化开发,每个功能模块作为一个 App。我们可以创建一个叫 assets 的 App 来管理我们的资产数据。
python manage.py startapp assets
别忘了把它添加到 settings.py 中的 INSTALLED_APPS 里。
接着是定义模型(model),也就是我们数据的结构。打开 assets/models.py 添加如下内容:
from django.db import models
from django.contrib.auth.models import User
class Asset(models.Model):
DEVICE_TYPES = [
('computer', '计算机'),
('server', '服务器'),
('printer', '打印机'),
('network', '网络设备'),
]
name = models.CharField(max_length=100)
serial_number = models.CharField(max_length=50, unique=True)
device_type = models.CharField(max_length=20, choices=DEVICE_TYPES)
owner = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
purchase_date = models.DateField()
notes = models.TextField(blank=True)
def __str__(self):
return self.name
这里有几个关键点需要注意:
- 使用了 Django 自带的 User 模型进行关联;
- 对序列号做了唯一性约束;
- 设备类型使用 choice 字段提升可维护性;
- 备注字段支持空值,提升扩展性。
然后生成迁移文件并执行数据库迁移:
python manage.py makemigrations
python manage.py migrate
踩坑记录:一开始我把 serial_number 设置成了非唯一字段,结果后期发现重复入库导致统计错误。后来意识到这类字段一定要加 unique=True。
第三步:注册 Admin,快速构建后台管理界面
Django 最让人惊喜的就是自带的 Admin 系统,几乎不需要写任何代码就能得到一套完整的后台界面。
首先,在 assets/admin.py 注册我们的 Asset 模型:
from django.contrib import admin
from .models import Asset
admin.site.register(Asset)
然后创建超级用户用于登录:
python manage.py createsuperuser
启动服务后访问 http://localhost:8000/admin,输入你刚才设置的账号密码,就可以看到资产表单了!
优化体验:你可以自定义 admin 页面显示的字段、筛选条件、排序方式等。比如:
@admin.register(Asset)
class AssetAdmin(admin.ModelAdmin):
list_display = ('name', 'serial_number', 'device_type', 'owner', 'purchase_date')
list_filter = ('device_type', 'purchase_date')
search_fields = ['name', 'serial_number']
这一部分虽然是后台功能,但对于产品早期快速验证非常有用,特别是在团队内部试用阶段。
第四步:实现前端页面和接口
接下来我们需要对外提供访问页面或接口。
创建视图和模板
Django 的视图机制可以同时支持传统 HTML 页面渲染,也可以返回 JSON 数据做前后端分离。
这里我们先实现一个简单的资产列表页。
首先修改 urls.py:
from django.urls import path
from assets import views
urlpatterns = [
path('admin/', admin.site.urls),
path('assets/', views.asset_list, name='asset_list'),
]
然后编写视图函数 views.py:
from django.shortcuts import render
from .models import Asset
def asset_list(request):
assets = Asset.objects.all()
return render(request, 'assets/list.html', {'assets': assets})
接着创建模板路径:assets/templates/assets/list.html,内容如下:
<!DOCTYPE html>
<html>
<head>
<title>资产列表</title>
</head>
<body>
<h1>资产清单</h1>
<ul>
{% for asset in assets %}
<li>{{ asset.name }} - {{ asset.serial_number }}</li>
{% endfor %}
</ul>
</body>
</html>
访问 http://localhost:8000/assets/ 就能看到效果啦!
注意性能问题:当数据量大时,直接取全部 Asset.objects.all() 可能导致性能下降,建议加上分页逻辑。
我们可以用 Django 的 Paginator 类:
from django.core.paginator import Paginator
from django.shortcuts import render
from .models import Asset
def asset_list(request):
asset_list = Asset.objects.all()
paginator = Paginator(asset_list, 20) # 每页显示20条
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
return render(request, 'assets/list.html', {'page_obj': page_obj})
再稍微调整下模板中的循环语句即可。
构建 API 接口(RESTful)
如果你的产品需要接入移动端或其他服务,API 接口就必不可少。我们可以使用 Django REST framework(DRF)来做这件事。
先安装依赖:
pip install djangorestframework
添加到 INSTALLED_APPS 中:
INSTALLED_APPS = [
...
'rest_framework',
'assets'
]
然后创建 serializers.py:
from rest_framework import serializers
from assets.models import Asset
class AssetSerializer(serializers.ModelSerializer):
class Meta:
model = Asset
fields = '__all__'
再写个视图类:
from rest_framework.generics import ListAPIView
from assets.models import Asset
from assets.serializers import AssetSerializer
class AssetListView(ListAPIView):
queryset = Asset.objects.all()
serializer_class = AssetSerializer
修改路由配置:
from django.urls import path
from assets.views import AssetListView
urlpatterns = [
path('api/assets/', AssetListView.as_view()),
]
现在访问 /api/assets/ 就可以看到返回的 JSON 数据了,支持过滤、分页、认证等功能都可以在此基础上扩展。
第五步:部署上线前的关键准备
当开发完成后,部署是另一个重要环节。以下是几个我在真实项目中遇到的问题和应对策略。
使用 Gunicorn + Nginx 部署生产环境
Gunicorn 是一个常用的 WSGI HTTP Server,适合部署 Python Web 应用。
安装 Gunicorn:
pip install gunicorn
运行:
gunicorn -w 4 asset_management.wsgi:application
但直接使用 Gunicorn 并不合适,通常我们会配合 Nginx 做反向代理,好处包括:
- 更好的静态文件处理;
- 负载均衡;
- 请求过滤(例如限流、SSL 终止);
配置示例(Nginx):
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /static/ {
alias /path/to/staticfiles/;
}
}
设置安全措施
上线之前,务必检查以下几点:
- Debug 模式关闭:
DEBUG=False - 设置
ALLOWED_HOSTS,防止 Host 头攻击 - 使用 HTTPS(Let's Encrypt 免费证书)
- 设置 CSRF 和 Session Cookie 的安全属性
还有个小技巧:在生产环境中开启缓存中间件也能提升响应速度。
数据库优化建议
- 使用 PostgreSQL 替代 SQLite(尤其在并发高时)
- 为常用查询字段建立索引
- 定期清理无效数据
- 做好备份策略(可以用 django-dbbackup 工具)
开发感悟与总结
通过这个项目,我总结出几点经验:
- Django 的优势在于开发效率和生态完善。对于中小项目来说,它能帮助我们快速上手,节省大量时间。
- 架构要提前规划。不要等做到一半才发现模型设计不合理。我曾经因为没考虑权限粒度,导致后期重构花了很多精力。
- 性能优化不能忽视。即使是一个简单的 CRUD 应用,在数据量上涨之后也会面临瓶颈。分页、缓存、异步任务这些能力都要提前布局。
- 运维要尽早介入。从部署方式、日志监控到自动发布流程,都要在开发过程中同步跟进。
写给想入门的同学的建议
- 动手实践比看文档更重要:Django 文档写得确实很好,但你不亲手敲一次代码是体会不到其中奥妙的。
- 学会借助社区力量:Stack Overflow、GitHub issues、Reddit/Django 子版块都是解决问题的好地方。
- 不要怕踩坑:每一个错误都是一次成长的机会。我在第一次部署的时候,花了半天排查到底是 Gunicorn 配置还是 Nginx 的问题。
- 逐步加入工程规范:项目初期可以不那么严格,但一旦进入团队协作阶段,就要引入 Git、单元测试、CI/CD 流程等标准工程实践。
结语:Python 与 Django 的未来趋势
如今,Django 不仅在中小型项目中依然占据主流地位,在大型系统中也有越来越多的应用场景。像 Instagram 这样的超大规模平台也是基于 Django 扩展而来。
而随着 FastAPI 的崛起,很多同学也在思考是否应该转向其他框架。我的观点是:Django 在通用业务系统上的竞争力仍然很强,尤其是在企业级应用、CMS、CRM 这一类场景中依旧不可替代。
当然,技术没有绝对的好坏,关键是根据项目需求合理选择工具。希望这篇分享能够帮助你少走弯路,顺利踏上 Django 的旅程。

评论 0