【问题标题】:Why does Django's `urlencode` not encode slash?为什么 Django 的 urlencode 不编码斜线?
【发布时间】:2013-01-21 01:51:58
【问题描述】:
【问题讨论】:
标签:
python
django
url
urlencode
【解决方案1】:
从 Django 源代码来看,urlencode 基本上是 Django 的 urlquote 实用方法的包装器。从源代码中的 cmets 来看,urlquote 是 urllib.quote 的 UTF-8 安全版本。
所以urlencode使用的默认值与python的urllib.quote相同,urllib.quote不转义斜线的原因可以在documentation中找到:
使用 %xx 转义符替换字符串中的特殊字符。信件,
数字和字符 '_.-' 永远不会被引用。默认情况下,这
函数用于引用 URL 的路径部分。这
可选的安全参数指定应该附加的字符
不被引用——它的默认值是'/'。
所以,原因是它正在转义路径,而'/' 是路径中完全预期且有效的字符。
【解决方案2】:
要让urlencode 在 Django 模板中同时转义 /,请使用 {{ variable|urlencode:'' }}。
解释:额外的可选参数告诉urlencode“安全”的字符集,默认为'/',所以传递一个空字符串告诉urlencode/不安全,应该被编码。