drf06 路由组件


drf06 路由组件

路由Routers

路由的书写方法一

# 视图层
from rest_framework.viewsets import ViewSetMixin,ViewSet
'''同时继承两个类太不方便了,'''
# class LoginView(ViewSet): 继承ViewSet和继承下面的是一个效果

class LoginView(ViewSetMixin, APIView):  # ViewSetMixin只是重写了as_view,但是没有继承View,所以还有继承APIView才是视图基类
    def login(self,request):
        return Response('登录成功')
    
# 路由层
from app01 import views
urlpatterns = [
    path('login/', views.LoginView.as_view({'post': 'login'})),  # 请求去视图函数里面,是哪个请求执行对应方法
    
''' ({'post': 'login'})就是路由的第一种写法 '''

路由的书写方法二:自动生成路由

使用方法

    对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。
# REST framework提供了两个router:
from rest_framework.routers import SimpleRouter,DefaultRouter
    SimpleRouter
    DefaultRouter  # 会比SimpleRouter多生成一个根路由 
    "publish": "http://127.0.0.1:8000/publish/"

SimpleRouter方式一:前提必须继承ViewSet

视图层views.py

# 自动生成路由
from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet, ViewSet, ViewSetMixin, GenericViewSet

# 继承这个5个接口都有了,但是5个接口有两个get
class PublishViews(ModelViewSet):
    queryset = Publish.objects.all()
    serializer_class = PublishModelSerializer

路由层urls.py

from app01 import views

# 第一步在路由层导入路由类
from rest_framework.routers import SimpleRouter,DefaultRouter
# 第二步:类实例化得到对象(不用传参数)
router = SimpleRouter()
# 第三步:注册视图类
router.register('publish', views.PublishViews, 'publish')  # 第三个参数:反向解析
# 第四步:加入到总路由中(两种方式)
print(router.urls)  # [, [^/.]+)/$' [name='publish-detail']>]

urlpatterns = [

]
# 第四步:加入到总路由中:方式一
urlpatterns += router.urls

SimpleRouter方式二:前提必须继承ViewSet

from django.urls import path, include
from app01 import views

# 第一步在路由层导入路由类
from rest_framework.routers import SimpleRouter,DefaultRouter
# 第二步:类实例化得到对象(不用传参数)
router = SimpleRouter()
# 第三步:注册视图类
router.register('publish', views.PublishViews, 'publish')  # 第三个参数:反向解析
# 第四步:加入到总路由中(两种方式)
print(router.urls)  # [, [^/.]+)/$' [name='publish-detail']>]

urlpatterns = [
    # 第四步:加入到总路由中:方式二
	path('api/vi/', include(router.urls))
]

DefaultRoute使用方式:前提必须继承ViewSet

from django.urls import path, include
from app01 import views

# 第一步在路由层导入路由类
from rest_framework.routers import SimpleRouter,DefaultRouter
# 第二步:类实例化得到对象(不用传参数)
router = DefaultRouter()
# 第三步:注册视图类
router.register('publish', views.PublishViews, 'publish')  # 第三个参数:反向解析
# 第四步:加入到总路由中(两种方式)
print(router.urls)  # [, [^/.]+)/$' [name='publish-detail']>]

urlpatterns = [
    # 第四步:加入到总路由中:方式二
	path('api/vi/', include(router.urls))
]

'''会生成一个根路由'''

![](C:\Users\Lenovo\Pictures\Camera Roll\5.png)

自动生成路由之指定请求方式

视图层

from rest_framework.decorators import action
from rest_framework.viewsets import ViewSet

class LoginView(ViewSet):
    # url_path = '路径名,默认是函数名', url_name = '反向解析'
    @action(methods=['GET'], detail=False)
    def login(self, request):  # 自己写的方法,需要加装饰器
        print(request.data)
        return Response('登录成功')

路由层

from django.urls import path, include
from app01 import views

# 第一步在路由层导入路由类
from rest_framework.routers import SimpleRouter, DefaultRouter

# 第二步:类实例化得到对象(不用传参数)
router = SimpleRouter()
# 第三步:注册视图类
router.register('user', views.LoginView, 'user')
# 第四步:加入到总路由中(两种方式)

urlpatterns = [
    # 方式二:
    path('', include(router.urls))
]

总结

1.第一种:
	path('publish/', views.PublishView.as_view(actions={'get': 'list','post':'create'}))

2.第二种:
	自动生成 (SimpleRouter,DefaultRouter)
    
3.action有什么用?
	5个方法:create,list,destory。。,不需要使用action映射
    如果继承的是 ViewSetMixin, views.APIView +5个视图扩展类之一或者9个视图子类,这种不需要使用action装饰器
    # 因为上述这些,已经都做好了,自己写的方法都需要加action装饰器
drf