Django使用DRF集成reCAPTCHA时POST请求传到视图为空如何解决
解决方案
你遇到的POST数据为空问题,按以下步骤逐一排查:
- 检查路由配置是否存在重定向丢数据的问题
Django默认开启APPEND_SLASH配置,当请求地址和路由配置的斜杠不匹配时,会返回301重定向,重定向过程中POST请求会自动转为GET请求,所有请求数据都会丢失。确认你urls.py中对应接口的路由末尾是否带斜杠,必须和form表单的action="/api/test_recaptcha/"配置完全一致,建议统一在路由末尾添加斜杠:# 正确示例 path('api/test_recaptcha/', TESTViewSet.as_view(), name='test_recaptcha'), - 检查DRF解析器配置
DRF需要对应解析器才能把请求体的数据解析到request.data中,普通form表单提交的Content-Type为application/x-www-form-urlencoded,需要确保FormParser在解析器列表中。可以在settings.py中全局配置:
如果你的视图单独配置了REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES': [ 'rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser', 'rest_framework.parsers.MultiPartParser' ] }parser_classes参数,也需要检查是否包含上述两种表单解析器。 - 排查请求原始数据
可以临时修改视图代码打印原始请求体,确认数据是否已经到达后端:
如果def post(self, request): # 打印原始请求体,确认数据是否传递成功 st = f'test: {request.body} - {request.POST} - {request.data} ' return HttpResponse(st)request.body有数据但request.POST和request.data为空,确认没有自定义中间件修改或者丢弃了请求数据。 - 确认reCAPTCHA字段提交正常
谷歌reCAPTCHA提交成功后会自动生成g-recaptcha-response字段,你可以在浏览器的开发者工具网络面板中查看POST请求的表单数据,确认该字段是否正常携带。
内容的提问来源于stack exchange,提问作者Justcurious
相关产品推荐
相关产品推荐

