Django问题:表单发送POST数据,为何request.method返回GET?
我来帮你捋清楚这个问题的核心原因,结合你提到的HTTP重定向特性,大概率是这几个情况:
视图处理POST后做了重定向
这是最常见的原因!假设你的视图逻辑是这样的:收到POST请求处理完数据后,用了return redirect('某个页面')。根据HTTP规范,浏览器收到重定向响应(比如302/303)后,会自动发起一个GET请求跳转到目标URL——这就是你看到test1 GET的真正原因:你打印的其实是重定向后的GET请求,而不是原始的POST请求。
你可以检查下视图代码,是不是在POST分支里有重定向操作,原始的POST请求其实已经被处理了,只是后续的重定向让你看到了GET的日志。表单与视图的匹配逻辑问题
如果你把表单渲染和表单处理放在同一个视图里,处理完POST后重定向回当前URL,那浏览器就会发送GET请求加载这个视图的页面,自然会打印GET。这种情况其实是PRG(Post/Redirect/Get)模式的正常表现——用来防止用户刷新页面重复提交表单,但如果你的需求是在同一个请求里看到POST,那处理完POST后直接返回页面响应,不要用重定向。中间件或第三方工具的干扰(少见)
极少数情况下,项目里的自定义中间件或者第三方工具可能会修改请求方法,但这种情况概率很低。你可以暂时禁用非必要的中间件,再测试看看请求方法是否正常。
另外你提到的“HTTP不支持重定向POST数据”,本质就是浏览器在处理重定向时,会把POST请求转换成GET,这是HTTP协议的规定,目的是避免重复提交数据。所以如果你的视图里用了重定向,出现GET请求完全是符合规范的。
排查小技巧:你可以在视图里多打印一些日志,比如print(f"路径: {request.path}, 方法: {request.method}"),这样就能看到是不是有两个请求:一个POST(处理表单的),一个GET(重定向过来的)。
内容的提问来源于stack exchange,提问作者SkillSet12345

