Django REST frameworker
-
為什么使用DRF
- 在序列化與反序列化操作時,執行的過程相似,將重復的代碼簡化編寫
- 在開發REST API視圖時,每個視圖具體操作數據不同,但是CURD的實現流程基本套路化
-
特點
- 構建WEB API的強大工具。(DRF框架,是建立在Django框架上,二次開發項目)
- 提供了定義序列化器Serializer方法,快速根據Django ORM自動完成數據庫的序列化//反序列化
- 提供了豐富的類視圖、Mixin擴展類,簡化視圖的編寫
- 函數視圖、類視圖、視圖集合到自動生成API。多種身份驗證和權限驗證支持。
- 內置限流系統。直觀的API web界面
REST
? >>> Repersentational State Transfer("具象狀態傳輸"。一般解釋為“表現層 狀態轉換”。 )
? >>> REST是設計風格而不是標準,指Celent 和 Server 交互的形式。
-
Representational
具象:(表現層) Celent 訪問 Server 獲取資源的表現(html,txt,json。。。)
表現:獲取的資源對象,以什么形式展現出來-->在HTTP請求頭部中Accept和Content-Type字段中指定
State Transfer
狀態轉化:客戶端操作數據庫,必須通過某種手段,讓服務器發生狀態轉化
HTTP協議中:4個操作方式的動詞(GET、POST、PUT、DELETE )來表現 Celent 和 Server 交互的過程
RESTful架構
- 每一個URL代表一種資源
- 域名:將 api 部署在專用域名下
- 版本:將 API 的版本號放在 url 中
- 路徑:路徑表示 API 的具體網址。每個網址代表一種資源 。網址中不能有動詞,名詞一般=與數據庫的表名相對應,使用復數。
- 客戶端和服務器之間,傳遞這種資源的某種表現層
- 客戶端通過四個HTTP動詞,對服務器端資源進行操作,實現"表現層狀態轉化"。
REST接口開發核心任務
- 將程序中的一個數據庫結構類型(模型類對象)轉換為響應的數據(JSON、XML、Dict)——>序列化過程
- 對數據庫操作的過程。(封裝了對數據庫的操作方法)
- 將前端傳遞其他的格式(字典,JSON,XML)等轉化為程序中的數據(模型類對象)——>反序列化過程
DRF工程搭建
? >>>DRF框架依賴Django框架對其擴展應用,python。
- pip install djangorestframeworker
- 在INSTALLED_APPS里面注冊擴展應用
Serializer序列化器
? >>> 作用:1. 對數據對象進行轉換、響應 2.進行數據的校驗、保存
? >>> 定義:1. 自定義序列化器 繼承自:serializers.Serializer( 字段一一定義、校驗、創建、更新)
? 2. 繼承了最高級的序列化器語法 :serializers.ModelSerializer(指定model、fields)
創建Serializer對象
在View中調用創建好的序列化器對象
-
Serializer類構造方法:
**Serializer(instance=None, data=empty, **kwarg)
1.序列化:將模型類對象傳入instance
2.反序列化:將被反序列化的數據傳入data參數
3.構造Serializer對象時,可以添加context參數增加額外參數,用于View和序列化之間數據的傳遞
在序列化文件中通過context參數附加的數據,可以通過Serializer對象的context屬性獲取。
序列化
獲取模型類對象(根據模型類對象Django-ORM的CURD)
創建序列化器對象—>序列化操作(將模型類對象傳入)
獲取序列化的自定義字段(或者根據模型類字段,進行定義)
-
序列化器對象.data:data屬性獲取序列化對象的數據(字典,返回的數據就是定義在序列化器中定義的字段)
ser = BookInfoSerializer1(books, many=True)
return Response(ser.data)
反序列化器
反序列化時,需要對請求的數據驗證成功,才能對數據修改/保存模型類對象
反序列化前,必須調用is_valid()方法進行驗證,驗證成功返回True,否則返回False
驗證失敗,可使用序列化器對象的errors屬性獲取錯誤信息,字典形式返回{ '字段':'錯誤信息' }
-
驗證成功,可使用序列化器對象的validated_data屬性獲取數據.
1.先獲取數據
data = request.data
2.對獲取的數據進行校驗
ser = Serializer(data=data)
ser.is_valid()
3.添加數據
ser.save()
返回數據
return Response(ser.data)
反序列化注意點
- 在對序列化器進行save()保存時,可以額外傳遞數據,這些數據可以在create()和update()中的validated_data參數獲取到。
ser.save(owner=request.user)
def create(self, validated_data):
owner = validated_data.get('owner', None)
pass
def update(self, instance, validated_data):
instance.owner = validated_data.get('owner', None)
pass
-
默認序列化器必須傳遞所有required的字段,否則會拋出驗證異常。但是我們可以使用partial參數來允許部分字段更新
ser = Serializer(obj, data=data,partial=True)
視圖
Request
REST framework 提供了Parser解析器,請求后會自動根據Content-Type指明的請求數據類型,將請求數據進行parse解析,解析為類字典對象保存到Request對象中。
Request對象的數據是自動根據前端發送數據的格式進行解析之后的結果。
屬性
- .data
request.data 返回解析之后的請求體數據
- .query_params
request.query_params與Django標準的request.GET相同。
-
.user
請求的用戶對象(獲取已登陸的用戶請求對象)
Response
-
REST framework提供了一個響應類
Response
,使用該類構造響應對象時,響應的具體數據內容會被轉換(render渲染)成符合前端需求的類型。Response響應構造方式:
Response(data, status=None, template_name=None, headers=None, content_type=None)
data:傳給response對象的序列化后,但是沒有render處理的數據
REST framework提供了
Renderer
渲染器,用來根據請求頭中的Accept
(接收數據類型聲明)來自動轉換響應數據到對應格式。
狀態碼
信息告知 -1X
成功 -2X
重定向-3X(成功請求)
客戶端請求錯誤-4X
服務器錯誤-5X
視圖兩個基類
>>>作用:1.控制序列化器的執行 。2. 控制數據庫查詢的執行
APIView
封裝繼承Django的View父類,提供了所有的視圖基類
APIView視圖中沒有封裝HTTP的動作方法;還需自定義方法
APIView和View的區別
傳入了視圖Resquest和Response對象不同
任何APIException異常都會被捕獲到
-
在基類View進行dispatch()分發前,會對請求進行身份驗證、權限驗證、流量控制
屬性
- authentication_classes :身份驗證
- permissoin_classes :權限認證
- throttle_classes :流量控制
GenericAPIView
序列化器使用:
-
屬性和方法
屬性: serializer_class指明視圖中使用的序列化器
方法:get_serializer() 獲取序列化器對象(可重寫)
注意點:該方法提供序列化器對象的時候,會向序列化器對象的context屬性傳遞三個數據 。
def get_serializer(self, *args, **kwargs): """ Return the serializer instance that should be used for validating and deserializing input, and for serializing output. """ serializer_class = self.get_serializer_class() kwargs['context'] = self.get_serializer_context() # 返回序列化器對象 return serializer_class(*args, **kwargs) def get_serializer_context(self): """ 在定義序列化器對象時候使用,會向序列化器對象的context屬性補充三個數據 """ return { 'request': self.request, # 當前視圖的請求對象 'format': self.format_kwarg, 'view': self #當前請求的類視圖對象 }
數據庫的使用:
-
屬性和方法:
屬性:queryset 指明數據庫的查詢集—>數據庫特性:惰性/緩存
方法:get_queryset()獲取數據對象,返回查詢集queryset屬性;get_object(self)獲取單個的查詢對象
def get_query(self): "對其方法的重寫,返回指定的查詢集對象" category_id = self.kwargs["category_id"] # 向指定的查詢集添加屬性;獲取分類id對象 hot_skus = SKu.object.filter(category_id=category_id,is_launched=True) return hot_skus def view(request, *args, **kwargs): """在路由中獲取數據,保存在View視圖中“”“ self = cls(**initkwargs) if hasattr(self, 'get') and not hasattr(self, 'head'): self.head = self.get self.request = request # 。。。 self.args = args self.kwargs = kwargs # 。。。 return self.dispatch(request, *args, **kwargs)
-
其他屬性
pagination_class 指明分頁控制類(自定義分頁器)
class LargeResultsSetPagination(PageNumberPagination): """ 自定義分頁器,繼承分頁器PageNumberPagination 請求方法:127.0.0.1/books/?page=1&page_size=5 """ page_size = 5 # 每頁的數量 max_page_size = 10 # 前端最多能設置的每頁數量 # page_query_param = 'page' # 前端發送的頁數關鍵字名,默認為"page" page_size_query_param = 'page_size' # 前端發送的每頁數目關鍵字名,默認為None
filter_backends 指明過濾控制后端
五個擴展類
作用:提供后端視圖對數據庫的CURD處理流程的實現,繼承擴展類來復用代碼
兩個基本類:就是為擴展類提供屬性和方法。五個擴展類需要搭配基類(GenericAPIView)
? 要實現序列化器與數據庫的查詢的方法。
-
方法
1)ListModelMixin 2)CreateModelMixin
3) RetrieveModelMixin 4)UpdateModelMixin 5)DestroyModelMixin