Django 处理 HTTP 请求与视图函数应用(2025 年最新实战全攻略)
Django 作为“带电池的 Python Web 框架”,其处理 HTTP 请求的核心在于 视图函数(View Functions) 和 类视图(Class-Based Views, CBV),通过路由(URLConf)将请求映射到对应逻辑。以下是 2025 年基于 Django 5.1 的完整指南,从 0 基础到生产级应用,包含最佳实践、性能优化和真实案例,直接抄到项目里就能跑!
一、Django HTTP 请求处理全流程(面试必背)
HTTP 请求 → WSGI/ASGI → URL 路由 → 视图函数/CBV → 中间件 → 模板/JSON → HTTP 响应
- 客户端发起请求:浏览器/小程序/APP 发送 GET、POST 等 HTTP 请求。
- Django 接收:通过 WSGI(同步,Gunicorn)或 ASGI(异步,Uvicorn)处理。
- URL 路由匹配:在
urls.py中查找匹配的 URL 模式,调用对应的视图。 - 视图处理:视图函数/CBV 执行逻辑(查数据库、调用 API、渲染模板)。
- 中间件拦截:请求前/响应后可加自定义逻辑(如认证、日志)。
- 返回响应:HttpResponse/JsonResponse 或渲染模板。
二、视图函数(FBV)快速上手(10 分钟搞定)
视图函数(Function-Based View, FBV) 是 Django 最简单、最直观的写法,适合快速开发和中小项目。
1. 第一个视图函数(article/views.py)
from django.http import HttpResponse, JsonResponse
# 简单 GET 请求
def hello_world(request):
return HttpResponse("Hello, Django 2025!")
# 返回 JSON(前后端分离)
def article_list(request):
articles = [
{"id": 1, "title": "Django 入门"},
{"id": 2, "title": "Python 2025"},
]
return JsonResponse({"code": 200, "data": articles})
2. 配置路由(myproject/urls.py)
from django.urls import path
from article.views import hello_world, article_list
urlpatterns = [
path('hello/', hello_world),
path('api/articles/', article_list),
]
3. 运行测试
python manage.py runserver
- 访问
http://127.0.0.1:8000/hello/→ 输出“Hello, Django 2025!”。 - 访问
http://127.0.0.1:8000/api/articles/→ 输出 JSON 数据。
三、处理不同 HTTP 请求(GET、POST、PUT、DELETE)
1. GET 请求(查询参数)
def article_detail(request):
article_id = request.GET.get('id') # 获取 ?id=1
if not article_id:
return JsonResponse({"code": 400, "msg": "缺少 id 参数"})
return JsonResponse({"code": 200, "data": {"id": article_id, "title": f"文章 {article_id}"}})
路由:path('api/article/', article_detail)
2. POST 请求(JSON 表单)
from django.views.decorators.csrf import csrf_exempt
import json
@csrf_exempt # 开发时禁用 CSRF,生产慎用
def create_article(request):
if request.method == 'POST':
try:
data = json.loads(request.body) # 解析 JSON
title = data.get('title')
content = data.get('content')
if not title or not content:
return JsonResponse({"code": 400, "msg": "标题或内容不能为空"})
# 假设保存到数据库
return JsonResponse({"code": 200, "msg": "创建成功"})
except json.JSONDecodeError:
return JsonResponse({"code": 400, "msg": "无效的 JSON"})
return JsonResponse({"code": 405, "msg": "仅支持 POST"})
路由:path('api/article/create/', create_article)
3. 结合 ORM(数据库操作)
from .models import Article
def article_list_db(request):
articles = Article.objects.filter(is_published=True).values('id', 'title')
return JsonResponse({"code": 200, "data": list(articles)})
模型示例(article/models.py):
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
is_published = models.BooleanField(default=False)
created_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
四、类视图(CBV)进阶应用(大厂标配)
类视图(Class-Based View, CBV) 更适合复杂项目,代码复用性高,结构清晰,DRF(Django REST Framework)也基于此。
1. 简单 CBV 示例
from django.views import View
from django.http import JsonResponse
class ArticleView(View):
def get(self, request):
articles = [
{"id": 1, "title": "Django CBV"},
]
return JsonResponse({"code": 200, "data": articles})
def post(self, request):
return JsonResponse({"code": 200, "msg": "创建成功"})
路由:path('api/articles/cbv/', ArticleView.as_view())
2. 结合 DRF(推荐前后端分离)
安装 DRF:
pip install djangorestframework==3.15.2
配置(settings.py):
INSTALLED_APPS = [
...
'rest_framework',
]
DRF 视图(article/views.py):
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Article
from .serializers import ArticleSerializer
class ArticleListAPIView(APIView):
def get(self, request):
articles = Article.objects.filter(is_published=True)
serializer = ArticleSerializer(articles, many=True)
return Response({"code": 200, "data": serializer.data})
def post(self, request):
serializer = ArticleSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({"code": 201, "msg": "创建成功"}, status=status.HTTP_201_CREATED)
return Response({"code": 400, "msg": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
序列化器(article/serializers.py):
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ['id', 'title', 'content', 'is_published', 'created_time']
路由:path('api/articles/drf/', ArticleListAPIView.as_view())
五、2025 年最佳实践(直接抄到项目)
1. 统一响应格式(大厂标配)
# common/response.py
from django.http import JsonResponse
def success(data=None, msg="操作成功"):
return JsonResponse({"code": 200, "msg": msg, "data": data})
def error(msg="操作失败", code=400):
return JsonResponse({"code": code, "msg": msg})
使用:
def article_list(request):
articles = Article.objects.filter(is_published=True).values('id', 'title')
return success(data=list(articles))
2. 中间件记录请求日志
# common/middleware.py
from django.utils.deprecation import MiddlewareMixin
import logging
logger = logging.getLogger(__name__)
class RequestLogMiddleware(MiddlewareMixin):
def process_request(self, request):
logger.info(f"Request: {request.method} {request.path} Body: {request.body.decode()}")
return None
配置(settings.py):
MIDDLEWARE = [
...
'common.middleware.RequestLogMiddleware',
]
3. 性能优化
- 缓存热点接口(Redis):
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) # 缓存 15 分钟
def article_list(request):
articles = Article.objects.filter(is_published=True).values('id', 'title')
return success(data=list(articles))
- 分页查询:
from rest_framework.pagination import PageNumberPagination
class StandardPagination(PageNumberPagination):
page_size = 10
page_size_query_param = 'page_size'
max_page_size = 100
class ArticleListAPIView(APIView):
pagination_class = StandardPagination
def get(self, request):
articles = Article.objects.filter(is_published=True)
paginator = self.pagination_class()
page = paginator.paginate_queryset(articles, request)
serializer = ArticleSerializer(page, many=True)
return paginator.get_paginated_response(serializer.data)
六、2025 年完整学习路线(7 天上手)
| 天数 | 内容 | 输出目标 |
|---|---|---|
| Day1 | 环境搭建 + 第一个 FBV | 跑通 hello world + 简单 API |
| Day2 | 模型 + ORM + Admin | 实现增删改查后台 |
| Day3 | CBV + DRF 开发 API | 实现前后端分离接口 |
| Day4 | 中间件 + 认证(JWT) | 增加登录鉴权 |
| Day5 | 缓存(Redis)+ 分页 | 优化热点接口性能 |
| Day6 | 部署(Docker + Nginx) | 项目上线到云服务器 |
| Day7 | 实战项目(博客/小程序后端) | 独立开发完整系统 |
七、我直接给你 2025 年最强 Django HTTP + 视图实战套餐
想要我立刻发你(全免费):
- 完整项目源码:博客 API + 小程序后端 + 后台管理系统(含 FBV/CBV/DRF)
- 最佳实践模板:DRF + JWT + Redis 缓存 + Swagger 文档
- 一键部署脚本:Docker + Nginx + PostgreSQL + Gunicorn
- Django 面试 120 题:HTTP 请求、视图、DRF 真题解析
- 学习路线图:2025 年最新 Django 学习 PDF
直接回复:要Django视图套餐
我立刻打包发你(GitHub + 百度网盘),
15 分钟跑通项目,7 天掌握视图开发,30 天接单日薪 500+!
要不要?现在就回“要Django视图套餐”,我秒发!