如何在 Django Rest Framework SimpleRouter 上使尾部斜线可选

How can I make a trailing slash optional on a Django Rest Framework SimpleRouter

docs 说你可以设置 trailing_slash=False 但你怎么能让两个端点都工作,有或没有尾部斜杠?

您可以覆盖 SimpleRouter 的 __init__ method class:

from rest_framework.routers import SimpleRouter


class OptionalSlashRouter(SimpleRouter):

    def __init__(self):
        super().__init__()
        self.trailing_slash = '/?'

? 字符将使所有可用路由的斜线可选。

您还可以通过将 trailing_slash 参数传递给 SimpleRouter 构造函数来覆盖此设置,如下所示:

from rest_framework import routers

router = routers.SimpleRouter(trailing_slash=False)

如果您使用 DRF 的路由器和视图集,您可以在前缀中包含 /?

from rest_framework import routers

from .views import ClientViewSet

router = routers.SimpleRouter(trailing_slash=False)
router.register(r"clients/?", ClientViewSet)

对于将 rest_framework_extensions 与 ExtendedSimpleRouter 一起使用的任何人,接受的解决方案需要进行小的修改。 self.trailling_slash 必须像这样在 super() 之后。

from rest_framework_extensions.routers import ExtendedSimpleRouter

class OptionalSlashRouter(ExtendedSimpleRouter):
    def __init__(self):
        super(ExtendedSimpleRouter, self).__init__()
        self.trailing_slash = "/?"

我发现最简单的方法就是单独设置 URL 来处理可选的尾部斜杠,例如

from django.urls import re_path

urlpatterns = [
    re_path('api/end-point/?$', api.endPointView),
    ...

不是 DRY 解决方案,但它只是每个 URL 的额外两个字符。而且它不涉及覆盖路由器。

对于DefaultRouter class,与Ryan Allen的回答相同:

from rest_framework.routers import DefaultRouter


class OptionalSlashRouter(DefaultRouter):
    """Make all trailing slashes optional in the URLs used by the viewsets
    """
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.trailing_slash = '/?'


router = OptionalSlashRouter()
...