对于Python后端开发而言,主流的高效框架主要有 Django、Flask 和 FastAPI。本文将重点介绍功能最为全面的 Django 框架,通过一个完整的实战项目,带你快速掌握其核心开发流程。
Django 是一个免费开源的高级 Python Web 应用框架,其设计哲学鼓励快速开发和干净、实用的代码。它由经验丰富的开发者构建,处理了Web开发中的大量繁重工作,让你能够专注于编写应用本身,而非重复造轮子。
Django 核心特性
1. 架构模式
- 遵循 MTV(模型-模板-视图)模式,是经典 MVC 架构的一种变体。
- Model:负责数据结构与数据库交互。
- View:处理业务逻辑。
- Template:定义前端展示层。
- 强调 DRY(Don‘t Repeat Yourself)原则,最大化减少重复代码。
2. 功能优势
- 强大的内置 ORM,让数据库操作如同操作Python对象。
- 灵活的模板引擎。
- 开箱即用的自动化管理后台。
- 清晰强大的 URL 路由配置。
- 完整的表单处理与验证系统。
- 内置安全防护(如 CSRF、XSS 防护)。
- 国际化与本地化支持。
- 高度可扩展的中间件系统。
安装 Django
在开始之前,强烈建议使用虚拟环境来管理项目依赖。
# 创建并激活虚拟环境
python -m venv myenv
source myenv/bin/activate # Linux/macOS
myenv\Scripts\activate # Windows
# 安装 Django
pip install django
# 验证安装
django-admin --version
项目创建与基础配置
1. 创建项目
使用 Django 命令行工具初始化一个新项目。
django-admin startproject myproject
cd myproject
2. 项目结构解析
生成的项目结构如下:
myproject/
├── manage.py # 项目管理命令行工具
└── myproject/ # 项目主目录(Python包)
├── __init__.py
├── settings.py # 项目全局配置文件
├── urls.py # 项目主URL路由声明文件
├── asgi.py # ASGI服务器入口
└── wsgi.py # WSGI服务器入口
3. 关键配置 (settings.py)
以下是一些必须了解和配置的关键项:
# 安全警告:生产环境必须关闭调试模式!
DEBUG = False
# 允许访问的主机/域名列表
ALLOWED_HOSTS = ['yourdomain.com', 'localhost']
# 已安装的应用列表,自定义应用需添加在此
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp', # 你的自定义应用
]
# 数据库配置,默认使用 SQLite,可轻松替换为 MySQL/PostgreSQL 等
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# 时区与语言设置
TIME_ZONE = 'Asia/Shanghai'
# 静态文件URL和收集目录
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles' # 生产环境静态文件收集目标
创建应用(App)
在 Django 中,一个项目由多个应用组成,每个应用负责一个特定的功能模块。
python manage.py startapp myapp
一个典型的应用目录结构如下:
myapp/
├── migrations/ # 数据库迁移文件目录
├── admin.py # 管理后台模型注册文件
├── apps.py # 应用配置
├── models.py # 数据模型定义文件
├── tests.py # 单元测试文件
└── views.py # 视图函数/类视图文件
实战示例:构建一个简易民意调查系统
我们将通过创建一个“polls”(投票)应用,来串联 Django 的核心组件。
1. 创建应用
python manage.py startapp polls
记得将 'polls' 添加到 settings.py 的 INSTALLED_APPS 列表中。
2. 定义数据模型 (polls/models.py)
模型是数据的蓝图,Django 的 ORM 会据此在数据库中创建表。
import datetime
from django.db import models
from django.utils import timezone
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def was_published_recently(self):
now = timezone.now()
return now - datetime.timedelta(days=1) <= self.pub_date <= now
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
3. 激活模型(生成并应用迁移)
# 根据模型变化创建迁移文件
python manage.py makemigrations polls
# 将迁移应用到数据库
python manage.py migrate
4. 创建视图 (polls/views.py)
视图负责处理业务逻辑。这里使用 Django 强大的通用类视图(Class-Based Views)。
from django.views import generic
from .models import Choice, Question
from django.utils import timezone
class IndexView(generic.ListView):
template_name = 'polls/index.html'
context_object_name = 'latest_question_list'
def get_queryset(self):
"""返回最近发布的5个问题(不包括未来的问题)。"""
return Question.objects.filter(
pub_date__lte=timezone.now()
).order_by('-pub_date')[:5]
class DetailView(generic.DetailView):
model = Question
template_name = 'polls/detail.html'
def get_queryset(self):
"""确保未发布的问题无法被查看。"""
return Question.objects.filter(pub_date__lte=timezone.now())
class ResultsView(generic.DetailView):
model = Question
template_name = 'polls/results.html'
5. 配置 URL 路由 (polls/urls.py)
为应用创建独立的 URL 配置,并在项目主 urls.py 中包含它。
# polls/urls.py
from django.urls import path
from . import views
app_name = 'polls' # 命名空间,防止URL名称冲突
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
path('<int:question_id>/vote/', views.vote, name='vote'),
]
# myproject/urls.py (项目主路由)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('polls/', include('polls.urls')), # 包含应用的路由
]
6. 创建模板 (polls/templates/polls/index.html)
模板用于定义前端HTML。Django 模板语言 (DTL) 简单而强大。
{% load static %}
<link rel="stylesheet" href="{% static 'polls/style.css' %}">
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
7. 注册模型到管理后台 (polls/admin.py)
Django 自动生成功能强大的管理后台,只需简单注册模型即可。
from django.contrib import admin
from .models import Question, Choice
admin.site.register(Question)
admin.site.register(Choice)
8. 创建超级用户并运行服务
# 创建管理员账号
python manage.py createsuperuser
# 启动开发服务器
python manage.py runserver
现在,你可以访问以下地址:
- 投票应用首页:
http://localhost:8000/polls/

