93 restframework的视图组件, 路由组件, 版本控制

主要内容:

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)
					

  

 

原文地址:https://www.cnblogs.com/gyh412724/p/9984794.html