Django的csrf_exempt装饰器会删除所有POST数据吗?

时间:2018-12-29 13:43:17

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

我有一个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数据要去哪里?

2 个答案:

答案 0 :(得分:0)

因此,事实证明,由于某种原因,我的请求具有标头"Content-Type": "application/json"使得Django无法从请求主体创建POST字典。我不知道为什么,但是删除该标头可以解决此问题。

答案 1 :(得分:0)

@phenicie评论是正确的。

在使用csrf时,除发布Json数据外,您必须在后端上以其他方式进行检索...而不是更改帖子中的内容类型(更改为不准确的内容类型),而是获得request.body而不是request.POST

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