DRF框架路由组件

Posted st-st

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DRF框架路由组件相关的知识,希望对你有一定的参考价值。

视图组件涉及的路由补充:

  from rest_framework.viewsets import ViewSetMixin

  对路由进行了重新的分发,重写了as_view() 方法,重新封装了请求方法

from rest_framework.viewsets import ViewSetMixin

class ViewSetMixin(object):
    """
    This is the magic.

    Overrides `.as_view()` so that it takes an `actions` keyword that performs
    the binding of HTTP methods to actions on the Resource.

    For example, to create a concrete view binding the ‘GET‘ and ‘POST‘ methods
    to the ‘list‘ and ‘create‘ actions...

    view = MyViewSet.as_view({‘get‘: ‘list‘, ‘post‘: ‘create‘})
    """

    @classonlymethod
    def as_view(cls, actions=None, **initkwargs):
        # actions就是传入的字典
        
        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            self.action_map = actions

            # 循环字典{"get":"list"}
            for method, action in actions.items():
                # self是定义的视图类
                handler = getattr(self, action)
                # 将self.get 改为 self.list
                setattr(self, method, handler)

            if hasattr(self, get) and not hasattr(self, head):
                self.head = self.get

            self.request = request
            self.args = args
            self.kwargs = kwargs
            
            # 重新执行分发
            return self.dispatch(request, *args, **kwargs)

        return csrf_exempt(view)

# APIView
        def dispatch(self, request, *args, **kwargs):
        
        try:
            self.initial(request, *args, **kwargs)

            # 重新封装分发
            # self.get已经是self.list
            if request.method.lower() in self.http_method_names:
                handler = getattr(self, request.method.lower(),
                                  self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed

            response = handler(request, *args, **kwargs)

        except Exception as exc:
            response = self.handle_exception(exc)

        self.response = self.finalize_response(request, response, *args, **kwargs)
        return self.response

 

路由组件

from rest_framework.routers import DefaultRouter

# urls.py
from django.conf.urls import url
from rest_framework.routers import DefaultRouter
from .view4 import BookView

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

# 注册路由和视图
router.register(rbook_list,BookView)

urlpatterns = [

]

# 添加到路由列表中
urlpatterns += router.urls

 

自动生成的路由

默认生成的路由都是带参数的!

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

 

以上是关于DRF框架路由组件的主要内容,如果未能解决你的问题,请参考以下文章

drf 框架

drf框架与postman初始

DRF框架认证组件

DRF路由组件

DRF 之 路由组件

drf-路由组件