django 请求体和请求体相关知识
请求头ContentType
ContentType指的是请求体的编码类型,常见的类型共有3种:
django 如果发送post请求,或者表单提交数据。如果不设置enctype属性。
就会以application/x-www-form-urlencoded方式提交数据。
这就是设置请求请求体字符编码,请求体里的数据就会按照特定的字符编码格式排列。
如:
省略掉了):
POST http://www.example.com HTTP/1.1 Content-Type: application/x-www-form-urlencoded;charset=utf-8 user=yuan&age=22
2 multipart/form-data
这是上传文件时,要用的字符编码格式。
必须让 <form> 表单的 enctype
等于 multipart/form-data。直接来看一个请求示例:
POST http://www.example.com HTTP/1.1 Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA ------WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition: form-data; name="user" yuan ------WebKitFormBoundaryrGKCBY7qhFd3TrwA Content-Disposition: form-data; name="file"; filename="chrome.png" Content-Type: image/png PNG ... content of chrome.png ... ------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
request.FILES来获取文件信息
3 application/json
application/json 这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。
传过去之后request.post 是取不到值的,因为django是不会对json数据进行处理的。
只能在相应体里,request.body里取原生的json二进制数据,要json.loads(request.body.encoding('utf-8'));转成了字典
JSON 格式支持比键值对复杂得多的结构化数据,这一点也很有用。记得我几年前做一个项目时,需要提交的数据层次非常深,我就是把数据 JSON 序列化之后来提交的。不过当时我是把 JSON 字符串作为 val,仍然放在键值对里,以 x-www-form-urlencoded 方式提交。