【问题标题】:Why does Django's `urlencode` not encode slash?为什么 Django 的 urlencode 不编码斜线?
【发布时间】:2013-01-21 01:51:58
【问题描述】:

我看到 Django 的 urlencode 过滤器默认不编码斜线:

https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#urlencode

我知道我可以让它对斜线进行编码,但是为什么默认不这样做呢?考虑到它是 URL 中的保留字符,编码斜线不是可接受的行为吗?

【问题讨论】:

标签: python django url urlencode


【解决方案1】:

从 Django 源代码来看,urlencode 基本上是 Django 的 urlquote 实用方法的包装器。从源代码中的 cmets 来看,urlquoteurllib.quote 的 UTF-8 安全版本。

所以urlencode使用的默认值与python的urllib.quote相同,urllib.quote不转义斜线的原因可以在documentation中找到:

使用 %xx 转义符替换字符串中的特殊字符。信件, 数字和字符 '_.-' 永远不会被引用。默认情况下,这 函数用于引用 URL 的路径部分。这 可选的安全参数指定应该附加的字符 不被引用——它的默认值是'/'。

所以,原因是它正在转义路径,而'/' 是路径中完全预期且有效的字符。

【讨论】:

    【解决方案2】:

    要让urlencode 在 Django 模板中同时转义 /,请使用 {{ variable|urlencode:'' }}

    解释:额外的可选参数告诉urlencode“安全”的字符集,默认为'/',所以传递一个空字符串告诉urlencode/不安全,应该被编码。

    【讨论】:

      猜你喜欢
      • 2013-03-12
      • 2012-10-06
      • 2013-06-15
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      相关资源
      最近更新 更多