python-关于django中视图及视图集概括


==================================================视图
Django REST framework提供的视图主要作用"
    控制序列化器的执行(检验,保存,转换数据)
    控制数据库查询的执行
===============================Request和Response
Request : REST framework传入视图的Request不在是Django默认的HttpRequest,而是REST framework提供的
        扩展了HttpRequest类的Request类的对象
        REST framework 提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据
        类型(如JSON、表单等)将请求数据进行parse解析,解析为类字典对象保存到Request对象中.
        Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果
        常用属性:
            request.data 返回解析之后的请求体数据,类似django中的request.POST和request.FILES属性
                包含了解析之后的文件和非文件数据
                包含了对POST,PUT,PATCH请求方式解析后的数据
                利用了REST framework的parsers解析器,不仅支持表单类型,也支持JSON数据
            request.query_params 与django中的request.GET相同
Response : REST framework提供了一个响应类Response,构造对象时,响应的具体内容被渲染成前端需要的类型
        REST framework提供了Renderer渲染器,根据请求头中的Accept(接收请求类型声明)转换对应格式
        可以更改默认
            REST_FRAMEWORK = {
            'DEFAULT_RENDERER_CLASSES': (  # 默认响应渲染类
                'rest_framework.renderers.JSONRenderer',  # json渲染器
                'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览API渲染器
                )
            }
        构造方式:Response(data,status=None, template_name=None, headers=None, content_type=None)
            data 不要render处理后的数据,Response会用renderer渲染器处理data
            data 不能是复杂的结构数据,如django模型类对象(先用serializer序列化后(字典)再传给data
            属性: .data传给response对象序列化后,但未render处理的数据
                    .status_code 状态码数字
                    .content 经过render处理后的数据
            状态码: 1xx 信息告知; 2xx 成功; 3xx 重定向; 4xx 客户端错误; 5xx 服务器错误
====================================视图中基类
1. 两个基类:
    1. APIView  from rest_framework.views import APIView
        REST framework中提供的所有视图的基类,继承自django的view父类
        两者不同: 1> APIView传入视图方法中的是REST framework中的request对象,不是django中的HttpRequest
                2> 视图方法返回Response对象,为响应数据render符合前端的格式
                3> 任何APIexception异常都会被扑捉到并处理成合适的响应信息
                4> 进行dispatch分发前,对请求进行身份验证,权限检查,流量控制等
        支持定义的属性:
                authentication_classes 列表或元祖,身份认证类
                permissoin_classes 列表或元祖,权限检查类
                throttle_classes 列表或元祖,流量控制类
    2. GenericAPIView  from rest_framework.generics import GenericAPIView
        继承自 APIView 主要增加了操作序列化器和数据库查询的方法,作用是为Minxin扩展类的执行提供方法支持,
        关于序列化器使用的属性和方法:
            属性: serializer_class 指明视图使用的序列化器
            方法: get_serializer_class(self) 返回序列化器类,默认返回serializer_class
                    get_serializer(self,*args,**kwargs) 返回序列化器类对象, 用于提供给扩展类使用
                    可以直接调用该方法
                    该方法在提供序列化器对象的时候,会向序列化器类对象的context属性补充三个参数
                    request:当前视图请求对象;view:当前请求的类视图对象;format:当前请求期望返回的数据格式
        关于数据库查询的属性和方法:
            属性: queryset 指明使用的数据库查询集
            方法: get_queryset(self) 返回视图使用的查询集,为扩展类使用,列表视图和详情视图获取数据的基础
                    默认返回queryset属性
                    get_object(self) 返回详情视图所需的模型类数据对象,给扩展类使用,在视图中调用该方法获取
                    详情信息的模型类对象,若模型类对象不存在,返回404,默认使用APIView提供的
                    check_object_permission检查当前对象访问权限
            其他可以设置的属性:
                    pagination_class 指明分页控制类
                    filter_backends 指明过滤控制后端
2.五个扩展类 需要搭配 GenericAPIView父类 五个扩展类的实现需要调用GenericAPIView提供的序列化器和数据查询方法
    作用 提供了几种后端视图对数据增删改查处理流程的实现,直接继承,减少代码量
    1> ListModelMixin 列表视图扩展类 提供了list(request,*args,**kwargs) 会对数据过滤和分页 返回200
    2> CreateModelMixin 创建视图扩展类 提供了create(request,*args,**kwargs) 创建资源的视图 返回201
    3> RetrieveModelMixin 详情视图扩展类 retrieve(...)返回一个存在的数据对象 存在返回200 否则 404
    4> UpdateModelMixin 更新视图扩展类 update(...) 更新一个存在的数据对象 成功 200 序列化校验失败404
                            同时提供了partial_update(...) 实现局部更新
    5> DestoryModelMixin 删除视图扩展类 destory(...) 删除一个存在的数据对象 成功204 不存在 404
3. 几个可用子类视图
    1) CreateAPIView
    提供 post 方法
    继承自: GenericAPIView、CreateModelMixin
    2)ListAPIView
    提供 get 方法
    继承自:GenericAPIView、ListModelMixin
    3)RetrieveAPIView
    提供 get 方法
    继承自: GenericAPIView、RetrieveModelMixin
    4)DestoryAPIView
    提供 delete 方法
    继承自:GenericAPIView、DestoryModelMixin
    5)UpdateAPIView
    提供 put 和 patch 方法
    继承自:GenericAPIView、UpdateModelMixin
    6)ListCreateAPIView
    提供 get、post方法
    继承自: GenericAPIView、ListModelMixin、CreateModelMixin
    7)RetrieveUpdateAPIView
    提供 get、put、patch方法
    继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin
    8)RetrieveUpdateDestoryAPIView
    提供 get、put、patch、delete方法
    继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin
