Django REST framework在Django原有的基礎(chǔ)上,新增了一個request對象繼承了APIView視圖類,并在原有的HttpResponse響應(yīng)類的基礎(chǔ)上實現(xiàn)了一個子類Response響應(yīng)類,這2個類,都是基于內(nèi)容協(xié)商來完成數(shù)據(jù)的格式轉(zhuǎn)換的。
REST framework傳入視圖的request對象不再是Django默認(rèn)的HttpRequest對象,而是REST framework提供的擴(kuò)展了HttpRequest類的Request類的對象。
REST framework提供了Parser解析器,在接收到請求后會自動根據(jù)Content-Type指明的請求數(shù)據(jù)類型(如JSON、表單等)將請求數(shù)據(jù)進(jìn)行parse解析,解析為類字典[QueryDict]對象保存到Request對象中。
request -> parser ->識別客戶端請求頭中的Content-Type來完成數(shù)據(jù)轉(zhuǎn)換成->類字典(QueryDict,字典的子類)
Response -> renderer ->識別客戶端請求頭的Accept來提取客戶期望的返回數(shù)據(jù)格式,轉(zhuǎn)換成客戶端的期望格式數(shù)據(jù)
Request
REST framework引入了一個擴(kuò)展常規(guī)HttpRequest的Request對象,并提供了更靈活的請求解析。允許你使用JSON data或 其他media types像通常處理表單數(shù)據(jù)一樣處理請求。
常用屬性
1 request.data返回請求主題的解析內(nèi)容。這跟標(biāo)準(zhǔn)的request.POST和request.FILES類似,并且還具有以下特點:
- 包括所有解析的內(nèi)容,文件(file) 和 非文件(non-file inputs)。
- 支持解析POST以外的HTTP method , 比如 PUT, PATCH。
- 更加靈活,不僅僅支持表單數(shù)據(jù),傳入同樣的JSON數(shù)據(jù)一樣可以正確解析,并且不用做額外的處理(意思是前端不管提交的是表單數(shù)據(jù),還是JSON數(shù)據(jù),.data都能夠正確解析)。
request.POST # 只處理表單數(shù)據(jù) 只適用于’POST’方法 request.data # 處理任意數(shù)據(jù) 適用于’POST’,’PUT’和’PATCH’方法
2 request.query_params等同于request.GET,不過其名字更加容易理解。為了代碼更加清晰可讀,推薦使用request.query_params ,而不是Django中的request.GET,這樣能夠讓你的代碼更加明顯的體現(xiàn)出任何HTTP method類型都可能包含查詢參數(shù)(query parameters),而不僅僅只是GET請求。
3 request._request獲取django封裝的Request對象
由于REST framework的Request擴(kuò)展于Django的HttpRequest,所有其他標(biāo)準(zhǔn)屬性和方法也可用。例如request.META和 request.session字典都可以正常使用。
#基本使用 from rest_framework.views import APIView #from rest_framework.request import Request from rest_framework.response import Response class StuAPIView(APIView): def post(self, request): “””獲取請求體數(shù)據(jù)””” print(f”drf.request.data={request.data}”) # 接受的數(shù)據(jù)會解析成字典 # json: drf.request.data={‘name’: ‘you1’, ‘desc’: ‘hello world’} # form表單: drf.request.data= “””獲取查詢參數(shù)””” print(f”drf.request.query_params={request.query_params}”) # return Response({“msg”: “ok”})
Response
REST框架還引入了一個Response對象,使用該類構(gòu)造響應(yīng)對象時,響應(yīng)的具體數(shù)據(jù)內(nèi)容會被轉(zhuǎn)換(render渲染)成符合前端需求的類型。
REST framework提供了renderer渲染器,用來根據(jù)請求頭中的Accept(接收數(shù)據(jù)類型聲明)來自動轉(zhuǎn)換響應(yīng)數(shù)據(jù)到對應(yīng)格式,如果前端請求中未聲明Accept,則采用Content-Type方式處理響應(yīng)數(shù)據(jù)。
# 由于是默認(rèn)的配置,所以settings配置文件中可以不配置以下選項 REST_FRAMEWORK = { ‘DEFAULT_RENDERER_CLASSES’: [ #默認(rèn)響應(yīng)渲染類 ‘rest_framework.renderers.JSONRenderer’, #json渲染器 ‘rest_framework.renderers.BrowsableAPIRenderer’, #瀏覽器渲染器,有調(diào)試界面 ] } #構(gòu)造方法 Response(data, status=None, template_name=None, headers=None, content_type=None) #參數(shù): data: 響應(yīng)的序列化數(shù)據(jù)。 status: 響應(yīng)的狀態(tài)代碼。默認(rèn)為200。 template_name: 選擇 HTMLRenderer 時使用的模板名稱。 headers: 設(shè)置 HTTP header,字典類型。 content_type: 響應(yīng)的內(nèi)容類型,通常渲染器會根據(jù)內(nèi)容協(xié)商的結(jié)果自動設(shè)置,但有些時候需要手動指定。 #比較完整的使用 response={‘code’:100,’msg’:’查詢成功’,’result’:ser.data} return Response(response,status=status.HTTP_201_CREATED,headers={‘xxx’:”xxx”})
常用屬性
狀態(tài)碼
為了方便設(shè)置狀態(tài)碼,REST framewrok在rest_framework.status模塊中提供了常用狀態(tài)碼常量。
from rest_framework import status #1.信息告知 – 1xx HTTP_100_CONTINUE HTTP_101_SWITCHING_PROTOCOLS #2.成功 – 2xx HTTP_200_OK HTTP_201_CREATED HTTP_202_ACCEPTED HTTP_203_NON_AUTHORITATIVE_INFORMATION HTTP_204_NO_CONTENT HTTP_205_RESET_CONTENT HTTP_206_PARTIAL_CONTENT HTTP_207_MULTI_STATUS #3.重定向 – 3xx HTTP_300_MULTIPLE_CHOICES HTTP_301_MOVED_PERMANENTLY HTTP_302_FOUND HTTP_303_SEE_OTHER HTTP_304_NOT_MODIFIED HTTP_305_USE_PROXY HTTP_306_RESERVED HTTP_307_TEMPORARY_REDIRECT #4.客戶端錯誤 – 4xx HTTP_400_BAD_REQUEST HTTP_401_UNAUTHORIZED HTTP_402_PAYMENT_REQUIRED HTTP_403_FORBIDDEN HTTP_404_NOT_FOUND HTTP_405_METHOD_NOT_ALLOWED HTTP_406_NOT_ACCEPTABLE HTTP_407_PROXY_AUTHENTICATION_REQUIRED HTTP_408_REQUEST_TIMEOUT HTTP_409_CONFLICT HTTP_410_GONE HTTP_411_LENGTH_REQUIRED HTTP_412_PRECONDITION_FAILED HTTP_413_REQUEST_ENTITY_TOO_LARGE HTTP_414_REQUEST_URI_TOO_LONG HTTP_415_UNSUPPORTED_MEDIA_TYPE HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE HTTP_417_EXPECTATION_FAILED HTTP_422_UNPROCESSABLE_ENTITY HTTP_423_LOCKED HTTP_424_FAILED_DEPENDENCY HTTP_428_PRECONDITION_REQUIRED HTTP_429_TOO_MANY_REQUESTS HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS #5.服務(wù)器錯誤 – 5xx HTTP_500_INTERNAL_SERVER_ERROR HTTP_501_NOT_IMPLEMENTED HTTP_502_BAD_GATEWAY HTTP_503_SERVICE_UNAVAILABLE HTTP_504_GATEWAY_TIMEOUT HTTP_505_HTTP_VERSION_NOT_SUPPORTED HTTP_507_INSUFFICIENT_STORAGE HTTP_511_NETWORK_AUTHENTICATION_REQUIRED
封裝Response
參考鏈接:https://www.jianshu.com/p/c0be24752584
#1.response.py from rest_framework.response import Response class APIResponse(Response): def __init__(self, code=100, msg=’成功’, data=None, status=None, headers=None, exception=False, content_type=None, **kwargs): dic = {‘code’: code, ‘msg’: msg} if data: #如果data有值,說明要往里面放東西 dic[‘data’] = data if kwargs: #自定義傳的參數(shù)會添加到字典里 dic.update(kwargs) super().__init__(data=dic, status=status, headers=headers, exception=exception, content_type=content_type) #2.在視圖中使用 from .response import APIResponse return APIResponse(data={‘name’: ‘fana’, ‘age’: 19})
解析器
REST framework 包含許多內(nèi)置的解析器類,允許接受各種媒體類型(media types)的請求。還支持自定義解析器,這使你可以靈活地設(shè)計 API 接受的媒體類型。
#1.settings.py #查看默認(rèn)解析器 from rest_framework import settings REST_FRAMEWORK = { ‘DEFAULT_RENDERER_CLASSES’: [ #渲染器 ‘rest_framework.renderers.JSONRenderer’, ‘rest_framework.renderers.TemplateHTMLRenderer’, ], ‘DEFAULT_PARSER_CLASSES’: [ #解析器 ‘rest_framework.parsers.JSONParser’, ‘rest_framework.parsers.FormParser’, ‘rest_framework.parsers.MultiPartParser’, ], }
YAML
GitHub:https://jpadilla.github.io/django-rest-framework-yaml
REST framework YAML提供YAML解析和渲染支持。它以前直接包含在REST framework包中,現(xiàn)在作為第三方包
#1.安裝模塊 pip install djangorestframework-yaml #2.settings.py REST_FRAMEWORK = { ‘DEFAULT_PARSER_CLASSES’: ( ‘rest_framework_yaml.parsers.YAMLParser’, ), ‘DEFAULT_RENDERER_CLASSES’: ( ‘rest_framework_yaml.renderers.YAMLRenderer’, ), }
XML
GitHub:https://jpadilla.github.io/django-rest-framework-xml/
REST Framework XML提供了一種簡單的非正式XML格式。它以前直接包含在REST framework包中,現(xiàn)在作為第三方包。
#1.安裝模塊 pip install djangorestframework-xml #2.settings.py REST_FRAMEWORK = { ‘DEFAULT_PARSER_CLASSES’: ( ‘rest_framework_xml.parsers.XMLParser’, ), ‘DEFAULT_RENDERER_CLASSES’: ( ‘rest_framework_xml.renderers.XMLRenderer’, ), }