一、前言
在前端向后台发送form表单或者ajax数据的时候,django的content_type会拿到请求头中的Content-Type属性然后根据值进行解析。
将request.data中的值放到request.POST中需要满足两个条件
- 请求头要求:
Content-Type: application/x-www-form-urlencoded
PS: 如果请求头中的 Content-Type: application/x-www-form-urlencoded,request.POST中才有值(去request.body中解析数据)。 - 数据格式要求:
name=weilan&age=18&gender=男
1、表单提交
form表单提交时会自动的将请求头中的Content-Type: application/x-www-form-urlencoded,数据也会自动转换为?parser=xxx&parser2=xxx的格式
<form action="/api/parser/" method="post"> <input type="text" name="parser"/> <input type="text" name="parser2"/> <input type="submit"/> </form>> 2、ajax提交
默认的请求头中Content-Type: application/x-www-form-urlencoded
$.ajax({ url:... type:POST, data:{name:alex,age=18} # 内部转化 name=weilan&age=18&gender=男 }) 情况一:
$.ajax({ url:... type:POST, headers:{'Content-Type':"application/json"} data:{name:weilan,age=18} # 内部转化 name=weilan&age=18&gender=男 }) # body有值;POST无 情况二:
$.ajax({ url:... type:POST, headers:{'Content-Type':"application/json"} data:JSON.stringfy({name:weilan,age=18}) # {name:weilan,age:18...} # 不在做内部转换,而是传递字符串 }) # body有值;POST无 # 这种情况下request.body有值, 需要字节类型转换成字符串类型。 # json.loads(request.body) 二、实例
1、仅处理请求头content-type为application/json的请求体
#!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.request import Request from rest_framework.parsers import JSONParser class TestView(APIView): parser_classes = [JSONParser, ] # 解析类 def post(self, request, *args, **kwargs): print(request.content_type) # 获取请求的值,并使用对应的JSONParser进行处理 print(request.data) # application/x-www-form-urlencoded 或 multipart/form-data时,request.POST中才有值 print(request.POST) print(request.FILES) return Response('POST请求,响应内容') 2、仅处理请求头content-type为application/x-www-form-urlencoded 的请求体
#!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.request import Request from rest_framework.parsers import FormParser <
