路由组件

先来看下我们前面写的路由

from django.conf.urls import url, include
from .views import  BookModelView

urlpatterns = [
    url(r'^book/$', BookModelView.as_view({"get": "list", "post": "create"})),
    url(r'^book/(?P<pk>\d+)', BookModelView.as_view({"get": "retrieve", "put": "update", "delete": "destroy"})),
]

这样写路由也没有什么问题,DRF也提供给了我们另一种写法

from .views import  BookModelView
# 帮助我们生成带参数的路由
from rest_framework.routers import DefaultRouter

# 实例化DefaultRouter对象
router = DefaultRouter()

# 注册我们的路由以及视图
router.register(r'^book', BookModelView)


urlpatterns = [
   
]

# 把我们注册的路由添加到里面
urlpatterns += router.urls

我们在浏览器里输入错误的地址看DRF都给我们生成了哪些路由

^api/ ^^book/$ [name='book-list']
^api/ ^^book\.(?P<format>[a-z0-9]+)/?$ [name='book-list']
^api/ ^^book/(?P<pk>[^/.]+)/$ [name='book-detail']
^api/ ^^book/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='book-detail']
^api/ ^$ [name='api-root']
^api/ ^\.(?P<format>[a-z0-9]+)/?$ [name='api-root']

这样生成的路由需要在路径最后面加 / ,可以在实例化DefaultRouter对象的时候加个参数就可以了

router = DefaultRouter(trailing_slash=False)  # trailing_slash=False 不需要 / 结尾

这种注册路由得方法在实际项目中并不常用,因为把这些路由都开放,会造成一定的安全性

 版本控制

我们的网站要在不同的阶段加入不同的功能,restful规定了我们的接口要有版本号。但是不是所有人看到有更新就会更新的,所以我们的要兼容不同的版本。而前端肯定能拿到用户访问的是哪个版本的,这样,让前端的妹子把版本号传给后端,后端拿到版本号,做不同的处理,在把结果返回给前端就可以了。

既然我们知道了前端妹子可以拿到版本号,那怎么传给后端,是放在url里还是放在header里,或者是请求体里。这些都可以,妹子怎么高兴怎么来。

 

我们先来分析一下DRF里的源码是怎么写的

进入APIView类里,找到dispatch方法,找到下面的代码

try:
    self.initial(request, *args, **kwargs)

进入initial方法里

DRF--路由组件和版本控制
def initial(self, request, *args, **kwargs):
    """
    Runs anything that needs to occur prior to calling the method handler.
    """
    self.format_kwarg = self.get_format_suffix(**kwargs)

    # Perform content negotiation and store the accepted info on the request
    neg = self.perform_content_negotiation(request)
    request.accepted_renderer, request.accepted_media_type = neg

    # Determine the API version, if versioning is in use.
    # 初始化我们的版本
    version, scheme = self.determine_version(request, *args, **kwargs)
    request.version, request.versioning_scheme = version, scheme

    # Ensure that the incoming request is permitted
    # 认证组件
    self.perform_authentication(request)
    # 权限组件
    self.check_permissions(request)
    # 频率
    self.check_throttles(request)
View Code

相关文章: