三种常见提交post请求的方式
方式一:json
关键字:
content-type:application/json
parser_classes:JSONParser
视图函数:
class UsersView(APIView):
parser_classes = [JSONParser, ]
def post(self, request, *args, **kwargs):
from rest_framework.request import Request
print(request._request.body)
print(request._request.POST)
print(request.data)
return Response('....')
POSTMAN设定
结果:
request._request.body: b'{"name":"alxe","pwd":"232323"}'
request._request.POST: <QueryDict: {}>
request.data: {'name': 'alxe', 'pwd': '232323'} #restframework解析后数据
方式二:常规post请求-application/x-www-form-urlencoded
这应该是最常见的 POST 提交数据的方式了。浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。
关键参数
content-type:application/x-www-form-urlencoded
parser_classes:JSONParser
因为restframework没有设定相应的解析类.所以会有相应报错
"detail": "Unsupported media type \"application/x-www-form-urlencoded\" in request."
parser_classes = [JSONParser, FormParser]
方式三:文件-multipart/form-data
这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctyped 等于这个值。
这种方式一般用来上传文件
关键参数
parser_classes = [JSONParser, FormParser, FileUploadParser]
结果
Django原始request对象POST:<QueryDict: {"'form-data'": ['hello']}>
RFW解析后数据:<QueryDict: {"'form-data'": ['hello'], "'MYFILES'": [<InMemoryUploadedFile: mylib.sql (application/x-sql)>]}>
Django原始request对象Files:<MultiValueDict: {"'MYFILES'": [<InMemoryUploadedFile: mylib.sql (application/x-sql)>]}>