Djoser - 覆盖注册

Posted

技术标签:

【中文标题】Djoser - 覆盖注册【英文标题】:Djoser - Override registration 【发布时间】:2021-05-08 05:09:03 【问题描述】:

我对如何修改 Djoser 的注册端点感到困惑。我想做的就是向端点添加范围限制,但我不明白如何覆盖它。 文档上的这个页面讨论了它:https://djoser.readthedocs.io/en/2.1.0/adjustment.html 但它似乎过时了? 今天如何使用 UserViewSet 完成并确保 url 按预期工作?

【问题讨论】:

【参考方案1】:

您可以做的是继承 djoser UserViewSet 并添加您的额外代码。像这样的东西应该可以工作

# your_views.py

from djoser.views import UserViewSet as DjoserUserViewSet


class UserViewSet(DjoserUserViewSet):

    def get_throttles(self):
        if self.action == "create":
            self.throttle_classes = [YourThrottleClass]
        return super().get_throttles()

然后在你的urls.py 中你不应该在你的urlpatterns 中包含djoser.urls

取而代之的是(取自他们的文档,您可能有其他网址):

urlpatterns = [
    (...),
    url(r'^auth/', include('djoser.urls')),
]

在您的urlpatterns 中执行此操作(您可能已经定义了路由器):

# I have use endpoint "auth/users" to keep it similar to the above, but it can be just simple "users"

router = DefaultRouter()
router.register("auth/users", your_views.UserViewSet)  

urlpatterns = [
    (...),
    url(r'^', include(router.urls)),
]

幕后djoser.urls 正在注册users 端点,但使用其内部UserViewSet,因此您可以使用自己的自定义类。

【讨论】:

这行得通,但我不得不删除 router.urls 周围的引号,例如 url(r'^', include(router.urls))。此外,除了添加节流阀类之外,我还能够添加节流作用域,使用 self.throttle_scope = "mycustomscope" 而不是 self.throttle_classses。同样使用 djoser_views.UserViewSet 也没有用,我不得不导入 UserViewSet。也许你可以编辑你的答案:) 谢谢!路由器在覆盖和需要调用超级时的工作方式是我之前必须失败的点。 我已经编辑了答案以解决所描述的问题。

以上是关于Djoser - 覆盖注册的主要内容,如果未能解决你的问题,请参考以下文章

Djoser 用户激活电子邮件 POST 示例

如何覆盖 Djoser 基本端点用户/我

DRF:Djoser 覆盖自定义用户序列化程序

Joomla 注册覆盖

覆盖设计注册控制器

注册后天蓝色 b2c 重定向 uri 覆盖