You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django如何让带尾部斜杠的URL支持无斜杠直接访问且无需重定向

Django第三方库URL兼容尾斜杠与无斜杠访问方案

不需要依赖APPEND_SLASH的重定向逻辑,直接让两种路径都能正常响应的实现方案如下:

方案1:单独注册无斜杠路径(适配少量URL场景)

直接在项目根urls.py中,在引入第三方库URL配置的上方提前注册不带尾斜杠的同逻辑路径,优先级高于后续引入的第三方库默认带斜杠的路径:

# 项目根urls.py
from django.urls import path, include
from wagtail.admin.views import home, account

# 先注册无斜杠版本的路径
path(f"sprite-{get_sprite_hash()}", home.sprite, name="wagtailadmin_sprite_no_slash"),
path('login', account.LoginView.as_view(), name="wagtailadmin_login_no_slash"),

# 再引入第三方库原有URL配置
path("admin/", include("wagtail.admin.urls")),

方案2:正则匹配可选斜杠(适配单个路径两种访问形式)

用re_path编写正则规则,/?匹配0个或1个尾斜杠,无需重复写两次路径配置:

from django.urls import re_path

re_path(r'^sprite-(?P<sprite_hash>[a-f0-9]+)/?$', home.sprite, name="wagtailadmin_sprite"),
re_path(r'^login/?$', account.LoginView.as_view(), name="wagtailadmin_login"),

该规则会同时匹配/login和/login/两个路径,均直接返回响应不会触发重定向。

方案3:批量处理第三方库全量URL(适配大量URL场景)

如果第三方库URL数量多,可编写工具函数批量为所有带尾斜杠的路径新增无斜杠版本:

from django.urls import path, include
from wagtail.admin import urls as wagtailadmin_urls

def generate_no_slash_patterns(original_patterns):
    no_slash_patterns = []
    for pattern in original_patterns:
        # 仅处理带尾斜杠的原生path配置
        if hasattr(pattern, 'pattern') and pattern.pattern._str.endswith('/'):
            no_slash_path = pattern.pattern._str.rstrip('/')
            no_slash_patterns.append(
                path(no_slash_path, pattern.callback, name=f"{pattern.name}_no_slash")
            )
    # 无斜杠路径在前,保证优先级
    return no_slash_patterns + original_patterns

# 引入处理后的URL配置
processed_wagtail_patterns = generate_no_slash_patterns(wagtailadmin_urls.urlpatterns)
path("admin/", include(processed_wagtail_patterns)),

注意事项

  • 建议同步设置APPEND_SLASH = False,避免Django默认的重定向逻辑和自定义路径规则冲突
  • 路径命名不要重复,避免反向解析时出现异常

内容的提问来源于stack exchange,提问作者Andrii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 03:24:03