1. 程式人生 > >**DRF框架基本使用**

**DRF框架基本使用**

DRF框架基本使用

1. 總綱

web開發的兩種模式(前後端不分離&前後端分離)
-> RestAPI設計風格
-> 使用Django基礎知識自定義一套RestAPI介面
-> 分析定義RestAPI介面開發時的主要工作
-> DRF框架的特點及使用。
2. web開發的兩種方式

開發方式 說明
前後端不分離 前端看到的頁面效果是由後端進行控制的,後端進行模板渲染,返回渲染之後完整頁面。
前後端分離 後端只返回前端所需要的資料,至於資料在前端怎麼展示,由前端自己控制。
3. Restful API設計風格

GET /books/: 返回所有圖書的資訊
GET /books/1/: 返回指定的圖書的資訊
POST /books/: 返回建立的圖書資訊
PUT /books/1/: 返回修改的圖書資訊
DELETE /books/1/: 空文件
RestfulAPI 風格關鍵點:

1)設計url地址時,地址儘量使用名詞,不要使用動詞。

2)執行不同的操作,要採用不同的請求方式。

GET 獲取
POST 新建
PUT 修改
DELETE 刪除
3)過濾引數放在查詢字串中。

4)響應狀態碼的選擇

200 獲取或修改
201 新建
204 刪除
400 客戶端請求有誤
404 請求的資源找不到
500 伺服器錯誤
5)響應資料返回json.

  1. 使用Django基礎知識自定義RestAPI介面

需求:

  1. 獲取所有圖書資訊 GET /books/
  2. 新增一本圖書資訊 POST /books/
  3. 獲取指定的圖書的資訊(根據id) GET /books/<圖書id>/
  4. 修改指定的圖書的資訊(根據id) PUT /books/<圖書id>/
  5. 刪除指定的圖書的資訊(根據id) DELETE /books/<圖書id>/
  6. 序列化&反序列化

序列化: 在上面例子中,把模型物件轉換為python字典或json資料過程,就叫做序列化過程。

反序列化: 在上面例子中,把字典資料和json資料轉換儲存到模型物件中過程,就叫做反序列化過程。

  1. 序列化器

1)定義序列化器類

from rest_framework import serializers

#serializers.Serializer: DRF框架中所有序列化器類父類
serializers.ModelSerializer: Serializer類的子類,在Serializer基礎上增加一些功能

class User(object):
“”“使用者類”""
def init(self, username, age):
self.username = username
self.age = age

class UserSerializer(serializers.Serializer):
“”“使用者序列化器類”""
# 序化器欄位名 = serializers.欄位型別(選項引數)
username = serializers.CharField()
age = serializers.IntegerField()

if name == ‘main’:
# 建立user物件
user = User(‘smart’, 18)

{
    'username': 'smart',
    'age': 18
}

# 建立一個序列化器類物件
serializer = UserSerializer(user)
# 獲取序列化之後資料
print(serializer.data)
1. 序列化器-序列化功能

1)序列化單個物件

獲取物件
book = BookInfo.objects.get(id=1)

建立序列化器物件
serializer = BookInfoSerializer(book)

#獲取序列化之後的資料
serializer.data
2)序列化多個物件

獲取所有的圖書
books = BookInfo.objects.all()

建立序列化器物件
serializer = BookInfoSerializer(books, many=True)

獲取序列化之後的資料
serializer.data
3)關聯物件的巢狀序列化

  1. 將關聯物件序列化為關聯物件的主鍵 PrimaryKeyRelatedField
    hbook = serializers.PrimaryKeyRelatedField(label=‘圖書’, read_only=True)

  2. 使用指定的序列化器將關聯物件進行序列化
    hbook = BookInfoSerializer(label=‘圖書’)

  3. 將關聯物件序列化為關聯物件模型類__str__方法返回值 StringRelatedField
    hbook = serializers.StringRelatedField(label=‘圖書’)

注意: 如果關聯的物件有多個,在定義欄位的時候,需要新增many=True
2. 序列化器-反序列化功能

1)反序列化-資料校驗

data = {‘btitle’: ‘python’, ‘bpub_date’: ‘1991-1-1’}

#建立序列化器物件
serializer = BookInfoSerializer(data=data)
#呼叫is_valid進行資料校驗
serilaizer.is_valid() # 校驗通過返回True,否則返回False
獲取校驗失敗的錯誤資訊
serializer.errors
#獲取校驗之後的資料
serializer.validated_data

