Django2中如何传递含斜杠的URL参数?
解决Django URL中传递带斜杠参数的问题
这个问题我之前也碰到过,Django默认的路径规则确实不支持直接传递带斜杠的参数,下面给你两个实用的解决方案:
方法一:使用re_path(正则URL模式)
Django的path()方法里默认的str转换器只会匹配不包含斜杠的字符串,所以我们可以改用re_path()(也就是旧版本的url()),通过正则表达式来匹配包含斜杠的参数。
修改你的urls.py如下:
from django.urls import re_path from . import views urlpatterns = [ # 使用正则匹配任意字符(包括斜杠),直到结尾的/ re_path(r'^test/(?P<test_arg>.*)/$', views.test, name='test'), ]
这样访问mysite.com/test/test1/test2就能正常匹配到test视图,test_arg参数的值就是test1/test2。
⚠️ 注意:如果你的URLpatterns里还有其他以test/开头的规则,建议把这个正则规则放在最后,避免它优先匹配导致其他URL失效。如果参数格式固定(比如只有两段),也可以把正则写得更精确,比如r'^test/(?P<test_arg>[^/]+/[^/]+)/$',这样只会匹配两段带斜杠的参数。
方法二:自定义路径转换器
如果更习惯用path()的写法,我们可以自定义一个支持斜杠的路径转换器,这样代码会更优雅。
- 在你的app目录下创建
converters.py文件,编写转换器类:
class SlashConverter: # 正则规则:匹配任意字符(包括斜杠) regex = '.*' def to_python(self, value): # 将URL中的字符串转换为Python对象,这里直接返回原字符串即可 return value def to_url(self, value): # 反向生成URL时,将Python对象转换为URL字符串,同样直接返回 return value
- 在app的
urls.py中注册并使用这个转换器:
from django.urls import path, register_converter from . import converters, views # 注册自定义转换器,命名为slash_str register_converter(converters.SlashConverter, 'slash_str') urlpatterns = [ # 使用自定义的slash_str转换器 path('test/<slash_str:test_arg>/', views.test, name='test'), ]
现在访问mysite.com/test/test1/test2就能正常匹配,test_arg参数会正确接收test1/test2。
关于URL编码的%2F
你尝试的mysite.com/test/test1%2Ftest2之所以失败,是因为WSGI服务器会自动把URL编码的%2F解码成斜杠,导致路径被拆分成test1和test2,依然匹配不上原有的path规则。上面的两种方法已经可以直接处理带斜杠的参数,不需要依赖URL编码,所以更推荐使用这两种方案。
内容的提问来源于stack exchange,提问作者Henry Henrinson
相关产品推荐
相关产品推荐

