主要内容:
1 视图组件:
a : 第一次封装: GenericAPIView:
设置query_set和serializers_clas
获取值得两种方法
封装视图类ListModelMixin
...
各个视图方法封成类
视图:
class BookView(ListCreateAPIView): queryset = Book.objects.all() serializer_class = BookSerializer def get(self, request): return self.list(request)
b : 第二次封装:
写了两个类, 方便继承
c : 第三次封装
ViewSetMixin, 重写了as_view方法
执行self.dispatch()方法前, 把self.get = list
在ViewSetMixin后可以传参数
由于as_view不能传参数, 所以引了rest_framework.
from rest_framework.viewsets import ViewSetMixin
viewsets重写了as_view方法, 参数被acton接收
重新分发把list给了get, 然后再执行dispatch方法, 执行getpost方法
注意点:
如果用restframework写的modelviewset方法, 此时关键字是pk, 不能用id url(r'^book/(?P<pk>d+)$', views.BookModelView.as_view({"get": "retrieve", "put": "update", "delete": "destroy"})),
2 : 路由组件
a : 路由组件的使用:
# 帮助我们生成带参数的路由 from rest_framework.routers import DefaultRouter # 实例化DefaultRouter对象 router = DefaultRouter() # 注册我们的路由以及视图 router.register(r'^book', BookModelView) urlpatterns += router.urls
b : 源码流程:
从defaultrouter进去
找到get_url, 走到父类的get_url
3 版本控制:
版本不同信息不同,
前端传来的版本号, 后端做处理
匹配到真正的视图之前, 做好版本控制
在封装request之后, 在分发视图之前
# 初始化我们的版本 version, scheme = self.determine_version(request, *args, **kwargs) request.version, request.versioning_scheme = version, scheme -- def determine_version(self, request, *args, **kwargs): if self.versioning_class is None: return (None, None) scheme = self.versioning_class() # scheme我配置的版本控制类的实例化对象 # 调用了determine_version(request, *args, **kwargs) # 把方法的返回值给version return (scheme.determine_version(request, *args, **kwargs), scheme)