亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                Django REST framework學(xué)習(xí)筆記(3)-請(qǐng)求和響應(yīng)

                Django REST framework在Django原有的基礎(chǔ)上,新增了一個(gè)request對(duì)象繼承了APIView視圖類(lèi),并在原有的HttpResponse響應(yīng)類(lèi)的基礎(chǔ)上實(shí)現(xiàn)了一個(gè)子類(lèi)Response響應(yīng)類(lèi),這2個(gè)類(lèi),都是基于內(nèi)容協(xié)商來(lái)完成數(shù)據(jù)的格式轉(zhuǎn)換的。

                REST framework傳入視圖的request對(duì)象不再是Django默認(rèn)的HttpRequest對(duì)象,而是REST framework提供的擴(kuò)展了HttpRequest類(lèi)的Request類(lèi)的對(duì)象。

                REST framework提供了Parser解析器,在接收到請(qǐng)求后會(huì)自動(dòng)根據(jù)Content-Type指明的請(qǐng)求數(shù)據(jù)類(lèi)型(如JSON、表單等)將請(qǐng)求數(shù)據(jù)進(jìn)行parse解析,解析為類(lèi)字典[QueryDict]對(duì)象保存到Request對(duì)象中。

                request -> parser ->識(shí)別客戶(hù)端請(qǐng)求頭中的Content-Type來(lái)完成數(shù)據(jù)轉(zhuǎn)換成->類(lèi)字典(QueryDict,字典的子類(lèi))

                Response -> renderer ->識(shí)別客戶(hù)端請(qǐng)求頭的Accept來(lái)提取客戶(hù)期望的返回?cái)?shù)據(jù)格式,轉(zhuǎn)換成客戶(hù)端的期望格式數(shù)據(jù)

                Request

                REST framework引入了一個(gè)擴(kuò)展常規(guī)HttpRequest的Request對(duì)象,并提供了更靈活的請(qǐng)求解析。允許你使用JSON data或 其他media types像通常處理表單數(shù)據(jù)一樣處理請(qǐng)求。

                常用屬性

                1 request.data返回請(qǐng)求主題的解析內(nèi)容。這跟標(biāo)準(zhǔn)的request.POST和request.FILES類(lèi)似,并且還具有以下特點(diǎn):

                • 包括所有解析的內(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,不過(guò)其名字更加容易理解。為了代碼更加清晰可讀,推薦使用request.query_params ,而不是Django中的request.GET,這樣能夠讓你的代碼更加明顯的體現(xiàn)出任何HTTP method類(lèi)型都可能包含查詢(xún)參數(shù)(query parameters),而不僅僅只是GET請(qǐng)求。

                3 request._request獲取django封裝的Request對(duì)象

                由于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): “””獲取請(qǐng)求體數(shù)據(jù)””” print(f”drf.request.data={request.data}”) # 接受的數(shù)據(jù)會(huì)解析成字典 # json: drf.request.data={‘name’: ‘you1’, ‘desc’: ‘hello world’} # form表單: drf.request.data= “””獲取查詢(xún)參數(shù)””” print(f”drf.request.query_params={request.query_params}”) # return Response({“msg”: “ok”})

                Response

                REST框架還引入了一個(gè)Response對(duì)象,使用該類(lèi)構(gòu)造響應(yīng)對(duì)象時(shí),響應(yīng)的具體數(shù)據(jù)內(nèi)容會(huì)被轉(zhuǎn)換(render渲染)成符合前端需求的類(lèi)型。

                REST framework提供了renderer渲染器,用來(lái)根據(jù)請(qǐng)求頭中的Accept(接收數(shù)據(jù)類(lèi)型聲明)來(lái)自動(dòng)轉(zhuǎn)換響應(yīng)數(shù)據(jù)到對(duì)應(yīng)格式,如果前端請(qǐng)求中未聲明Accept,則采用Content-Type方式處理響應(yīng)數(shù)據(jù)。

                # 由于是默認(rèn)的配置,所以settings配置文件中可以不配置以下選項(xiàng) REST_FRAMEWORK = { ‘DEFAULT_RENDERER_CLASSES’: [ #默認(rèn)響應(yīng)渲染類(lèi) ‘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 時(shí)使用的模板名稱(chēng)。 headers: 設(shè)置 HTTP header,字典類(lèi)型。 content_type: 響應(yīng)的內(nèi)容類(lèi)型,通常渲染器會(huì)根據(jù)內(nèi)容協(xié)商的結(jié)果自動(dòng)設(shè)置,但有些時(shí)候需要手動(dòng)指定。 #比較完整的使用 response={‘code’:100,’msg’:’查詢(xún)成功’,’result’:ser.data} return Response(response,status=status.HTTP_201_CREATED,headers={‘xxx’:”xxx”})

                常用屬性

              1. .data:還沒(méi)有渲染,但已經(jīng)序列化的響應(yīng)數(shù)據(jù)。
              2. .status_code:狀態(tài)碼
              3. .content:將會(huì)返回的響應(yīng)內(nèi)容,必須先調(diào)用 .render() 方法,才能訪問(wèn) .content
              4. .template_name:只有在 response 的渲染器是 HTMLRenderer 或其他自定義模板渲染器時(shí)才需要提供
              5. .accepted_renderer:用于將會(huì)返回的響應(yīng)內(nèi)容的渲染器實(shí)例從視圖返回響應(yīng)之前由 APIView 或 @api_view 自動(dòng)設(shè)置。
              6. .accepted_media_type:內(nèi)容協(xié)商階段選擇的媒體類(lèi)型從視圖返回響應(yīng)之前由 APIView 或 @api_view 自動(dòng)設(shè)置。
              7. .renderer_context:將傳遞給渲染器的 .render() 方法的附加的上下文信息字典從視圖返回響應(yīng)之前由 APIView 或 @api_view 自動(dòng)設(shè)置。
              8. 狀態(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.客戶(hù)端錯(cuò)誤 – 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ù)器錯(cuò)誤 – 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有值,說(shuō)明要往里面放東西 dic[‘data’] = data if kwargs: #自定義傳的參數(shù)會(huì)添加到字典里 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)置的解析器類(lèi),允許接受各種媒體類(lèi)型(media types)的請(qǐng)求。還支持自定義解析器,這使你可以靈活地設(shè)計(jì) API 接受的媒體類(lèi)型。

                #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提供了一種簡(jiǎn)單的非正式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’, ), }

                鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶(hù)投稿
                上一篇 2022年7月4日 21:15
                下一篇 2022年7月4日 21:15

                相關(guān)推薦

                聯(lián)系我們

                聯(lián)系郵箱:admin#wlmqw.com
                工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息