HTTP
URL:统一资源定位器
请求体数据封装格式ContentType
能发post请求的两种方式:
- form表单: 能发urlencoded格式数据,不能发json数据格式
- ajax:所有数据格式都能发
请求体: request.body 数据格式
http协议post请求格式
header:
-
url
-
HTTP/1.1
-
useragent:..................
-
accept:..............
-
ContentType: 可以是urlencoded格式,或其他格式:例如json格式
空行
body:
-
user=sunny&pwd=123 ---> urlencoded格式
-
b'{"name":"sunny", "age":1} ---> json格式
1. 表单发送post请求
# views.py def home(request): if request.method == 'GET': return render(request, 'home.html') else: print(request.POST) # request.POST django自动拆解urlencoded格式并解析成querydict格式 # < QueryDict: {'csrfmiddlewaretoken': ['OHBOnVc4yACw6Ls5vuWjmClj1FN7VmA3SFlTuywk1xjIc14uOWX8FXulUNt9QT4t'], # 'user': ['1'], 'pwd': ['2']} > print(request.body) # b'csrfmiddlewaretoken=OHBOnVc4yACw6Ls5vuWjmClj1FN7VmA3SFlTuywk1xjIc14uOWX8FXulUNt9QT4t&user=1&pwd=2' # &user=1&pwd=2: ContnetType:urlencoded 数据封装格式 # form表单可设置格式 # <form action="" method="post" enctype="application/x-www-form-urlencoded"> # enctype="application/x-www-form-urlencoded 即 ContentType return HttpResponse('ok')
# form 表单中的enctype属性即数据封装格式,可选,默认urlencoded <form action="" method="post" enctype="application/x-www-form-urlencoded"> {% csrf_token %} <label> user:<input name='user' type="text"> </label> <label> pwd:<input name='pwd' type="text"> </label> <input type="submit"> </form>
-
浏览器
![
-
ajax方式post请求: 请求体数据格式为json
绝大部分场景使用json为contenttype格式
$.ajax({ url:"home", type:"post", contentType:"json", //conenttype格式为json, 小驼峰格式的contentType data:JSON.stringify({ //将data序列化json字符串 num1:num1, num2:num2, csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val() //属性选择器选择name属性值 }") })
ajax post 发送的json格式的封装数据,django中request.POST中为空字典
django只解析contentType为urlencoded格式的数据
ajax post 发送的json格式的封装数据(字节串形式),只能从request.body中获取
b'{"num1":1, "num2":"sunny"}' ,需解码utf8
import json def home(request): res = json.loads(request.body.decode("utf8")) # ajax请求的数据为json格式的字符串,直接反序列化就能得到字典格式的请求体数据 return HttpResponse('ok')
- post json数据csrfmiddlewaretoken不能通过认证