- 自动化管理后台:
http://localhost:8000/admin/

Django 管理后台自带完整的用户认证和权限管理系统,对于开发前后端一体的内部管理系统或小型项目,能极大提升开发效率。


进阶开发与生产部署要点
关键注意事项
- 安全配置
- 生产环境务必设置
DEBUG = False。
- 正确配置
ALLOWED_HOSTS。
- 使用
python manage.py check --deploy 进行部署前安全检查。
- 静态/媒体文件处理
- 开发时使用
STATICFILES_DIRS。
- 生产时运行
python manage.py collectstatic 收集文件,并由 Nginx/Apache 等 Web 服务器直接托管。
- 数据库优化
- 善用
select_related() 和 prefetch_related() 减少查询次数。
- 避免在循环中进行数据库查询。
- 使用 Django Debug Toolbar 进行性能分析。
- 迁移文件管理
- 迁移文件需纳入版本控制 (如 Git)。
- 团队协作时,避免直接编辑已生成的迁移文件。
实用开发技巧
-
环境变量管理
使用 python-dotenv 等工具管理敏感配置。
from dotenv import load_dotenv
import os
load_dotenv()
SECRET_KEY = os.getenv('SECRET_KEY')
-
高效查询
# 批量创建
Post.objects.bulk_create([...])
# 仅获取必需字段
Post.objects.only('title', 'created_at')
# 使用 F() 表达式避免竞态条件
from django.db.models import F
Post.objects.filter(id=1).update(views=F('views') + 1)
-
缓存策略
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) # 缓存15分钟
def my_view(request):
...
生产部署建议
-
典型架构
Nginx (反向代理/静态文件)
⇅
Gunicorn 或 uWSGI (应用服务器)
⇅
Django
⇅
PostgreSQL / MySQL
-
关键命令
# 收集静态文件
python manage.py collectstatic --noinput
# 使用 Gunicorn 启动
gunicorn --workers 3 myproject.wsgi:application
-
性能与监控
- 集成
django-silk 进行请求性能分析。
- 使用
django-prometheus 暴露监控指标。
- 配置完善的日志记录。
-
安全加固
- 设置
SECURE_HSTS_SECONDS 启用 HSTS。
- 配置
CSRF_COOKIE_SECURE 和 SESSION_COOKIE_SECURE 为 True (HTTPS环境下)。
- 考虑使用
django-csp 添加内容安全策略头。
通过以上步骤,你不仅能够快速搭建起一个 Django 项目,还能了解其核心工作流程和最佳实践。Django “开箱即用”的特性与高度的可定制性,使其能够优雅地支撑从快速原型到复杂企业级应用的各类场景。