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