DRF前置及初識
WEB應用(開發)模式
API接口
# 即通過網絡,規定了前后臺信息交互規則的URL鏈接,也就是前后臺信息交互的媒介
postman的使用
# 一個用于發送http請求的工具
# params get方式就是請求地址中的參數,post方式就是請求體中的參數
# headers 即請求頭
# body 編碼格式等
Restful規范
# 10條規范
'''
1.數據的安全保障,采用https
2.接口的特征表現,即使用api關鍵字標識接口url
3.多數據版本共存,在url鏈接中標識數據版本
4.數據即資源,使用名詞
5.資源操作由請求方式確定
6.過濾,即通過URL傳參的方式傳遞搜索條件
7.響應狀態碼
8.錯誤處理,對錯誤應返回錯誤信息
9.返回結果符合規范
10.響應的數據里面可以帶鏈接
'''
drf安裝和使用
# settings INSTALLED APP中引入drf:'rest_framework'
# 配置數據庫
# 在models.py中寫表模型
class Book(models.Model):
# 新建一個python文件,書寫與上述模型對應的序列化類
from rest_framework.serializers import ModelSerializer
from app01.models import Book
class BookModelSerializer(ModelSerializer):
class Meta:
model = Book
fields = '__all__'
# 在視圖中寫視圖類
from rest_framework.viewsets import ModelViewSet
from .models import Book
from .ser import BookModelSerializer
class BooksViewSet(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookModelSerializer
# 配置路由關系
from app01 import views
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('books',views.BooksViewSet)
urlpatterns += router.urls
CBV源碼
# ModelViewSet繼承View(django原生View類)
# ModelViewSet>GenericViewSet>GenericAPIView>APIView>View
path('',views.Book.as_view()), # 此處應放函數內存地址
self.dispatch()
View源碼
'''
dispatch邏輯:
判斷是否在常規請求類型中,如果在:
通過反射拿到自定義類視圖函數中的具體方法的對應地址(默認not_allowed)給handler
如果不在,拿not_allowed內存地址給handler
return handler(request,*args,**kwargs)
即到此執行FBV
'''
APIView源碼
from rest_framework.views import APIView
# 局部禁用csrf,可以使用csrf_exempt(視圖函數)
# APIView重寫了as_view和dispatch方法
# APIView的as_view直接調用View中的as_view,然后封裝進新的屬性
# 在as_view return view后,路由匹配成功,view()會執行,并返回self.dispatch,根據MRO列表會自動選擇APIView中的dispatch方法,該方法會將原來的request通過自定義的Request類封裝進新的屬性并返回新的request對象,通過request._request調用原request對象可以驗證(僅驗證),經過封裝的新request對象使用原對象的屬性,這是因為自定義的Request類重寫了__getattr__方法,將self._request也就是原對象的屬性返回了。
新request對象
# 無論post請求發送了什么格式的數據,都可以從request.data中取出相應的數據(FILES仍可用)
# 對于get請求,可以從request.query_params(內部通過裝飾器將方法偽裝成的屬性)取出