請求(Request)與響應(Response)
請求(Request),當次的HTTP響應請求到Django中被封裝成python中的物件
- request.data - POST, PUT請求的資料
- request.query_params -GET請求的資料
REST framework 傳入檢視的request物件不再是Django預設的HttpRequest物件,而是REST framework提供的擴充套件了HttpRequest類的Request類的物件。
REST framework 提供了Parser解析器,在接收到請求後會自動根據Content-Type指明的請求資料型別(如JSON、表單等)將請求資料進行parse解析,解析為類字典[QueryDict]物件儲存到Request物件中。
Request物件的資料是自動根據前端傳送資料的格式進行解析之後的結果。
無論前端傳送的哪種格式的資料,我們都可以以統一的方式讀取資料。
響應(Response),主要:data(HTTP的響應體),status(狀態碼),headers(HTTP的響應頭)
rest_framework.response.Response
繼承關係 ---> SimpleTemplateResponse ---> django的HttpResponse
構造方式
Response(data, status=None, template_name=None, headers=None, content_type=None)
data 資料不要是render處理之後的資料,只需傳遞python的內建型別資料即可,REST framework會使用renderer渲染器處理data。
data 不能是複雜結構的資料,如Django的模型類物件,對於這樣的資料我們可以使用Serializer序列化器序列化處理後(轉為了Python字典型別)再傳遞給data引數。
引數說明:
- data: 為響應準備的序列化處理後的資料;
- status: 狀態碼,預設200;
- template_name: 模板名稱,在瀏覽器訪問看達到的模板,如果使用HTMLRenderer 時需指明;
- headers: 用於存放響應頭資訊的字典;
- content_type: 響應資料的Content-Type,通常此引數無需傳遞,REST framework會根據前端所需型別資料來設定該引數。
可以在rest_framework.settings查詢所有的drf預設配置項
全域性配置,在專案的settings.py 配置。
# 1. 後期 drf 的所有配置都寫在這個字典中
# 2. drf有個預設配置檔案(drf原始碼的--setting.py),如果沒有寫專案的配置檔案,則使用內建的,寫了優先使用專案的。
# 3. 返回樣式的配置,一般不配置。
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 預設響應渲染類
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 瀏覽API渲染器
)
}
區域性配置,只針對某個檢視函式。
匯入模組:
from rest_framework.renderers import BrowsableAPIRenderer, JSONRenderer
class BookView(APIView):
# 區域性配置。儘管全域性配置了,優先使用區域性的。
renderer_classes = [JSONRenderer]
def post(self, request):
print(request)
ser = BookSerializers(data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
def get(self, request):
book_list = Books.objects.all()
# many=True 代表序列化多條資料
ser = BookSerializers(instance=book_list, many=True)
"""
<class 'rest_framework.serializers.ListSerializer'>
ser 是ListSerializer的物件
"""
print(type(ser))
response = {'code': 100, 'msg': '查詢成功', 'result': ser.data}
#
return Response(response, status=status.HTTP_202_ACCEPTED, headers={'name': 'junjie'})