drf-路由组件

发布时间 2023-05-24 22:41:48作者: 星空看海

一 路由Routers

路由写法有多种

-原始写法
-映射的写法:path('books/', BookView.as_view({'get': 'list', 'post': 'create'}))
-自动生成路由

1.1 什么情况下使用自动生成路由

    1 继承了 5个视图扩展类+ViewSetMixin的视图类,能自动生成路由(get:list,get:retrieve..)
    2 我们自己命名的: 方法名:login  send_sms,需要使用装饰器来做
        # 视图类:
        class SMSView(ViewSet):
            @action(methods=['GET'], detail=False, url_path='lqz', url_name='lqz')
            def lqz(self, request):
        # 路由
        router.register('lqz',SMSView,'lqz')
        # 路径是:http://127.0.0.1:8000/api/v1/lqz/lqz/
        
   3 action装饰器的参数

    methods:请求方式
    detail:一个True,一个False,用True,表示生成详情的路径 <int:pk>
    	# True,books/1/方法名/
        # False,books/方法名/
    url_path:路径名字,需要加上前面的路径一起,如果不加,默认以函数名作为路径名
    url_name:反向解析使用的名字(用的不多)

REST framework提供了两个router

  • SimpleRouter
  • DefaultRouter
from rest_framework.routers import SimpleRouter,DefaultRouter
 # 路由类,有两个,用法完全一致,区别是DefaultRouter生成的路径多
    SimpleRouter :用的最多
    DefaultRouter
    # DefaultRouter与SimpleRouter的区别是,DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。

1.2 自动生成路由使用方法

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

# 第二步:实例化得到对象
router = DefaultRouter()

# 第三步:注册路由(视图类)
router.register('前缀', 视图类, '起的别名')
router.register('books', BookView, 'books')
# router.register('publish',PublishView,'publish')

# 第四步:加入到路由中
# 4.1 方式一
urlpatterns = []
print(router.urls)
urlpatterns+=router.urls  # 列表的相加


# 4.2 使用include
path('api/v1/', include(router.urls)),

from django.urls import path, include
urlpatterns = [
    path('api/v1/', include(router.urls)),
    # api/v1/是路径的前缀,可以省略不写,直接写空 ''
    # path('lqz/', SMSView.as_view({'get': 'lqz'})),  # 我们都会,使用自动生成,如何做

]

1.3 代码演示

自定义方法,自动生成路由

视图函数

from rest_framework.viewsets import ModelViewSet, ViewSet, ViewSetMixin
from rest_framework.views import APIView

# 自己写的类,想要自动生成路由
# 需要使用装饰器 ---> 做映射
from rest_framework.decorators import action


# 参数:methods=None, detail=None, url_path=None, url_name=None
# class SMSView(ViewSetMixin,APIView):
class SMSView(ViewSet):
    @action(methods=['GET'], detail=True, url_name='xxx')
    def lqz(self, request):
        return Response('你好')
    
    

class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerialzier

    @action(methods=['GET'], detail=False)
    def login(self, request):
        # print(pk)
        return Response('登录成功')

路由

from app01.views import SMSView
# 第一步:导入一个路由类
from rest_framework.routers import SimpleRouter

# 第二步:实例化得到对象
router = SimpleRouter()

# 第三步:注册路由(视图类)
# http://127.0.0.1:8000/api/v1/lqz/xxx/
# lqz:router.register的前缀
# xxx:@action的参数url_name中指定的值,如果没有指定,就会使用方法名
router.register('lqz', SMSView, 'lqz')

# 第四步:加入到路由中
# 4,1 方式一
# urlpatterns = []
# urlpatterns+=router.urls
# 4.2 使用include
urlpatterns = [
    path('api/v1/', include(router.urls)),
]