如何在 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()
...
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()
...