Welcome to kimi's blog

drf之路由系统

路由系统

drf由于继承ViewSetMixin类,路由写法就改变了

路由的三种写法

1.传统写法:path('books/',views.BookView.as_view())
2.映射写法:引入actions装饰器 
     path('books/',views.BookView.as_view({'get':'list','post':'create'}))
3.自动生成
    两个类`SimpleRouter, DefaultRouter`,加入到路由中:两种(include,列表直接加)
	urlpatterns += router.urls
	include:path('/api/v1/',include(router.urls))

自动生成路由

drf提供了两个路由类,继承ModelViewSet 后,路由可以自动生成

步骤

  1. 导入路由类

  2. 实例化得到对象(两个类,一般使用SimpleRouter)

  3. 注册`router.register('books',views.BookView,'books)

  4. urlpatterns中注册,两种方式

    1.urlpatterns += router.urls
    
        # 第一步:导入路由类
        from rest_framework.routers import SimpleRouter, DefaultRouter
        # 第二步,实例化得到对象
        router = SimpleRouter() 
        # 第三步:注册
        router.register('books', views.BookView, 'books')  # 路径和试图类建立关系  有几个视图类就要写几次
        # 第四步:在urlpatterns中注册,两种方式
        urlpatterns += router.urls
        print(
            router.urls)  # [<URLPattern '^books/$' [name='books-list']>, <URLPattern '^books/(?P<pk>[^/.]+)/$' [name='books-detail']>]
        
    2.include:path('/api/v1/',include(router.urls))  # 方式多一些
        # 第一步:导入路由类
        from rest_framework.routers import SimpleRouter, DefaultRouter
        # 第二步,实例化得到对象
        router = SimpleRouter() 
        # 第三步:注册
        router.register('books', views.BookView, 'books')  # 路径和试图类建立关系  有几个视图类就要写几次
        # 第四步:在urlpatterns中注册,两种方式
        path('api/v1/',include(router.urls))
        查询的时候要加上api/v1/
    

底层实现自动生成路由

本质是自动做映射,能够自动成的前提,视图类中要有5个方法的一种或多种方法

get----->list
get----->retrieve
put----->put
post---->create
delete-->destroy

注:
1. ModelViewSet,ReadOnlyModelViewSet可以自动生成
2.9个视图子类 + 配合ViewSetMixin   才可以自动生成
3.GenericAPIView + 5个视图扩展类 + 配合 ViewSetMixin   才能自动生成

action装饰器

action写在类视图的方法上,可以自动生成路由

1.先导入装饰器

from rest_framework.decorators import action  
# 路由
from rest_framework.routers import SimpleRouter,DefaultRouter
router = SimpleRouter() 
# api/v1/send/send_sms  ----get 请求 会执行send_sms
router.register('send',views.SendView,'send')  # # /api/v1/user/login   post 请求
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/',include(router.urls))
]

# 浏览器
http://127.0.0.1:8000/api/v1/send/1/send_sms/?phone=123434

# 写在视图类方法上
class SendView(ViewSet):
    """
    def action(methods=None, detail=None, url_path=None, url_name=None, **kwargs)
    methods指请求方法,可以传多个
    detail: 只能传True和False
    		False,不带id的路径--->send/send_sms/
    		True,带id的路径----->send/1/send-sms/
    url_path:生成send后路径的名字,默认以方法名命名
    url_name:别名,反向解析使用,了解即可
    
    """

    @action(methods=['GET'], detail=True)
    def send_sms(self, request,pk):
        phone = request.query_params.get('phone')
        print('发送成功%s' % phone)
        return Response({'code': 100, 'msg': '发送成功'})

    后期的drf路由写法
       后期都是自动生成,一般不再urlpatterns加入路由

补充知识

class SendView(GenericViewSet):
    queryset = None
    serializer_class = '序列化类'

    """ 由于有多个get方法,需要重写get_serializer(self,*args,**kwargs)判断是哪个get"""
    def get_serializer(self,*args,**kwargs):
        if self.action== 'login':
            return '序列化1'
        else:
            return '序列化2'


    @action(methods=['GET'], detail=True)
    def send_sms(self, request,pk):
        phone = request.query_params.get('phone')
        print('发送成功%s' % phone)
        return Response({'code': 100, 'msg': '发送成功'})

    @action(methods=['GET'],detail=True)
    def login(self,request):
        # 序列化1
        pass

    @action(methods=['GET'], detail=True)
    def reg(self,request):
        # 序列化类2
        pass

posted @   魔女宅急便  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
Title
点击右上角即可分享
微信分享提示

目录导航