Django:全栈 Web 框架 (Django: Full-Stack Web Framework)


章节概述

Django 是 Python 最流行的全栈 Web 框架,自带 ORM、模板引擎、Admin 后台、认证系统、表单处理等全套组件。与 Flask 的”微框架”哲学不同,Django 采用”batteries included”策略——开箱即用,适合快速开发内容驱动型网站(CMS、电商、社交平台)。

C 程序员视角:Django 之于 Web,就像 Qt 之于 GUI——框架替你处理了大量底层细节(HTTP 协议、数据库连接池、CSRF 防护、SQL 注入防护),你只需关注业务逻辑。


1. 安装与项目创建

# 安装 Django
pip install django
 
# 创建项目
django-admin startproject mysite
cd mysite
 
# 项目结构
mysite/
├── manage.py          # 管理脚本(类似 Makefile)
├── mysite/
   ├── __init__.py
   ├── settings.py    # 全局配置
   ├── urls.py        # URL 路由
   ├── asgi.py        # ASGI 入口
   └── wsgi.py        # WSGI 入口
# 启动开发服务器
python manage.py runserver
# 默认 http://127.0.0.1:8000/
 
# 创建应用(app)
python manage.py startapp blog

2. MTV 架构

Django 使用 MTV(Model-Template-View)模式:

请求 → URL 路由 → View(逻辑) → Model(数据) → Template(渲染)
组件职责类比 C
Model数据库表映射struct + SQL
TemplateHTML 模板渲染printf 格式化输出
View请求处理逻辑main() 中的请求分发
URLURL → View 映射switch-case 路由

3. Model:ORM 数据库操作

# blog/models.py
from django.db import models
 
class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    published = models.BooleanField(default=False)
 
    class Meta:
        ordering = ['-created_at']
 
    def __str__(self):
        return self.title
# 生成迁移文件
python manage.py makemigrations
 
# 执行迁移(创建表)
python manage.py migrate
 
# 创建超级用户(Admin 登录用)
python manage.py createsuperuser
# Django Shell 操作数据(python manage.py shell)
from blog.models import Post
 
# 创建
Post.objects.create(title="Hello", content="World")
 
# 查询
Post.objects.filter(published=True)
Post.objects.get(id=1)
 
# 更新
post = Post.objects.get(id=1)
post.published = True
post.save()
 
# 删除
post.delete()

4. View:请求处理

# blog/views.py
from django.http import JsonResponse
from django.shortcuts import render, get_object_or_404
from .models import Post
 
# 函数视图
def post_list(request):
    posts = Post.objects.filter(published=True)
    return render(request, 'blog/post_list.html', {'posts': posts})
 
def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    return render(request, 'blog/post_detail.html', {'post': post})
 
# API 视图(返回 JSON)
def post_api(request):
    posts = list(Post.objects.values('id', 'title', 'content'))
    return JsonResponse({'posts': posts})

5. URL 路由

# mysite/urls.py
from django.contrib import admin
from django.urls import path, include
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),
]
# blog/urls.py
from django.urls import path
from . import views
 
urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('post/<int:pk>/', views.post_detail, name='post_detail'),
    path('api/posts/', views.post_api, name='post_api'),
]

6. Template 模板

<!-- blog/templates/blog/post_list.html -->
<!DOCTYPE html>
<html>
<head><title>博客</title></head>
<body>
    <h1>文章列表</h1>
    {% for post in posts %}
    <article>
        <h2><a href="{% url 'post_detail' post.pk %}">{{ post.title }}</a></h2>
        <p>{{ post.content|truncatewords:30 }}</p>
        <time>{{ post.created_at|date:"Y-m-d" }}</time>
    </article>
    {% endfor %}
</body>
</html>

7. Admin 后台

# blog/admin.py
from django.contrib import admin
from .models import Post
 
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'created_at', 'published')
    list_filter = ('published', 'created_at')
    search_fields = ('title', 'content')

访问 http://127.0.0.1:8000/admin/ 即可管理所有数据。


8. 表单与 CSRF

# blog/forms.py
from django import forms
from .models import Post
 
class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'content', 'published']
<!-- 模板中使用表单 -->
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">发布</button>
</form>

Django 自动处理 CSRF token,无需手动管理——这是相比 Flask 的安全优势。


9. Django REST Framework(DRF)

pip install djangorestframework
# blog/serializers.py
from rest_framework import serializers
from .models import Post
 
class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'
# blog/views.py
from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer
 
class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

DRF 自动生成 RESTful API,包含序列化、分页、过滤、权限控制。


10. 与 C 程序集成

# 通过 subprocess 调用 C 程序
import subprocess
 
def run_c_program(request):
    result = subprocess.run(
        ['./my_c_program', arg1, arg2],
        capture_output=True, text=True
    )
    return JsonResponse({'output': result.stdout})
# 通过 ctypes 调用 C 共享库
import ctypes
 
lib = ctypes.CDLL('./libmylib.so')
lib.process_data.argtypes = [ctypes.c_char_p]
lib.process_data.restype = ctypes.c_int
 
def process(request):
    result = lib.process_data(b"input data")
    return JsonResponse({'result': result})

11. 部署

# 生产环境
pip install gunicorn
 
# 启动
gunicorn mysite.wsgi:application --bind 0.0.0.0:8000
 
# Nginx 反向代理配置
# location / { proxy_pass http://127.0.0.1:8000; }
# Docker 部署
# Dockerfile
FROM python:3.12
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["gunicorn", "mysite.wsgi:application", "--bind", "0.0.0.0:8000"]

12. Django vs Flask vs FastAPI

特性DjangoFlaskFastAPI
定位全栈框架微框架异步 API 框架
ORM内置需 SQLAlchemy需 SQLAlchemy
Admin内置
认证内置需扩展需扩展
模板内置 Jinja2Jinja2
异步3.1+ 支持需扩展原生
学习曲线陡峭平缓中等
适用场景CMS/电商/API小型服务/原型高性能 API

选择建议:内容驱动型网站(博客/CMS/电商)选 Django;小型微服务选 Flask;高性能异步 API 选 FastAPI。


速查卡片

需求命令
创建项目django-admin startproject mysite
创建应用python manage.py startapp blog
迁移数据库python manage.py makemigrations && python manage.py migrate
启动服务器python manage.py runserver
Django Shellpython manage.py shell
创建管理员python manage.py createsuperuser
收集静态文件python manage.py collectstatic