首页 > 其他分享 >drf之路由系统

drf之路由系统

时间:2023-02-06 22:12:00浏览次数:36  
标签:get 系统 send books action router 路由 drf

目录

路由系统

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

路由的三种写法

1.path('books/',views.BookView.as_view())
2.path('books/',views.BookView.as_view({'get':'list','post':'create'}))
3.自动生成

自动生成路由

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

标签:get,系统,send,books,action,router,路由,drf
From: https://www.cnblogs.com/zhanglanhua/p/17096855.html

相关文章

  • drf之认证组件
    目录认证组件登录接口认证功能认证组件访问某个接口,需要登录后才能访问编写模型表classUser(models.Model):username=models.CharField(max_length=32)pa......
  • 9 个视图子类、视图集、路由系统、认证组件
    9个视图子类、视图集、路由系统、认证组件9个视图子类#两个视图基类APIViewGenericAPIView1.APIView执行流程:新的request,三大认证,全局异常重写了as_vi......
  • drf-视图集、路由系统、action装饰器
    1.9个视图扩展类1.两个视图基类:APIView、GenricAPIView2.5个视图扩展类:CreateModelMixin,UpdateModelMixin,RetrieveModelMixin,ListModelMixin,DestroyModelMixin3.9......
  • DRF06
    9个视图子类 之前学的是:有两个视图基类,5个扩展类今天学的是:9个是视图子类:他就是真的视图类,就不需要继承GenerricAPIView,只要继承者9个中的其中一个,就会有某个,或者......
  • drf6
    今日内容概要9个视图子类视图集路由系统认证组件今日内容详细9个视图子类fromrest_framework.genericsimportCreateAPIView,ListAPIView,UpdateAPIView,Ret......
  • DRF - 视图组件
    视图组件drf的视图,视图类学过APIViewdrf的基类,drf提供的最顶层的类0、APIView与Django原生的View类的区别1.APIView中传入视图方法中的Request对象是RESTframework......
  • 装系统遇到 /dev/root does not exist 错误(找不到安装盘)
    解决方法:1、进入安装界面按e进入2、按e进入一下界面3、更改inst.stage2=hd:LABEL=CentOS\x207\x20x86_64为initrd=initrd.imgdd如下图然后按ctrl+x启动......
  • drf 自动生成路由
    目录drf路由系统SimpleRouter与DefaultRouteraction装饰器扩展测试伪代码drf路由系统由于继承了ViewSetMinxin类路由的写法变了,有三种写法。需要学习一下原生写法pa......
  • 视图集/路由自动生成
    9个视图子类在此文件中fromrest_framework.generics有九个视图子类功能分别如下9个视图子类---视图类,不需要额外继承GenericAPIView,只需要继承9个中其中某个,就会有......
  • 视图层与路由系统
    视图层两个视图基类APIViewGenericAPIView5个视图扩展类fromrest_framework.mixinsimportCreateModelMinin,UpdateModelMixin,DestroyModelMixin,......