django-rest-framework解析请求参数过程详解

  • 时间:
  • 浏览:25

媒介

我们正在django-rest-framework 自界说swagger 文章中编写了接心, 调通了接心文档. 接心文档能够间接挖写参数停止要求, 接上去的成绩是若何承受参数, 因为要求体例取参数序列化情势的差别, 领受参数的体例也有差别.

条件前提

办事端我们利用django-rest-framework编写接心.

class ReturnJson(APIView):

 coreapi_fields=(
 DocParam("token"),
 )

 def get(self, request, *args, **kwargs):
 return JsonResponse("Hello world!!!!!!!!++++++中文测试")

那是1个简朴接心, ReturnJson担当自APIView

而APIView 去自from rest_framework.views import APIView

以下 def get, def post等等的条件前提皆是接心类担当自APIView.

固然借能够担当自别的的类比方.

from rest_framework import viewsets, generics

class ReturnJson(generics.ListCreateAPIView)
class ReturnJson(viewsets.ModelViewSet)

他们的用法各有特性, 概况检察

  • http://www.django-rest-framework.org/api-guide/viewsets/
  • http://www.django-rest-framework.org/api-guide/generic-views/
  • http://www.django-rest-framework.org/api-guide/views/

django-rest-framework若何编写1个接心.

class ReturnJson(APIView):

 coreapi_fields=(
 DocParam("token"),
 )

 def get(self, request, *args, **kwargs):
 return JsonResponse("Hello world!!!!!!!!++++++中文测试")

 def post(self, request, *args, **kwargs):
 return JsonResponse(data={})
 
 def put(self, request, *args, **kwargs):
 return JsonResponse(data={})

对1个APIView的子类, 重写get, post, put等办法便相称于剖析那个途径的get, post, put要求,

要求工具便是request工具, http header body 的内容皆被包括正在request工具中.
request工具的类去自from rest_framework.request import Request

判定工具是不是是某个类真例化而去

from rest_framework.request import Request
if isinstance(request, Request)

上面别离阐发差别状况的参数地位战范例, 终究写出1个办法可以将任何范例的要求参数同一转换为dict便利以后的逻辑编写.

GET

get要求中参数城市以http://***.com/api/getjson?param1=asdf¶m2=123
如许的情势拼接正在url前面.

正在request工具中

  • request.query_params 中能够获得?param1=32¶m2=23情势的参数.
  • request.query_params 前往的数据范例为QueryDict
  • QueryDict转为通俗Python字典. query_params.dict()便可.

POST

post 要求参数皆正在要求体中, 可是实在您的url能够写成get的情势, 终究成果, 参数会有两部份构成, 1部份正在url中, 1部份正在http body 中, 可是十分没有倡议如许做.

接上去的代码编写也没有会斟酌如许的状况, post 仅斟酌一切参数皆正在http body 中的状况.

提交范例参数地位参数范例
form-data提交,参数正在data中,范例为QueryDict
application/json提交参数正在data中范例为dict
(swagger)利用接心文档提交, 因为利用curl提交, 固然是post 可是参数仍然被相似get的情势拼接到了url以后,此时 参数正在query_params 中范例为 QueryDict
x-www-form-urlencoded参数正在data中范例为 QueryDict

PUT

提交范例参数地位参数范例
form-datarequest.dataQueryDict
application/jsonrequest.datadict
x-www-form-urlencodedrequest.dataQueryDict
(swagger)request.datadict

PATCH

提交范例参数地位参数范例
form-datarequest.dataQueryDict
application/jsonrequest.datadict
x-www-form-urlencodedrequest.dataQueryDict
(swagger)request.datadict

DELETE

提交范例参数地位参数范例
form-datarequest.dataQueryDict
application/jsonrequest.datadict
x-www-form-urlencodedrequest.dataQueryDict
(swagger)request.query_paramsQueryDict
iOS端提交战get状况1样request.query_paramsQueryDict

编写参数同一处置的办法

总结1下, 当url有?param=1¶m=2如许的参数时疏忽body中的参数, 比方get,delete提交,若是query_params有内容, 则疏忽body内容. 将QueryDict转为dict前往, 再判定request.data中是不是有内容, 范例若何.

from django.http import QueryDict
from rest_framework.request import Request
def get_parameter_dic(request, *args, **kwargs):
 if isinstance(request, Request) == False:
 return {}

 query_params = request.query_params
 if isinstance(query_params, QueryDict):
 query_params = query_params.dict()
 result_data = request.data
 if isinstance(result_data, QueryDict):
 result_data = result_data.dict()

 if query_params != {}:
 return query_params
 else:
 return result_data

利用办法

class ReturnJson(APIView):

 coreapi_fields=(
 DocParam("token"),
 )

 def get(self, request, *args, **kwargs):
 params=get_parameter_dic(request)
 return JsonResponse(data=params)

 def post(self, request, *args, **kwargs):
 params=get_parameter_dic(request)
 return JsonResponse(data=params)

 def put(self, request, *args, **kwargs):
 params=get_parameter_dic(request)
 return JsonResponse(data=params)

最初的结果

以上便是本文的全数内容,期望对各人的进修有所帮忙,也期望各人多多撑持剧本之家。