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

Django中如何让URL编码斜杠作为urlpatterns参数的一部分匹配?

Django中让URL编码斜杠作为参数一部分的解决方案

问题根源

Django默认依赖WSGI服务器自动解码URL编码字符,%2f会被转成路径分隔符/,导致路由匹配时错误拆分参数。要解决这个问题,需要从WSGI配置和路由处理两方面入手。

具体解决步骤

1. 配置WSGI服务器保留编码斜杠

不同服务器的设置方式:

  • Gunicorn:启动时添加参数 --allow-unicode-slashes,或在配置文件中设置 allow_unicode_slashes = True,阻止服务器将%2f解码为/。
  • Apache + mod_wsgi:在虚拟主机配置中添加 AllowEncodedSlashes NoDecode,保留编码后的斜杠不被解析。

2. 调整路由正则表达式

将原路由中的.+替换为[^/]+,明确匹配所有不含路径分隔符/的字符(此时%2f是普通字符串,不属于/):

urlpatterns = [
    url(r'^$', schema_view, name='swagger'),
    url(r'^(?P<page_title>[^/]+)/(?P<rev_id>[0-9]+)/$',
        WhoColorApiView.as_view(), name='wc_page_title_rev_id'),
    url(r'^(?P<page_title>[^/]+)/$',
        WhoColorApiView.as_view(), name='wc_page_title'),
]

3. 在视图中手动解码参数

因为WSGI保留了编码字符串,需要在视图中解码得到原始标题:

from urllib.parse import unquote

class WhoColorApiView(View):
    def get(self, request, *args, **kwargs):
        # 解码URL编码的标题
        page_title = unquote(kwargs.get('page_title', ''))
        # 后续业务逻辑处理

备选方案(不推荐)

若无法修改WSGI配置,可尝试自定义Django路径转换器处理编码参数,但该方案复杂度高,对特殊字符兼容性较差,优先推荐上述WSGI配置方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:10:26