Rest Framework第三天-解析器執行流程、檢視層、路由
resfu規範:
1 名詞(不要用get_book)
2 /books/1 通過請求方式,get請求,通過id拿書的資訊
/books/ post請求,生成一本書的資訊
put請求 更新
delete請求 刪除
3 建議用https
4 版本
方式一 - http://www.baidu.com/api/v1/....
方式二 -http://www.baidu.com/api/books/?version=v1
5 域名:---api.baidu.com/.....(會發生跨域問題)
---http://www.baidu.com/api/
6 狀態碼:--自己請求的狀態碼
---自己定義的狀態碼(最好是數字)
7 錯誤資訊: msg
8 返回結果帶連線(很少)
9 過濾:http://www.baidu.com/api/v1/book/?page=10
10 返回結果:修改,新增---返回整個資料
刪除---返回空
查詢---查詢結果
APIView
---重寫了View
---as_view()方法
---dispatch()方法
Django請求生命週期:
--瀏覽器使用者發請求---->ngix(代理靜態檔案)+uwsgi(socket伺服器)--->中介軟體--->urls--(APIView加了一些東西)-->檢視函式---(拿資料,拿模板)返回
序列化元件(核心):
--Serializer類
---class Book(Serializer類):
title=CharField() 不寫sorce屬性要跟models裡屬性對應
xx=CharField(source=title) source --既可以是欄位,又可以是方法
authors=SerializerMethodField() --結合下面的方法來獲取對應的值
def get_ss(self,obj): obj 是一個book物件
return
--ModelSerializer類
class Book(ModelSerializer類):
class Meta:
model=表
fields='__all__'
#fields=['title','id'] --元組或者列表都可以
#exclude=('title','id') 除了誰之外(不能同時跟fields同時用)
depth=1 #獲取的深度控制,寫幾往裡拿幾層,層數越多,響應越慢,官方建議0--10之間,個人建議最多3層
#獲取作者詳細資訊
authors=SerializerMethodField()
def get_ss(self,obj): obj 是一個book物件
return
資料校驗功能:
-全域性鉤子函式
def validate(self,attrs):
title=attrs.get('title')
-區域性鉤子函式
def validate_title(self,attrs)
#對attrs進行判斷
-is_valid (校驗通過就是true)
ser.save() 儲存,更新,都可以----ser必須是繼承 ModelSerializer類 的物件
Forms
全域性鉤子:
def clean(self):
self.clean_data.get('pwd')
解析器:
request.data
---全域性配置
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser']
}
---區域性配置
class BookView(APIView):
parser_classes = [JSONParser,]
檢視層:(培養封裝程式碼的能力)
方式一:最多
增刪查改自己寫,最原始的方式
方式二:較多
class Publish(GenericAPIView,mixins.CreateModelMixin,mixins.ListModelMixin):
get方法
#加自己的邏輯
self.list()
post方法
方式三: class Publish(ListCreateAPIView):
-ListCreateAPIView繼承了:CreateModelMixin,ListModelMixin,GenericAPIView
RetrieveUpdateDestroyAPIView
-RetrieveUpdateDestroyAPIView繼成了:
方式四:(較多)
class Publish(ModelViewSet):
queryset = models.Publish.objects.all()
serializer_class = PublishSer
urls:
url(r'^publish/$', views.Publish.as_view({'get':'list','post':'create'})),
url(r'^publish/(?P<pk>\d+)', views.Publish.as_view({'get':'retrieve','put':'update','delete':'destroy'})),
路由:
1 原始方式(這種方式用的最多)
# url(r'^publish/$', views.Publish.as_view()),
# url(r'^publish/(?P<pk>\d+)', views.PublishDetail.as_view()),
2 半自動路由(需要繼承ModelViewSet)
url(r'^publish/$', views.Publish.as_view({'get':'list','post':'create'})),
url(r'^publish/(?P<pk>\d+)', views.Publish.as_view({'get':'retrieve','put':'update','delete':'destroy'})),
3 全自動(需要繼承ModelViewSet)
1 from rest_framework import routers
2 router=routers.DefaultRouter()
3 router.register('publish',views.Publish) 第一個引數:路由的地址 第二個引數:檢視函式
4 urlpatterns = [
url(r'api/v1/', include(router.urls)),
]
^publish/$ [name='publish-list']
^publish\.(?P<format>[a-z0-9]+)/?$ [name='publish-list']
^publish/(?P<pk>[^/.]+)/$ [name='publish-detail']
^publish/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='publish-detail']