目录
一 路由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)),
]
标签:lqz,DefaultRouter,视图,path,组件,router,路由,drf
From: https://www.cnblogs.com/zjyao/p/17429725.html