Django入门教程:搭建你的第一个Python网站
从零到上线:我的第一个 Django 网站实战记录

引言:为什么要写这篇教程?
去年我刚从 Java 转型 Python,公司接了个小型项目,需要快速搭建一个内部管理系统。客户要求功能不复杂但要快,考虑到我之前对 Django 有点了解,决定尝试用它来开发。
这是我第一次真正使用 Django 完整地构建一个网站,过程中遇到了不少坑,也积累了不少经验。今天我想以一个“老程序员”的视角,和大家分享这段真实的经历,讲讲我是怎么一步步把一个空目录变成可以上线的网站的。
这篇文章会从实际项目背景出发,带你一步步搭建你的第一个 Django 网站,同时穿插我在开发中踩过的坑和解决方案。如果你是刚入门 Django 的开发者,或者想系统性学习 Web 开发的朋友,相信你一定能在这篇文章里找到一些共鸣。
项目背景:一个简单的员工管理系统
项目目标很明确:我们要为一家小型企业搭建一个内部使用的员工信息管理系统。需求如下:
- 员工信息管理(增删改查)
- 支持部门分类
- 搜索、分页展示
- 后台管理员可以登录管理内容
- 对外提供接口供移动端调用
当时团队只有我和一名前端实习生,时间两周。我们决定采用前后端分离的架构,后端使用 Django + DRF(Django REST Framework)搭建 API,前端用 Vue.js 实现界面渲染。
接下来我就结合这个项目的开发过程,带大家走一遍 Django 的入门流程,并分享真实场景中的实践经验。
第一步:初始化 Django 项目
安装与环境搭建
我习惯用虚拟环境隔离依赖,所以第一步就是创建 Python 虚拟环境:
python3 -m venv venv
source venv/bin/activate
pip install django djangorestframework
然后用 startproject 初始化项目结构:
django-admin startproject employee_system .
这时会生成如下的项目结构:
employee_system/
├── manage.py
└── employee_system/
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
数据库配置
打开 settings.py 文件,修改数据库配置。默认是 SQLite,但对于生产级应用来说不太合适。我们最终选用了 PostgreSQL:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'employee_db',
'USER': 'admin',
'PASSWORD': 'yourpassword',
'HOST': 'localhost',
'PORT': '5432',
}
}
小贴士:在开发阶段也可以先用 SQLite,等部署时再切换。不过尽早适应生产数据库有助于提前发现问题。
第二步:设计数据模型与创建 App
我们在项目下创建了一个新的 app 叫 employees:
python manage.py startapp employees
然后把这个 app 添加进 INSTALLED_APPS 中:
INSTALLED_APPS = [
...
'rest_framework',
'employees',
]
接着,在 employees/models.py 中定义模型:
from django.db import models
class Department(models.Model):
name = models.CharField(max_length=100, unique=True)
def __str__(self):
return self.name
class Employee(models.Model):
GENDER_CHOICES = (
('male', '男'),
('female', '女'),
)
name = models.CharField(max_length=100)
gender = models.CharField(max_length=10, choices=GENDER_CHOICES)
age = models.IntegerField()
department = models.ForeignKey(Department, on_delete=models.CASCADE)
email = models.EmailField(null=True, blank=True)
phone = models.CharField(max_length=20, null=True, blank=True)
def __str__(self):
return self.name
这里有几个设计上的考虑点:
- 关联关系处理:员工与部门是多对一的关系,所以用
ForeignKey。 - 字段合理性控制:比如性别使用
choices限制输入范围,年龄用IntegerField。 - 空值处理:联系方式这些非必填字段都设置
null=True, blank=True。 - 字符串友好表示:给每个模型加上
__str__()方法,方便在后台或调试时阅读。
迁移数据库
python manage.py makemigrations
python manage.py migrate
这一步很重要!很多人会忘记运行迁移导致数据库表没建好,结果卡半天不知道哪错了。建议执行完迁移到数据库手动检查一下是否真的生成了对应的表格。
第三步:编写接口 & 后台管理
创建 Admin 管理界面
Django 自带非常强大的 Admin 系统,我们可以用来快速实现管理员操作页面。
在 employees/admin.py 中注册模型:
from django.contrib import admin
from .models import Employee, Department
admin.site.register(Employee)
admin.site.register(Department)
然后创建管理员账户:
python manage.py createsuperuser
访问 /admin 页面就能看到图形化管理界面啦!
使用 DRF 构建 API 接口
我们的前端同学要用 Vue.js 来渲染页面,所以得提供 JSON 格式的 API 接口。
首先创建序列化器 employees/serializers.py:
from rest_framework import serializers
from .models import Employee, Department
class DepartmentSerializer(serializers.ModelSerializer):
class Meta:
model = Department
fields = '__all__'
class EmployeeSerializer(serializers.ModelSerializer):
department = DepartmentSerializer(read_only=True)
department_id = serializers.PrimaryKeyRelatedField(
queryset=Department.objects.all(),
source='department'
)
class Meta:
model = Employee
fields = ['id', 'name', 'gender', 'age', 'department', 'department_id', 'email', 'phone']
然后创建视图类和路由:
views.py:
from rest_framework.viewsets import ModelViewSet
from .models import Employee
from .serializers import EmployeeSerializer
class EmployeeViewSet(ModelViewSet):
queryset = Employee.objects.all()
serializer_class = EmployeeSerializer
urls.py:
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from employees.views import EmployeeViewSet
router = DefaultRouter()
router.register(r'employees', EmployeeViewSet)
urlpatterns = [
path('', include(router.urls)),
]
这样就完成了 GET / POST / PUT / DELETE 全套 RESTful 接口。
踩坑经验:刚开始的时候我直接用了
.read()方法读取整个查询集,结果并发量稍微大一点就卡死了。后来才知道应该用分页器优化,后面我会专门讲这一点。
第四步:部署上线与性能优化
项目做完后,我们要把它部署到阿里云服务器上供内网访问。这一块也是最容易出问题的地方。
部署流程概览
部署步骤大致如下:
- 安装 Nginx 做反向代理
- 用 Gunicorn 运行 Django 应用
- 用 Supervisor 管理进程
- 用 Let's Encrypt 配置 HTTPS
部署成功后的结构大概是这样的:
[User] -> [HTTPS] -> [Nginx] -> [Gunicorn] -> [Django App]
性能相关经验分享
1. 分页器的引入
最开始没有加任何限制,Employee.objects.all() 直接返回全部数据。某天测试导出了两千条员工记录,导致整个接口响应非常慢。
后来我们加入了分页支持:
from rest_framework.pagination import PageNumberPagination
class StandardResultsSetPagination(PageNumberPagination):
page_size = 20
page_size_query_param = 'page_size'
max_page_size = 100
并在 ViewSet 中指定:
class EmployeeViewSet(ModelViewSet):
pagination_class = StandardResultsSetPagination
这样前端就可以灵活控制每页显示多少条数据,大大提高了性能。
2. 缓存策略
有些部门信息几乎不会变,我们对这类只读数据做了一个 Redis 缓存策略:
from django.core.cache import cache
from .models import Department
def get_departments(request):
departments = cache.get('departments')
if not departments:
departments = list(Department.objects.all().values())
cache.set('departments', departments, timeout=60 * 60) # 缓存一小时
return Response(departments)
3. 查询优化
避免 N+1 查询是一个常见的 ORM 性能问题。比如当我们遍历所有员工并访问其所属部门时,如果不用预加载,就会发起很多次额外查询。
正确方式是在查询时使用 select_related:
Employee.objects.select_related('department').all()
这条语句会在一次 SQL 查询中完成关联,效率高了很多。
踩过的大坑 & 解决办法总结
| 问题 | 表现 | 原因 | 解决方案 |
|---|---|---|---|
| 接口响应慢 | 打开页面加载时间很长 | 查询未做分页、大量数据一次性返回 | 加入分页器,前端分页渲染 |
| 线上报错 500 | 本地没问题,线上出错 | 生产环境未启用 DEBUG,且静态资源路径配置不对 | 修改 settings.py 中 STATIC_ROOT 并运行 collectstatic |
| 登录后台失败 | 输入正确账号密码也提示错误 | 数据库未同步 | 执行 python manage.py migrate && createsuperuser |
| 字段更新无效 | 提交后字段值没变化 | Serializer 没有 properly 设置 source 或 read_only | 检查字段映射,适当使用 update() 方法自定义逻辑 |
最终效果与收益评估
项目按时上线,整体运行稳定。前端同学对接 API 也很顺利。管理员通过后台管理界面每天维护员工信息,系统响应良好,高峰期也没有出现明显延迟。
技术收益总结
- Django 的开发效率很高:特别是自带的 Admin 和 ORM 系统节省了大量重复工作。
- DRF 是个宝藏:RESTful 接口写起来非常简单,扩展性强。
- 性能优化必须提前规划:分页、缓存、连接池这些措施越早加入越好。
- 部署不能马虎:尤其是静态资源管理和权限控制,容易引发安全问题。
给新手的一些建议
- 不要一开始就把注意力放在框架细节上,先理解 MVC 的基本结构。
- 学会看官方文档,Django 文档虽然啰嗦但非常权威,遇到问题优先查阅。
- 保持代码整洁,特别是模型和视图解耦要做好,否则后期维护很痛苦。
- 多动手实践,网上教程可以跟着敲一遍,更重要的是自己独立做一个完整的项目。
- 重视日志和监控,哪怕是小型项目也要养成记录错误日志的习惯。
写在最后:成长比速度更重要
回想当初接手这个项目的时候,我对 Django 的认识还停留在“听说挺厉害”的阶段。现在再回头看,Django 不仅帮助我快速实现了客户需求,也在不断教会我如何更好地组织代码结构、设计数据库、提升性能。
技术这条路没有捷径,只有不断地练、不断地犯错、不断地总结才会进步。希望你能从我的这段经历中学到一些东西,少走些弯路。
如果你正在学习 Django 或者正准备迈出第一步,别犹豫,去动手做一个属于自己的项目吧。哪怕只是一个简陋的小网站,那也会是你走向专业的第一步。
祝你好运!

评论 0