======================================视图集 ViewSet
作用:使用视图集可以将一系列的逻辑相关的动作放到一个类中,不再实现get,post方法,而是实现动作list()等
    只有在路由设置使用as_view()方法,将动作与请求方式对应上
    list() 提供一组数据
    retrieve() 提供单个数据
    create() 创建数据
    update() 保存数据
    destory() 删除数据
常用视图集父类:
    1. ViewSet 继承自APIView与ViewSetMixin 作用也和APIView相似,提供了身份验证,权限校验,流量控制等
        ViewSet主要通过继承ViewSetMixin来实现调用as_view({'get':'list'})映射处理,list()方法需要写
    2. GenericViewSet 继承自GenericAPIView 与 ViewSetMixin 映射处理时也提供了GenericAPIView方法
        直接搭配Mixin扩展类使用,不用写list()等方法
        class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
            queryset = BookInfo.objects.all()
            serializer_class = BookInfoSerializer
    3. ModelViewSet 继承自GenericViewSet 同时包括了五个扩展类 ListModelMixin等
    4. ReadOnlyModelViewSet 继承自GenericViewSet 同时包括了ListModeMixin和RetrieveModelMixin
视图集中定义附加action动作:
    在视图集中使用rest_framework.decorators.action装饰器添加自定义动作
    action装饰器接收两个参数:
        methods:该action支持的请求方式,列表传递
        detail:action中要处理的是否是视图资源对象(即是否通过url路径获取主键)
            True:使用通过url路径获取的主键对应的数据对象
            False:不使用url获取主键
            action属性, if self.actio == 'create'
=======================================路由Routers
两个router实现快速设置路由信息: from rest_framework.routers import SimpleRouter,DefaultRouter
自动设置路由:
    routers = SimpleRouter()/DefaultRouter()
    routers.register(books,views.BookInfoViewSet,base_name='books')
    urlpatterns += routers.urls
    
DefaultRouter与SimpleRouter的区别是,DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图
    的超链接响应数据。

 

你可能感兴趣的:(python,django)