1. 程式人生 > 實用技巧 >[20200727NOIP提高組模擬T2]走路

[20200727NOIP提高組模擬T2]走路

一. 請求#

Copy
from rest_framework.request import Request


class Request:
    def __init__(self, request, parsers=None, authenticators=None,
                 negotiator=None, parser_context=None):
        # 二次封裝request,將原生request作為drf中request物件的 _request 屬性
        self._request = request

    def __getattr__
(self, item):
return getattr(self._request, item) # 請求物件: request.data 前端以三種編碼方式傳入的資料,都可以取出來 # 請求物件: request.query_params與Django標準的request.GET相同,只是更換了更正確的名稱而已。

二. 響應#

1. 引數介紹#

Copy
from rest_framework.response import Response


class Response:
    def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None)
:
""" :param data: 你要返回的資料,字典 :param status: 返回的狀態碼,預設是200, from rest_framework import status # 在這個路徑下, 它把所有使用到的狀態碼都定義成了常量 :param template_name: 渲染的模板名字(自定製模板),不需要了解 :param headers: 響應頭,可以往響應頭放東西,就是一個字典 :param content_type: 響應的編碼格式,application/json 和 text/html """

2. 控制返回響應格式瀏覽器響應成瀏覽器的格式#

postman響應成json格式,瀏覽器響應好看的頁面. 這都是通過配置實現的(預設配置)

Copy
# 配置的載入執行順序: 先從自己類中找 -> 專案的setting中找 -> 預設配置檔案中找


# 區域性使用: 對某個檢視類有效, 在檢視類中寫如下:
    from rest_framework.renderers import JSONRenderer
    renderer_classes=[JSONRenderer,]
    
    
# 全域性使用:全域性的檢視類,所有請求,都有效. 在setting.py中加入如下:
    REST_FRAMEWORK = {
        'DEFAULT_RENDERER_CLASSES': (  # 預設響應渲染類
            'rest_framework.renderers.JSONRenderer',          # json渲染器
            'rest_framework.renderers.BrowsableAPIRenderer',  # 瀏覽API渲染器
        )
    }

3. 狀態碼#

為了方便設定狀態碼,REST framewrok在rest_framework.status模組中提供了常用狀態碼常量。

匯入: from rest_framework import status

提示: 預設響應狀態碼200

1) 資訊告知 - 1xx#

Copy
HTTP_100_CONTINUE
HTTP_101_SWITCHING_PROTOCOLS

2)成功 - 2xx#

Copy
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#

Copy
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#

Copy
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)伺服器錯誤 - 5xx#

Copy
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