为什么Django的`urlencode`不编码斜杠?
我注意到Django的urlencode
过滤器默认情况下并不会对斜杠进行编码:
https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#urlencode
我知道我可以让它对斜杠进行编码,但为什么默认情况下不这样做呢?考虑到斜杠在网址中是一个保留字符,难道不应该编码它吗?
2 个回答
2
要让 urlencode
在 Django 模板中也能对 /
进行转义,可以使用 {{ variable|urlencode:'' }}
。
解释一下:这个额外的可选参数告诉 urlencode
哪些字符是“安全的”,默认情况下 '/'
是安全的。所以传递一个空字符串就是在告诉 urlencode
,/
不是安全的,应该被编码。
10
从Django的源代码来看,urlencode
其实是Django的urlquote
这个工具方法的一个封装。根据源代码中的注释,urlquote
是一个支持UTF-8的版本,类似于urllib.quote
。
所以,urlencode
使用的默认设置和Python的urllib.quote
是一样的。而urllib.quote
不对斜杠进行转义的原因可以在文档中找到:
使用%xx转义来替换字符串中的特殊字符。字母、数字和字符'_.-'是不会被转义的。默认情况下,这个函数是用来转义URL的路径部分的。可选的safe参数指定了不应该被转义的额外字符——它的默认值是'/'。
所以,原因在于它是在处理路径,而'/'
在路径中是一个完全可以接受和有效的字符。