python - Django 的 csrf_exempt 装饰器会删除所有 POST 数据吗?
问题描述
我有一个 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 数据去哪儿了?
解决方案
@phenicie 评论是正确的。
当使用 csrf 时,除了发布 Json 数据,您必须以不同的方式在后端检索它......而不是更改帖子上的内容类型(更改为不准确的内容类型),您将获得 request.body 而不是 request.POST。
data = json.loads(request.body) name = data['name']
推荐阅读
- sql - 创建具有不同输入的 PL/SQL 过程和匿名块
- r - 将不同文件夹中的多个 csv 文件(名称相似)合并为一个 csv 并逐行绑定
- assembly - x86 程序集:错误 A2008:语法错误:否定
- python - Flask / Gcloud 错误“内容必须通过 HTTPS 提供”
- c++ - vs 代码无法遵循相关的 gcc 构建错误链接
- node.js - NodeJS-Heroku 加载图片资源失败:服务器响应状态为 502 (Bad Gateway)
- javascript - Find the clients' IP address using an ExpressJS app
- node.js - 为 npx create-react-app 创建文件的问题
- jquery - Kendo-UI Router 无限路由
- spring - PropertyPlaceholderConfigurer 与 xml 配置中的配置文件