1. 程式人生 > >Rest Framework第三天-解析器執行流程、檢視層、路由

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']