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
相关产品推荐
相关产品推荐

