ContentType

HTTP

URL:统一资源定位器

请求体数据封装格式ContentType

能发post请求的两种方式:

  1. form表单: 能发urlencoded格式数据,不能发json数据格式
  2. 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>
    
  • 浏览器

    ![

  1. 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不能通过认证
原文地址:https://www.cnblogs.com/relaxlee/p/12842630.html