【问题标题】:Does Django's csrf_exempt decorator remove all POST data?Django 的 csrf_exempt 装饰器会删除所有 POST 数据吗?
【发布时间】:2018-12-29 13:43:17
【问题描述】:

我有一个 Django 视图,它返回一个对象列表,或者允许你在 POST 时创建一个...

@csrf_exempt
def quantities(request):
    if request.method == "POST":
        kwargs = {**request.POST}
        print(request.POST)
        quantity = Quantity.objects.create(**kwargs)
        return JsonResponse({"quantity": f"/quantities/{quantity.id}/"})
    return JsonResponse([], safe=False)

如果它收到一个 GET 请求,它会返回一个数量列表(代码未显示),这可以正常工作,如果它收到一个 POST 请求,它会使用 POST 数据来创建一个新数量。 (我知道 DRF 会为您完成所有这些工作,但对于我的第一个 API,我想尝试手动完成 - 您只会更好地理解它。)

无论如何,在我的测试中,我使用请求来检查这个是否有效......

response = requests.post(
 self.live_server_url + f"/quantities/", data={
  "name": "Height", "units": "m", "description": "Human Height"
 }
)

这不起作用 - 它不传递任何数据。上面视图中的print 语句只打印<QueryDict: {}>。由于某种原因,我在请求中放入的 POST 数据在它通过所有中间件并到达视图时已经从请求中消失了。

我唯一能想到的是 @csrf_exempt 装饰器正在删除 POST 数据,但我无法想象为什么。我查看了它的源代码,它似乎没有这样做,但我无法检查,因为删除装饰器意味着视图只返回 403 响应。

我的 POST 数据去哪儿了?

【问题讨论】:

  • 我看不出这段代码有什么问题,所以我几乎把你的代码复制粘贴到我的一个项目中,它按预期工作。如果您怀疑这是罪魁祸首,您可以删除所有中间件。
  • 感谢您的尝试!最后是我的请求标头有问题,而不是我怀疑的中间件。

标签: python django post python-requests django-csrf


【解决方案1】:

@phenicie 评论是正确的。

当使用 csrf 时,除了发布 Json 数据,您必须以不同的方式在后端检索它...而不是更改帖子上的内容类型(更改为不准确的内容类型),您会得到 request.body 而不是 request.POST .

data = json.loads(request.body) name = data['name']

【讨论】:

    【解决方案2】:

    事实证明,由于某种原因,我的请求有一个标头"Content-Type": "application/json",这使得 Django 没有从请求正文创建一个 POST 字典。我不知道为什么,但删除该标题解决了这个问题。

    【讨论】:

    • 发布 Json 数据时,您必须以不同的方式在后端检索它...而不是更改帖子上的内容类型(更改为不准确的内容类型),您会得到 request.body 而不是 request。邮政。 data = json.loads(request.body)name = data['name']
    猜你喜欢
    • 2015-09-03
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2019-02-24
    • 2014-07-19
    • 2020-02-06
    • 2018-02-08
    • 2015-11-18
    相关资源
    最近更新 更多