DRF框架請求與響應
DRF框架請求與響應
DRF 之Request
Request是包裝後的request,前面原始碼分析過了
不會DRF?原始碼都分析透了確定不來看? - HammerZe - 部落格園 (cnblogs.com)
前面的文章介紹到,新包裝的Request物件和原來django的request物件沒有什麼區別,使用方法一樣,只是多了request.data
,當然區別也不止這一點,我們看一下目錄
request常用方法
-
新包裝的Request物件是通過
__getattr__
方法反射過來的def __getattr__(self, attr): try: return getattr(self._request, attr) except AttributeError: return self.__getattribute__(attr)
-
現在資料都可以通過
request.data
獲取@property def data(self): if not _hasattr(self, '_full_data'): self._load_data_and_files() return self._full_data
-
原來request請求提交的資料在
GET
裡,現在請求引數可以通過request.query_parmas
來查詢引數,也是被偽裝成資料屬性了,本質還是使用了原來request物件的GET,所以請求引數既可以從GET
中取,也可以從request.query_params
中取@property def query_params(self): """ More semantically correct name for request.GET. """ return self._request.GET
配置請求資料格式
預設的情況下,三種資料格式(urlencoded,formdata,json)都可以解析
比如當請求(post)過來要新增一條資料,那麼我們可以針對該請求的資料格式做要求,比如只能提交json格式,或者允許From-data和json等···通過寫介面實現,需要進行區域性(views)或者全域性配置(settings)
配置處理順序
- 區域性優先
- 全域性其次
- 預設配置最後
區域性配置
- 匯入:
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
- 配置引數:parser_classes
配置在檢視類裡
'''views.py'''
# 作者詳情檢視類
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
class AuthorDetailView(APIView):
# 只處理json格式,預設三種格式都可以
# parser_classes = [JSONParser, FormParser, MultiPartParser]
parser_classes = [JSONParser]
def post(self, request):
# 獲取反序列化資料
ser = serializer.AuthorDetailSerializer(data=request.data)
if ser.is_valid():
# 校驗通過存入資料庫,不需要重寫create方法了
ser.save()
return Response({'code': 100, 'msg': '新增成功', 'data': ser.data})
# 校驗失敗
return Response({'code': 101, 'msg': '校驗未通過', 'error': ser.errors})
注意
在區域性配置的時候千萬注意,如果parser_classes=[]
,那麼什麼資料格式都不解析
全域性配置
匯入:from rest_framework import settings
原始碼解釋
'''Settings for REST framework are all namespaced in the REST_FRAMEWORK setting.
For example your project's `settings.py` file might look like this:
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',
],
}
'''
全域性settings.py配置
from rest_framework import settings
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser',
],
}
'''預設是三種資料格式都解析的,想解析哪種寫哪種就行了'''
總結
- 一般使用預設配置就可以了,如果需要搭配配置,區域性和全域性也可以一起使用
DRf 之 Response
匯入:from rest_framework.response import Response
Reponse常用引數
原始碼
class Response(SimpleTemplateResponse):
def __init__(self, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):
·····
-
data:一般處理成字串,字典,列表等,給http響應body體中的內容
注意,data可以從response物件中取出來二次處理,返回成我想要的樣子 Response.data['msg'] = '再加點料'
-
status:響應狀態碼,可以匯入,比如:from rest_framework.status import HTTP_201_CREATED,但是建議自定義,不寫預設是200
-
headers:響應頭(字典)
ps:上三常用,下三瞭解即可
- template_name:模板名稱,用瀏覽器訪問需要,預設使用DRF提供的,可以使用自己的
- exception:異常處理
- content_type:響應編碼格式
區域性配置
匯入:from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
- JSONRenderer:json格式渲染器
- BrowsableAPIRenderer:瀏覽API渲染器
通過renderer_classes配置解析格式
'''views.py'''
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class PublishView(APIView):
renderer_classes = [JSONRenderer, ]
····
注意
如果只配置JSONRenderer,那麼瀏覽器訪問也是json格式資料
全域性配置
settings.py配置
預設兩種都解析,取各自所需
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 預設響應渲染類
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 瀏覽API渲染器
)
}
總結
- 還是一般採用預設配置即可~