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 什么情况下使用自动生成路由

  1. 继承了ViewSetMixin及其子类的视图类
# 继承了ViewSetMixin的视图类,自动生成的路由只有以下5中映射:
    get:list   /books/
    get:retrieve
    post:create
    put:update  /books/1/
    delete:destory 


如果你在类中写了get方法,根本不会执行。因为get请求被映射成list方法。
  1. 我们自己命名的: 方法名: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)),
]
posted @ 2023-05-24 22:36  星空看海  阅读(11)  评论(0编辑  收藏  举报