为什么Django的`urlencode`不编码斜杠?

13 投票
2 回答
7707 浏览
提问于 2025-04-17 14:53

我注意到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参数指定了不应该被转义的额外字符——它的默认值是'/'。

所以,原因在于它是在处理路径,而'/'在路径中是一个完全可以接受和有效的字符。

撰写回答