Django Web 框架实战指南
Django 是一个开源的 Python Web 框架,遵循 MVC(Model-View-Controller)架构,提供了完整的 Web 开发解决方案。它内置了数据库操作、表单处理、用户认证和权限管理等功能,非常适合快速构建安全、可扩展的后端服务。
为什么选择 Django
在实际开发中,我们往往需要兼顾开发效率和系统安全性。Django 的优势在于:
- 快速开发:丰富的 ORM、模板引擎和表单组件能大幅减少重复代码。
- 安全性强:内置 CSRF 保护、XSS 防护和 SQL 注入防御机制。
- 生态完善:支持插件化扩展,拥有大量成熟的第三方库。
环境准备
确保已安装 Python 环境,然后通过 pip 安装 Django:
pip install django
项目初始化与结构
创建一个新项目后,目录结构大致如下。理解这个结构对于后续维护至关重要。
myproject/
├── manage.py
├── myapp/
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations/
│ ├── models.py
│ ├── tests.py
│ └── views.py
└── myproject/
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py
└── wsgi.py
使用 django-admin startproject 创建项目,再用 python manage.py startapp 创建应用模块。在 settings.py 中注册你的应用是启动的第一步。
模型定义与数据库迁移
模型层负责数据持久化。以产品管理为例,我们需要定义产品表和分类表。
# myapp/models.py
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
description = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
修改模型后,记得执行迁移命令来同步数据库:
python manage.py makemigrations
python manage.py migrate
视图与业务逻辑
视图函数处理请求并返回响应。为了保持代码整洁,我们通常将业务逻辑封装在视图中,利用 Django 的 render 和 get_object_or_404 简化流程。
# myapp/views.py
from django.shortcuts import render, get_object_or_404, redirect
from myapp.models import Product, Category
from myapp.forms import ProductForm, CategoryForm
from django.contrib.auth.decorators import login_required
def product_list(request):
search_query = request.GET.get('search', '')
products = Product.objects.filter(name__icontains=search_query)
return render(request, 'myapp/product_list.html', {'products': products, 'search_query': search_query})
@login_required
def product_create(request):
if request.method == 'POST':
form = ProductForm(request.POST)
if form.is_valid():
form.save()
return redirect('product_list')
else:
form = ProductForm()
return render(request, 'myapp/product_form.html', {'form': form})
注意 @login_required 装饰器,它能自动拦截未登录用户的访问,这是实现权限控制最简单的方式。
表单处理
Django 的 ModelForm 能自动生成基于模型的表单,极大减少了 HTML 输入框的编写工作。
# myapp/forms.py
from django import forms
from myapp.models import Product, Category
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ['name', 'price', 'description', 'category']
在视图中实例化表单时,根据请求方法(GET 或 POST)决定是展示空表单还是验证提交的数据。
模板渲染
模板层负责展示。我们使用 Django 模板语言结合 Bootstrap 来实现响应式界面。
<!-- myapp/templates/myapp/base.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>{% block title %}产品管理系统{% endblock %}</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="{% url 'product_list' %}">产品管理系统</a>
</nav>
<div class="container mt-4"> {% block content %}{% endblock %} </div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
通过 {% extends %} 继承基础布局,子模板只需关注具体内容的填充,这样能避免重复编写导航栏和页脚。
路由配置
URL 映射将请求分发到对应的视图函数。应用级和项目级的路由需要分别配置。
# myapp/urls.py
from django.urls import path
from myapp import views
urlpatterns = [
path('', views.product_list, name='product_list'),
path('product/create/', views.product_create, name='product_create'),
# ... 其他路径
]
在项目根目录的 urls.py 中包含应用路由:
# myproject/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')),
]
用户认证与静态文件
Django 自带强大的认证系统。在 settings.py 中启用相关中间件和应用后,即可直接使用登录、登出功能。
# myproject/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
静态文件(如 CSS、JS)需单独配置,以便在生产环境中正确加载。
实战总结
通过上述步骤,我们完成了一个具备增删改查、分类管理及搜索功能的产品管理系统。核心要点包括:
- 模型设计:合理定义外键关系,确保数据完整性。
- 视图逻辑:利用装饰器控制权限,分离 GET/POST 请求处理。
- 前端交互:结合 Bootstrap 提升用户体验,使用模板继承复用代码。
- 安全机制:开启 CSRF 保护,使用参数化查询防止注入。
实际开发中,建议多参考官方文档,针对具体业务场景调整模型和视图。掌握这些基础后,构建更复杂的 Web 应用将变得轻松许多。


