You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中间件中处理POST数据?解决请求体不可重复读取问题

解决Django中间件无法重复读取POST请求体的问题

这个问题我做Django项目时也踩过同款坑——Django的请求体流默认只能读取一次,视图通过get_response处理请求时已经把流的指针移到了末尾,之后再读自然拿不到内容。不过不用挨个改视图,有几个全局处理的靠谱办法:

方法一:视图处理前读取并重置请求体

核心思路是在调用get_response之前先把请求体读出来处理,然后重新封装成可读取的流,让后续视图还能正常获取内容。代码示例:

from io import BytesIO
class MyMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, req):
        # 只处理POST/PUT/PATCH这类带请求体的请求
        if req.method in ('POST', 'PUT', 'PATCH'):
            # 读取原始请求体内容
            body_content = req.body
            # 这里写你要处理请求体的逻辑,比如解析、日志记录等
            print("处理后的请求体:", body_content)
            
            # 把请求体重新封装成可重复读取的流
            req.body = BytesIO(body_content)
        
        # 继续把请求传给视图处理
        response = self.get_response(req)
        return response

方法二:读取后直接重置流指针

更简洁的方式是用req.read()读取内容,然后调用req.seek(0)把流指针移回开头,后续代码就能再次读取请求体了:

class MyMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, req):
        if req.method in ('POST', 'PUT', 'PATCH'):
            # 读取请求体内容
            body_content = req.read()
            # 执行你的业务处理逻辑
            print("请求体原始内容:", body_content)
            # 重置流指针到起始位置
            req.seek(0)
        
        response = self.get_response(req)
        return response

几个要注意的点

  • 一定要判断请求方法,GET请求没有请求体,直接读取会报错
  • 如果请求体特别大,一次性读取可能占用较多内存,这种场景可以考虑分块读取处理
  • 别等到get_response之后再处理请求体,此时视图已经消费过流,就算重置指针也可能失效

内容的提问来源于stack exchange,提问作者hylowaker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 10:47:27