RESTful 规范
一, 前言
在前端向后台发送 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
- class TestView(APIView):
- parser_classes = [FormParser, ]
- 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 请求, 响应内容')
views.py
3, 仅处理请求头 content-type 为 multipart/form-data 的请求体
- #!/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 MultiPartParser
- class TestView(APIView):
- parser_classes = [MultiPartParser, ]
- 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 请求, 响应内容')
- <!DOCTYPE html>
- <HTML lang="en">
- <head>
- <meta charset="UTF-8">
- <title>
- Title
- </title>
- </head>
- <body>
- <form action="http://127.0.0.1:8000/test/" method="post" enctype="multipart/form-data">
- <input type="text" name="user" />
- <input type="file" name="img">
- <input type="submit" value="提交">
- </form>
- </body>
- </HTML>
upload.HTML
4, 仅上传文件
- #!/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 FileUploadParser
- class TestView(APIView):
- parser_classes = [FileUploadParser, ]
- def post(self, request, filename, *args, **kwargs):
- print(filename)
- 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 请求, 响应内容')
- def put(self, request, *args, **kwargs):
- return Response('PUT 请求, 响应内容')
views.py
- <!DOCTYPE HTML>
- <HTML lang="en">
- <head>
- <meta charset="UTF-8">
- <title>
- Title
- </title>
- </head>
- <body>
- <form action="http://127.0.0.1:8000/test/f1.numbers" method="post" enctype="multipart/form-data">
- <input type="text" name="user" />
- <input type="file" name="img">
- <input type="submit" value="提交">
- </form>
- </body>
- </HTML>
upload.HTML
6, 同时多个 Parser
当同时使用多个 parser 时, REST framework 会根据请求头 content-type 自动进行比对, 并使用对应 parser
- #!/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, FormParser, MultiPartParser
- class TestView(APIView):
- parser_classes = [JSONParser, FormParser, MultiPartParser, ]
- 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 请求, 响应内容')
- def put(self, request, *args, **kwargs):
- return Response('PUT 请求, 响应内容')
views.py
5, 全局配置
- REST_FRAMEWORK = {
- 'DEFAULT_PARSER_CLASSES':[
- 'rest_framework.parsers.JSONParser'
- 'rest_framework.parsers.FormParser'
- 'rest_framework.parsers.MultiPartParser'
- ]
- }
settings.py
来源: https://www.cnblogs.com/welan/p/10145256.html