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

猜你喜欢

转载自blog.csdn.net/qq_17513503/article/details/83350872