==================================================视图
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根视图,返回一个包含所有列表视图
的超链接响应数据。