補充序列化器驗證
#1. 自定義驗證方法,給序列化器對應的欄位增加選項引數validators
#2. 直接在序列化器類中定義驗證方法針對特定的欄位進行驗證,方法名稱: validate_
#3. 在序列化器類中定義validate方法進行驗證:結合多個欄位的內容進行驗證
2)反序列化-資料儲存

資料儲存之後必須通過校驗。

資料新增:

data = {‘btitle’: ‘python’, ‘bpub_date’: ‘1991-1-1’}
#建立序列化器物件
serializer = BookInfoSerializer(data=data)
呼叫is_valid進行資料校驗
serilaizer.is_valid() # 校驗通過返回True,否則返回False

#資料儲存,呼叫序列化器類中create,可以實現create方法實現資料新增
serializer.save()
資料更新:

book = BookInfo.objects.get(id=9)
data = {‘btitle’: ‘python-2’, ‘bpub_date’: ‘1991-1-1’}
建立序列化器物件
serializer = BookInfoSerializer(book,data=data)
呼叫is_valid進行資料校驗
serilaizer.is_valid() # 校驗通過返回True,否則返回False

資料儲存,呼叫序列化器類中update,可以實現update方法實現資料更新
serializer.save()
3. ModelSerializer

1)基於模型類的欄位自動生成序列化器類的欄位。

2)實現create和update方法。

  1. APIView檢視類

request物件: 不再是Django原始的HttpRequest物件,而是由DRF框架封裝成了Request類的物件。

​ request.data: 包含解析之後的請求體的資料,並且已經轉換成字典或類字典(QueryDict, OrderedDict) 相當於Django原始request物件中(request.POST, request.FILES, request.body) request.query_params: 包含查詢字串的資料,相當於Django原始request物件中request.GET

Response物件:

​ 直接返回Respone物件,傳入原始的響應資料,會根據客戶端的請求頭Accpet把響應資料轉換為對應的格式進行返回,預設返回json,僅支援json或html

異常處理: 將某些異常自動處理,給客戶端返回對應的錯誤資訊

其他功能:

1)認證

2)許可權

3)限流

  1. GenericAPIView

繼承自APIView,在APIView功能的基礎上,封裝操作序列化器和操作資料庫的方法,經常配合Mixin擴充套件進行使用。

序列化器操作:

屬性: serializer_class -> 指定檢視所使用序列化器類

方法:

​ get_serializer_class: 返回當前檢視所使用的序列化類

​ get_serializer: 建立一個序列化器類的物件

資料庫操作:

屬性: query set -> 指定檢視所使用的查詢集

方法:

​ get_queryset: 返回當前檢視所使用的查詢集

​ get_object: 從查詢集中查詢一個物件(預設根據主鍵pk進行查詢)

其他功能:

​ 1)分頁

​ 2)過濾
DRF框架

類名 說明
APIView 1)繼承自View,封裝了Django 本身的HttpRequest物件為Request物件。2)統一的異常處理。 3)認證&許可權&限流。
GenericAPIView 1)繼承自APIView,提供了操作序列化器和資料庫資料的方法,通常和Mixin擴充套件類配合使用。2)過濾&分頁。

  1. Mixin擴充套件類

DRF提供了5個擴充套件類,封裝了5個通用的操作流程。

類名 說明
ListModelMixin 提供了一個list方法,封裝了返回模型資料列表資訊的通用流程。
CreateModelMixin 提供了一個create方法,封裝了建立一個模型物件資料資訊的通用流程。
RetrieveModelMixin 提供了一個retrieve方法,封裝了獲取一個模型物件資料資訊的通用流程。
UpdateModelMixin 提供了一個update方法,封裝了更新一個模型物件資料資訊的通用流程。
DestroyModelMixin 提供了一個destroy方法,封裝了刪除一個模型物件資料資訊的通用流程。
2. 子類檢視

為了方便我們開發RestAPI,DRF框架除了提供APIView和GenericAPIView檢視類之外,還提供了一些子類檢視類,這些子類檢視類同時繼承了GenericAPIView和對應的Mixin擴充套件類,並且提供了對應的請求方法。

