为什么Django的request.POST.get无法获取原生JS发送的POST参数?
差异的核心原因
这个差异本质是请求的Content-Type类型不同,导致Django的参数解析逻辑不同,具体原因拆解如下:
1. Django request.POST 的解析规则
Django的request.POST对象只会自动解析满足以下两个条件的POST请求:
- 请求头的
Content-Type值为application/x-www-form-urlencoded或multipart/form-data - 请求体内容是符合对应格式的键值对数据
如果请求是application/json类型的JSON字符串,Django不会将其解析到request.POST中,需要开发者手动从request.body中读取原始内容,再通过json.load()反序列化得到参数。
2. 原生JS请求的特征
你手动设置了Content-Type: application/json,且请求体是经过JSON.stringify()序列化的JSON字符串,完全匹配application/json类型的请求特征,所以Django不会把参数解析到request.POST,只能手动解析request.body获取。
3. jQuery $.ajax 请求的默认特征
jQuery的$.ajax方法默认配置下:
- 默认
contentType为application/x-www-form-urlencoded; charset=UTF-8 - 当你传入普通JS对象作为
data参数时,jQuery会自动将对象序列化为key=value&key2=value2格式的表单字符串
这种请求完全符合Djangorequest.POST的解析条件,所以可以直接用request.POST.get()获取参数。
补充验证:如果给jQuery的
$.ajax手动设置contentType: 'application/json',同时将data参数用JSON.stringify()转为JSON字符串,此时request.POST.get()同样会返回None,和原生JS的表现完全一致。
内容的提问来源于stack exchange,提问作者Danilo
相关产品推荐
相关产品推荐

