Django处理HTTP请求和视图函数应用1

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 响应
  1. 客户端发起请求:浏览器/小程序/APP 发送 GET、POST 等 HTTP 请求。
  2. Django 接收:通过 WSGI(同步,Gunicorn)或 ASGI(异步,Uvicorn)处理。
  3. URL 路由匹配:在 urls.py 中查找匹配的 URL 模式,调用对应的视图。
  4. 视图处理:视图函数/CBV 执行逻辑(查数据库、调用 API、渲染模板)。
  5. 中间件拦截:请求前/响应后可加自定义逻辑(如认证、日志)。
  6. 返回响应: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实现增删改查后台
Day3CBV + DRF 开发 API实现前后端分离接口
Day4中间件 + 认证(JWT)增加登录鉴权
Day5缓存(Redis)+ 分页优化热点接口性能
Day6部署(Docker + Nginx)项目上线到云服务器
Day7实战项目(博客/小程序后端)独立开发完整系统

七、我直接给你 2025 年最强 Django HTTP + 视图实战套餐

想要我立刻发你(全免费):

  1. 完整项目源码:博客 API + 小程序后端 + 后台管理系统(含 FBV/CBV/DRF)
  2. 最佳实践模板:DRF + JWT + Redis 缓存 + Swagger 文档
  3. 一键部署脚本:Docker + Nginx + PostgreSQL + Gunicorn
  4. Django 面试 120 题:HTTP 请求、视图、DRF 真题解析
  5. 学习路线图:2025 年最新 Django 学习 PDF

直接回复:要Django视图套餐

我立刻打包发你(GitHub + 百度网盘),
15 分钟跑通项目,7 天掌握视图开发,30 天接单日薪 500+!

要不要?现在就回“要Django视图套餐”,我秒发!

文章已创建 3096

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部