我看到Django的urlencode
过滤器默认不编码斜线:
https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#urlencode
我知道我可以让它对斜线进行编码,但是为什么默认不这样做呢?考虑到它是 URL 中的保留字符,对斜线进行编码不是可接受的行为吗?
我看到Django的urlencode
过滤器默认不编码斜线:
https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#urlencode
我知道我可以让它对斜线进行编码,但是为什么默认不这样做呢?考虑到它是 URL 中的保留字符,对斜线进行编码不是可接受的行为吗?
从 Django 源代码来看,urlencode
它基本上是 Djangourlquote
实用方法的包装器。从源代码中的评论来看,urlquote
是 UTF-8 安全版本的urllib.quote
.
urlencode
使用与 python 相同的默认值也是如此,并且可以在文档urllib.quote
中找到不转义斜杠的原因:urllib.quote
使用 %xx 转义符替换字符串中的特殊字符。从不引用字母、数字和字符“_.-”。默认情况下,此函数用于引用 URL 的路径部分。可选的安全参数指定不应该被引用的附加字符——它的默认值是'/'。
因此,原因是它正在转义路径,并且'/'
是路径中完全预期且有效的字符。
要在 Django 模板中urlencode
转义/
,请使用{{ variable|urlencode:'' }}
.
解释:额外的可选参数告诉字符urlencode
集是“安全的”,默认是'/'
,所以传递一个空字符串是不安全的,应该被编码。urlencode
/