前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【愚公系列】2022年04月 Python教学课程 71-DRF框架之内置路由

【愚公系列】2022年04月 Python教学课程 71-DRF框架之内置路由

作者头像
愚公搬代码
发布2022-04-20 08:56:48
发布2022-04-20 08:56:48
94000
代码可运行
举报
文章被收录于专栏:历史专栏历史专栏
运行总次数:0
代码可运行

文章目录

一、路由

对于视图集ViewSet,我们除了可以自己手动指明请求方式与视图方法[官方文档中也叫action,动作]之间的对应关系外,还可以使用Routers来帮助我们自动生成路由信息。

REST framework提供了两个router

  • SimpleRouter
  • DefaultRouter

1.SimpleRouter

1.1 基本使用

代码语言:javascript
代码运行次数:0
运行
复制
from rest_framework import routers

router = routers.SimpleRouter()
router.register(r'users', UserViewSet)
router.register(r'accounts', AccountViewSet)
urlpatterns = router.urls

该方法有两个必需的参数:register()

  • prefix- 用于这组路由的 URL 前缀。
  • viewset- 视图集类。

(可选)您还可以指定一个附加参数:

  • basename- 用于所创建的 URL名称的基础。如果未设置,则将根据视图集的属性(如果有)自动生成基名。请注意,如果视图集不包含属性,则必须在注册视图集时进行设置。

上面的示例将生成以下 URL 模式:

  • 网址模式: 名称:^users/$‘user-list’
  • 网址模式: 名称:^users/{pk}/$‘user-detail’
  • 网址模式: 名称:^accounts/$‘account-list’
  • 网址模式: 名称:^accounts/{pk}/$‘account-detail’

1.2 合并使用

代码语言:javascript
代码运行次数:0
运行
复制
router = routers.SimpleRouter()
router.register(r'users', UserViewSet)
router.register(r'accounts', AccountViewSet)

urlpatterns = [
    path('forgot-password/', ForgotPasswordFormView.as_view()),
]

urlpatterns += router.urls
代码语言:javascript
代码运行次数:0
运行
复制
urlpatterns = [
    path('forgot-password', ForgotPasswordFormView.as_view()),
    path('', include(router.urls)),
]
代码语言:javascript
代码运行次数:0
运行
复制
urlpatterns = [
    path('forgot-password/', ForgotPasswordFormView.as_view()),
    path('api/', include((router.urls, 'app_name'), namespace='instance_name')),
]

1.3 额外操作的路由

视图集可以通过使用装饰器修饰方法来标记用于布线的额外操作。这些额外的操作将包含在生成的路由中。例如,给定类上的方法:action()

代码语言:javascript
代码运行次数:0
运行
复制
from myapp.permissions import IsAdminOrIsSelf
from rest_framework.decorators import action

class UserViewSet(ModelViewSet):
    ...

    @action(methods=['post'], detail=True, permission_classes=[IsAdminOrIsSelf])
    def set_password(self, request, pk=None):
        ...

将生成以下路由:

  • 网址模式:^users/{pk}/set_password/$
  • 网址名称:'user-set-password'

默认情况下,URL 模式基于方法名称,URL 名称是方法名称和带连字符的方法名称的组合。如果不想为这两个值中的任何一个使用默认值,则可以改为向装饰器提供 and 参数。

例如,如果要将自定义操作的 URL 更改为 ,则可以编写:^users/{pk}/change-password/$

代码语言:javascript
代码运行次数:0
运行
复制
from myapp.permissions import IsAdminOrIsSelf
from rest_framework.decorators import action

class UserViewSet(ModelViewSet):
    ...

    @action(methods=['post'], detail=True, permission_classes=[IsAdminOrIsSelf],
            url_path='change-password', url_name='change_password')
    def set_password(self, request, pk=None):
        ...

上面的示例现在将生成以下 URL 模式:

  • 网址路径:^users/{pk}/change-password/$
  • 网址名称:'user-change_password'

注意点:

默认情况下,创建的 URL 会附加尾部斜杠。可以通过在实例化路由器时将参数设置为来修改此行为。例如:

代码语言:javascript
代码运行次数:0
运行
复制
router = SimpleRouter(trailing_slash=False)

尾随斜杠在 Django 中是约定俗成的,但在其他一些框架(如 Rails)中默认不使用。你选择使用哪种风格很大程度上取决于你的偏好,尽管一些javascript框架可能会期望特定的路由风格。

路由器将匹配包含除斜杠和句点字符之外的任何字符的查找值。对于限制性更强(或宽松)的查找模式,请在视图集上设置属性。例如,可以将查找限制为有效的 UUID:

代码语言:javascript
代码运行次数:0
运行
复制
class MyModelViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    lookup_field = 'my_model_id'
    lookup_value_regex = '[0-9a-f]{32}'

2.DefaultRouter

此路由器与上述路由器类似,但还包含默认 API 根视图,该视图返回包含指向所有列表视图的超链接的响应。它还为可选样式格式后缀生成路由。

代码语言:javascript
代码运行次数:0
运行
复制
from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
router.register(r'accounts', AccountViewSet)
urlpatterns = router.urls

与 URL 路由上的尾部斜杠一样,可以通过在实例化路由器时将参数设置为 来删除。

代码语言:javascript
代码运行次数:0
运行
复制
router = DefaultRouter(trailing_slash=False)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/04/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、路由
    • 1.SimpleRouter
      • 1.1 基本使用
      • 1.2 合并使用
      • 1.3 额外操作的路由
    • 2.DefaultRouter
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档