目录
路由系统
drf
由于继承ViewSetMixin
类,路由写法就改变了
路由的三种写法
1.path('books/',views.BookView.as_view())
2.path('books/',views.BookView.as_view({'get':'list','post':'create'}))
3.自动生成
自动生成路由
drf
提供了两个路由类,继承ModelViewSet
后,路由可以自动生成
步骤
-
导入路由类
-
实例化得到对象(两个类,一般使用
SimpleRouter
) -
注册`router.register('books',views.BookView,'books)
-
在
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