如何在Django Rest Framework SimpleRouter上设置尾部斜杠可选

Rya*_*len 19 django trailing-slash django-rest-framework

文件说,你可以设置trailing_slash=False但你怎么能允许两个端点工作,有或没有结尾的斜线?

Rya*_*len 22

您可以覆盖SimpleRouter类的__init__方法:

from rest_framework.routers import SimpleRouter


class OptionalSlashRouter(SimpleRouter):

    def __init__(self):
        self.trailing_slash = '/?'
        super(SimpleRouter, self).__init__()
Run Code Online (Sandbox Code Playgroud)

?字符将使斜杠成为所有可用路径的可选项.

  • 我使用`DefaultRouter`并且必须这样做:`class OptionalSlashRouter(DefaultRouter):def __init __(self,*args,**kwargs):super(DefaultRouter,self).__ init __(*args,**kwargs)self.trailing_slash ='/?' ` (9认同)
  • 将 super init 方法调用放在 `self.trailing_slash = '/?'` 之前。 (4认同)
  • __init__ 方法[覆盖 `trailing_slash` 始终为 `/`](https://github.com/encode/django-rest-framework/blob/453196e9c3a581bac3bf68eb8c9cdd7d28d2dcd6/rest_framework/routers.py#L169) (3认同)
  • 您可以将`/?`[]传递给[constructor](https://github.com/encode/django-rest-framework/blob/3.9.1/rest_framework/routers.py#L168) www.django-rest-framework.org/api-guide/routers/#simplerouter)。 (2认同)

小智 9

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

from rest_framework import routers

router = routers.SimpleRouter(trailing_slash=False)
Run Code Online (Sandbox Code Playgroud)

  • 然后带有尾部斜杠的URL不起作用 (4认同)

das*_*mug 6

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

from rest_framework import routers

from .views import ClientViewSet

router = routers.SimpleRouter(trailing_slash=False)
router.register(r"clients/?", ClientViewSet)
Run Code Online (Sandbox Code Playgroud)


gor*_*vix 5

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

from django.urls import re_path

urlpatterns = [
    re_path('api/end-point/?$', api.endPointView),
    ...
Run Code Online (Sandbox Code Playgroud)

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