一尘不染

例外:从请求的数据流读取后,您将无法访问正文

django

在我的应用程序中,有时会通过表单发送数据,有时还会通过原始数据(例如json)发送数据。有什么办法可以编写像这样的不会失败的函数?

def get_post_var(request, name):
    result = request.POST.get(name)
    if result:
        return result

    post_body = dict(urlparse.parse_qsl(request.body))
    result = post_body.get(name)
    if result:
        return result

    return None

阅读 346

收藏
2020-03-31

共1个答案

一尘不染

You cannot access body after reading from request's data stream如果(1)该请求方法为POST,(2)在中间件中的任一process_request或中,process_view并且(3)在视图功能内request.body被访问,则该请求的POST词典在中间件中访问时,将在请求上触发错误。即使错误的真正原因是(2),也会在(3)上引发错误。

为了解决该错误,你需要检查中间件访问的位置,request.POST并对其进行修改,以使其不再访问request.POST

Django文档说中间件不应该访问request.POST,这是忽略该建议的结果之一。

另请查看有关问题的Django票证,其中包括注释:

[m]点击request.POST的中间件(通常)应视为错误。这意味着该视图将无法设置任何自定义上传处理程序,执行请求正文的自定义解析或在接受文件上传之前强制执行权限检查。

2020-03-31