Django 3.0 中不区分大小写的 URLS?

Case insensitive URLS in Django 3.0?

有没有办法让 Django 2.0 及更高版本的 URL 不区分大小写?

例如

path('profile/<str:username>/add/',views.AddFriendRedirect.as_view(),name='add_friend'),

如果我做了profile/USERNAME,当用户名是全小写的用户名时,我怎样才能做到 不区分大小写?这样即使 uSErnAmE 也是有效的

我知道旧的 url 语法有问题和答案,但我想知道新的 path 语法是否可行

Is there a way to have case insensitive URLS with Django 2.0 and up syntax?

如果完整的 url 不区分大小写,除了 linked SO post 中的答案,我看不到任何其他方式。但我从 OP 收集到的是,只有用户名部分应该不区分大小写。如果我们遵循正则表达式 (?i) 的解决方案,则此 url 也将有效 PrOFile/UsERname/AdD.

但看起来 OP 只希望用户名比较不区分大小写。使用 str 转换器,无论在 url 中传递什么,都将按原样传递给视图。所以在真正意义上,它已经不区分大小写了。这里建议的方法应该是在视图中使用 username__iexact 来获取用户。

但是,我们希望传递给视图的用户名值与视图要求的格式相同,例如小写,我们可以 register 为此自定义路径转换器。

因为 OP 最初使用 string converter,我们可以扩展它并覆盖 to_python 以将值转换为小写。我在这里使用小写字母,因为在 OP 中提到用户名是小写字母。

class IStringConverter(StringConverter):

    def to_python(self, value):
        return value.lower()

# once done, register it as:
register_converter(IStringConverter, 'istr')

# and use it as:
path('profile/<istr:username>/add/',views.AddFriendRedirect.as_view(),name='add_friend'),

另一种解决方案是通过自定义中间件将非小写路径重定向到小写路径。

这是您要添加的中间件:

from django.contrib.redirects.middleware import RedirectFallbackMiddleware    

class CustomRedirectFallbackMiddleware(RedirectFallbackMiddleware):
    
    def process_response(self, request, response):
        if response.status_code != 404:
            return response

        full_path = request.get_full_path()

        if not full_path.islower():
            return self.response_redirect_class(full_path.lower())