url_for 使用 & 创建一个 url 查询字符串
url_for creates a url query string with &
假设我在 Flask 应用程序的 html 模板中有以下脚本
<script type="text/javascript">
console.log('{{ url_for('root', arg1='hello', arg2='world') }}')
<script>
我有一个 flask 端点 root()
@app.route('/', methods=['GET'])
def root():
print(print(request.args))
当我调用我的页面时,内部脚本呈现为
console.log('/api/art_structure?arg2=world&arg1=hello')
当我调用这个 url 时,我的 request.args
字典是:
ImmutableMultiDict([('amp;arg1', 'hello'), ('arg2', 'world')])
这是不正确的,因为 arg1
的密钥是错误的。
关于如何防止 jinja2 将 &
转换为 &
的任何线索?
尝试使用 safe
例如:
console.log("{{ url_for('root', arg1='hello', arg2='world') | safe}}")
和号
正确的URL是/api/art_structure?arg2=world&arg1=hello
。
上面URL的问题是HTML中不能直接写&(&
),因为&是实体引用。例如,要在 HTML 中写入 <
字符,这不是标记开始,可以写入 <
。因此,要写 &
,应该 转义 ,即写成 &
.
Jinja2 模板引擎默认执行此操作。因此,您可以转储任何字符串变量的内容,即使它包含特殊字符,它们也会被正确转义,例如&
将变成 &
,就像您的情况一样。
这是如何运作的?
所以,如果你真的把它放在你的 jinja 模板中:<a href="{{ url_for('root', arg1='hello', arg2='world') }}">link</a>
,它会写下面的 HTML 代码:<a href="/api/art_structure?arg2=world&arg1=hello">link</a>
,如果你点击 link 在浏览器中,它会正确地将 &
替换为 &
并打开 /api/art_structure?arg2=world&arg1=hello
.
(但是请注意,将 &
原样写入 HTML 有时也可能有效,因为浏览器可能会猜测如何修复错误)
那么为什么在这种情况下它不能简单地工作?
因为您正在生成 JavaScript 而不是 HTML(您正在 <script>
和 </script>
内生成代码。在 JavaScript、&
很好,不应该转义,所以你可以按原样自由编写。要告诉 Jinja 你不希望它 转义 字符串,你可以使用 safe
过滤器,即 {{ url_for('root', arg1='hello', arg2='world') | safe}}
.
假设我在 Flask 应用程序的 html 模板中有以下脚本
<script type="text/javascript">
console.log('{{ url_for('root', arg1='hello', arg2='world') }}')
<script>
我有一个 flask 端点 root()
@app.route('/', methods=['GET'])
def root():
print(print(request.args))
当我调用我的页面时,内部脚本呈现为
console.log('/api/art_structure?arg2=world&arg1=hello')
当我调用这个 url 时,我的 request.args
字典是:
ImmutableMultiDict([('amp;arg1', 'hello'), ('arg2', 'world')])
这是不正确的,因为 arg1
的密钥是错误的。
关于如何防止 jinja2 将 &
转换为 &
的任何线索?
尝试使用 safe
例如:
console.log("{{ url_for('root', arg1='hello', arg2='world') | safe}}")
和号
正确的URL是/api/art_structure?arg2=world&arg1=hello
。
上面URL的问题是HTML中不能直接写&(&
),因为&是实体引用。例如,要在 HTML 中写入 <
字符,这不是标记开始,可以写入 <
。因此,要写 &
,应该 转义 ,即写成 &
.
Jinja2 模板引擎默认执行此操作。因此,您可以转储任何字符串变量的内容,即使它包含特殊字符,它们也会被正确转义,例如&
将变成 &
,就像您的情况一样。
这是如何运作的?
所以,如果你真的把它放在你的 jinja 模板中:<a href="{{ url_for('root', arg1='hello', arg2='world') }}">link</a>
,它会写下面的 HTML 代码:<a href="/api/art_structure?arg2=world&arg1=hello">link</a>
,如果你点击 link 在浏览器中,它会正确地将 &
替换为 &
并打开 /api/art_structure?arg2=world&arg1=hello
.
(但是请注意,将 &
原样写入 HTML 有时也可能有效,因为浏览器可能会猜测如何修复错误)
那么为什么在这种情况下它不能简单地工作?
因为您正在生成 JavaScript 而不是 HTML(您正在 <script>
和 </script>
内生成代码。在 JavaScript、&
很好,不应该转义,所以你可以按原样自由编写。要告诉 Jinja 你不希望它 转义 字符串,你可以使用 safe
过滤器,即 {{ url_for('root', arg1='hello', arg2='world') | safe}}
.