Django URL如何接收含斜杠的长字符串参数?
解决Django路由中带斜杠的字符串参数匹配问题
这个问题我之前踩过坑,核心原因很明确:Django默认的str路径转换器不会匹配包含斜杠/的内容——它只能匹配到第一个斜杠之前的部分。所以当你请求/api/v1/store/download/asdasd2asdsadas/asdasd时,Django会把asdasd2asdsadas当作ix参数,剩下的/asdasd找不到对应的路由规则,直接返回404了。
下面给你两种靠谱的解决方法:
方法一:使用path转换器(推荐)
Django提供了专门的path转换器,它可以匹配除问号?和哈希#之外的所有字符,完美支持带斜杠的长字符串参数。只需要把路由里的<str:ix>改成<path:ix>就行:
path('api/v1/store/download/<path:ix>/', DownloadVideoAPI.as_view(), name='download')
这个方法是Django 2.0+官方推荐的写法,简洁又安全,优先用这个。
方法二:使用正则路由(re_path)
如果你习惯用正则表达式来定义路由,可以用re_path(也就是旧版本的url函数),通过正则分组来匹配任意字符:
from django.urls import re_path re_path(r'^api/v1/store/download/(?P<ix>.*)/$', DownloadVideoAPI.as_view(), name='download')
这里的(?P<ix>.*)会匹配从download/之后到末尾斜杠的所有内容,包括斜杠。如果你的URL可能不带末尾斜杠,可以把正则改成r'^api/v1/store/download/(?P<ix>.*)/?$',这样带不带斜杠都能匹配。
额外提醒
不管用哪种方法,都要注意参数的安全性:因为ix可能包含路径相关的字符,一定要在视图里做校验,比如限制参数只能是合法的资源标识,避免用户传入类似../../../../etc/passwd这种恶意路径导致安全问题。
内容的提问来源于stack exchange,提问作者jicke
相关产品推荐
相关产品推荐

