文档中提到可以设置trailing_slash=False
,但是如何允许带斜杠或不带斜杠的两个端点都能正常工作呢?
__init__
method。from rest_framework.routers import SimpleRouter
class OptionalSlashRouter(SimpleRouter):
def __init__(self):
super().__init__()
self.trailing_slash = '/?'
?
字符会使所有可用的路由中斜杠成为可选项。
您也可以通过向SimpleRouter
构造函数传递trailing_slash
参数来覆盖此设置,如下所示:
from rest_framework import routers
router = routers.SimpleRouter(trailing_slash=False)
trailing_slash=False
,并且在注册URL时在末尾添加斜杠,同时没有将APPEND_SLASH设置为False,则带或不带斜杠的URL都可以正常工作,因为没有带斜杠的URL会重定向到带斜杠的URL。 - micmy_model/1/
)会变成 my_model//1
。因此,最好保持默认的 trailing_slash=True
,注册不带尾随斜杠的 URL,并将 APPEND_SLASH 设置为 True。 - mic如果你正在使用DRF的路由器和视图集,你可以在你的前缀中包含/?
。
from rest_framework import routers
from .views import ClientViewSet
router = routers.SimpleRouter(trailing_slash=False)
router.register(r"clients/?", ClientViewSet)
我发现最简单的方法就是单独设置URL以处理可选的尾随斜杠,例如:
from django.urls import re_path
urlpatterns = [
re_path('api/end-point/?$', api.endPointView),
...
虽然这不是DRY(Don't Repeat Yourself)的解决方案,但对于每个URL只需要额外增加两个字符就可以了。而且它并不涉及覆盖路由器。
DefaultRouter
类,与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()
...
rest_framework_extensions
中的ExtendedSimpleRouter
的任何人,接受的解决方案需要进行小修改。 self.trailing_slash
必须在super().__init__()
之后,如下所示。from rest_framework_extensions.routers import ExtendedSimpleRouter
class OptionalSlashRouter(ExtendedSimpleRouter):
def __init__(self):
super(ExtendedSimpleRouter, self).__init__()
self.trailing_slash = "/?"
DefaultRouter
,并且需要这样做:`class OptionalSlashRouter(DefaultRouter):def __init__(self, *args, **kwargs): super(DefaultRouter, self).__init__(*args, **kwargs) self.trailing_slash = '/?'
` - Def_Os/?
传递给 构造函数。 - x-yuri__init__
方法的真值为真时,会覆盖trailing_slash
以始终为/
。该方法位于 此处。 - Ryan Allenself.trailing_slash = '/?'
之前。 - Mcmildjango.core.exceptions.ImproperlyConfigured: "^?$" 不是一个有效的正则表达式:在位置1没有可重复的内容。
解决方案如下。 - Vikram Ray