drf-路由组件
目录
一 路由Routers
路由写法有多种
- 1. 原始写法: path('books/', BookView.as_view())
- 2. 映射的写法:path('books/', BookView.as_view({'get': 'list', 'post': 'create'}))
- 3. 自动生成路由
二 映射路由
2.1 什么情况下使用映射
- 继承了ViewSetMixin及其子类的视图类
- 自己写的视图方法
2.2 继承了ViewSetMixin的视图类
例如继承了ModelViewSet的类:
视图类:
from .models import Book
from .serializer import BookSerializer
from rest_framework.viewsets import ModelViewSet
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerialzier
路由:
urlpatterns = [
path('books/', BookView.as_view({'get': 'list', 'post': 'create'})),
path('books/<int:pk>/', BookView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
]
2.3 自己写的视图方法映射
视图类
class SMSView(ViewSet):
def lqz(self, request):
return Response('你好')
路由
path('lqz/', SMSView.as_view({'get': 'lqz'}))
三 自动生成路由
3.1 什么情况下使用自动生成路由
- 继承了ViewSetMixin及其子类的视图类
# 继承了ViewSetMixin的视图类,自动生成的路由只有以下5中映射:
get:list /books/
get:retrieve
post:create
put:update /books/1/
delete:destory
如果你在类中写了get方法,根本不会执行。因为get请求被映射成list方法。
- 我们自己命名的: 方法名:login send_sms,需要使用装饰器来做,类也要继承ViewSetMixin及其子类。
# 视图类:
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/
# 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根视图,返回一个包含所有列表视图的超链接响应数据。
3.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'})), # 我们都会,使用自动生成,如何做
]
3.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):
# /api/v1/lqz/1/xxx/
@action(methods=['GET'], detail=True, url_name='xxx')
def lqz(self, request):
return Response('你好')
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerialzier
# methods可以写多个
# get请求跟post请求都映射到login
@action(methods=['GET', 'POST'], detail=False)
def login(self, request):
# print(pk)
return Response('登录成功')
路由
from app01.views import BookView, SMSView
# 第一步:导入一个路由类
from rest_framework.routers import DefaultRouter
# 第二步:实例化得到对象
router = DefaultRouter()
# 第三步:注册路由(视图类)
router.register('books', BookView, 'books')
router.register('lqz', SMSView, 'lqz')
# http://127.0.0.1:8000/api/v1/lqz/1/lqz/
# 第四步:加入到路由中
# 4,1 方式一
# urlpatterns+=router.urls
# 4.2 使用include
# path('api/v1/', include(router.urls)),
urlpatterns = [
path('admin/', admin.site.urls),
path('api/v1/', include(router.urls)),
]