類名 說明
ListAPIView 1)繼承自ListModelMixin和GenericAPIView。2)如果想定義一個檢視只提供列出模型列表資訊的介面,繼承此檢視類是最快的方式。
CreateAPIView 1)繼承自CreateModelMixin和GenericAPIView。2)如果想定義一個檢視只提供建立一個模型資訊的介面,繼承此檢視類是最快的方式。
RetrieveAPIView 1)繼承自RetrieveModelMixin和GenericAPIView。2)如果想定義一個檢視只提供獲取一個模型資訊的介面,繼承此檢視類是最快的方式。
UpdateAPIView 1)繼承自UpdateModelMixin和GenericAPIView。2)如果只想定義一個檢視只提供更新一個模型資訊的介面,繼承此檢視類是最快的方式。
DestroyAPIView 1)繼承自DestroyModelMixin和GenericAPIView。2)如果只想定義一個檢視只提供刪除一個模型資訊的介面,繼承此檢視類是最快的方式。
ListCreateAPIView 1)繼承自ListModelMixin,CreateModelMixin和GenericAPIView。2)如果只想定義一個檢視提供列出模型列表和建立一個模型資訊的介面,繼承此檢視類是最快的方式。
RetrieveUpdateAPIView 1)繼承自RetrieveModelMixin,UpdateModelMixin和GenericAPIView。2)如果只想定義一個檢視提供獲取一個模型資訊和更新一個模型資訊的介面,繼承此檢視類是最快的方式。
RetrieveDestroyAPIView 1)繼承自RetrieveModelMixin,DestroyModelMixin和GenericAPIView。2)如果只想定義一個檢視提供獲取一個模型資訊和刪除一個模型資訊的介面,繼承此檢視類是最快的方式。
RetrieveUpdateDestoryAPIView 1)繼承自RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin和GenericAPIView。2)如果只想定義一個檢視提供獲取一個模型資訊和更新一個模型資訊和刪除一個模型資訊的介面,繼承此檢視類是最快的方式。
示例1:

需求1:寫一個檢視,只提供一個介面

1. 獲取一組圖書資料 GET /books/
class BookListView(ListAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

需求2:寫一個檢視,只提供一個介面

1. 獲取指定的圖書資料 GET /books/(?P<pk>\d+)/
class BookDetailView(RetrieveAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

需求3:寫一個檢視,只提供兩個介面

1. 獲取指定的圖書資料 GET /books/(?P<pk>\d+)/
2. 更新指定的圖書資料 PUT /books/(?P<pk>\d+)/
class BookDetailView(RetrieveUpdateAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
  1. 檢視集類

將操作同一組資源的處理方法放在同一個類中(檢視集),處理方法不要以請求方式命名,而是以對應的action命名,

​ list: 提供一組資料

​ create: 建立一條新資料

​ retrieve: 獲取指定的資料

​ update: 更新指定的資料

​ destroy: 刪除指定的資料

進行url配置時需要指明請求方法和處理函式之間的對應關係。

類名 說明
ViewSet 1)繼承自ViewSetMixin和APIView。2)如果使用檢視集時不涉及資料庫和序列化器的操作,可以直接繼承此類。
GenericViewSet 1)繼承自ViewSetMixin和GenericAPIView。2)如果使用檢視集涉及資料庫和序列化器的操作,可以直接繼承此類。
ModelViewSet 1)繼承自5個Mixin擴充套件類和GenericViewSet。2)如果使用檢視集想一次提供通用的5種操作,繼承這個類是最快的。
ReadOnlyModelViewSet 1)繼承自ListModelMixin,RetrieveModelMixin和GenericViewSet。2)如果使用檢視集想一次提供list操作和retrieve操作,繼承這個類是最快的。
示例1:

需求1:寫一個檢視集,提供以下兩種操作

1. 獲取一組圖書資訊(list) GET /books/
2. 新建一本圖書資訊(create) POST /books/
class BookInfoViewSet(ListModelMixin,
                      CreateModelMixin,
                      GenericViewSet)
	queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

需求2:寫一個檢視集,提供以下兩種操作

1. 獲取一組圖書資訊(list) GET /books/
2. 獲取指定圖書資訊(retrieve) GET /books/(?P<pk>\d+)/
class BookInfoViewSet(ReadOnlyModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

需求3:寫一個檢視集,提供以下三種操作

1. 獲取一組圖書資訊(list) GET /books/
2. 獲取指定圖書資訊(retrieve) GET /books/(?P<pk>\d+)/
3. 更新指定圖書資訊(update) PUT /books/(?P<pk>\d+)/
class BookInfoViewSet(UpdateModelMixin,
                      ReadOnlyModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

注: 除了常見的5種基本操作之外,如果想給一個檢視集中新增其他處理方法,直接在檢視集中定義即可。

  1. 路由Router

1)路由Router是專門配合檢視集來使用的,可以使用Router自動生成檢視集中相應處理函式對應的URL配置項。

2)使用Router自動生成檢視集中相應處理函式對應的URL配置項時,除了常見的5種基本操作之外,如果檢視集中有新增的其他處理方法,則需要給這些方法加上action裝飾器之後,才會動態生成其對應的URL配置項。

其他功能

認證&許可權