python - url_for 使用 & 创建一个 url 查询字符串

标签 python python-3.x flask jinja2 query-string

假设我在 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&amp;arg1=hello')

当我调用这个 url 时,我的 request.args 字典是:

ImmutableMultiDict([('amp;arg1', 'hello'), ('arg2', 'world')])

这是不正确的,因为 arg1 的键是错误的。 有什么线索可以防止 jinja2 将 & 转换为 & 吗?

最佳答案

& 符号

正确的网址是 /api/art_structure?arg2=world&arg1=hello .

上述 URL 的问题在于不能直接在 HTML 中写入 & 符号 ( & ),因为 & 符号用于实体引用。比如写< HTML中的字符,不是标签开始,可以写成&lt; .因此,写& ,应该转义它,即将它写成 &amp; .

Jinja2 模板引擎默认这样做。因此,您可以转储任何字符串变量的内容,即使它包含特殊字符,它们也会被正确转义,例如&将变为 &amp;和你的情况一样。

它是如何工作的?

所以,如果你真的把它放在你的 jinja 模板中:<a href="{{ url_for('root', arg1='hello', arg2='world') }}">link</a> ,它会编写以下 HTML 代码:<a href="/api/art_structure?arg2=world&amp;arg1=hello">link</a> , 如果您在浏览器中单击链接,它会正确替换 &amp;&并打开 /api/art_structure?arg2=world&arg1=hello .

(但是请注意,将普通的 & 原样写入 HTML 有时也可能有效,因为浏览器可能会猜测如何修复错误)

那么为什么它在这种情况下不能简单地工作?

因为您生成的是 JavaScript 而不是 HTML(您是在 <script></script> 中生成代码。在 JavaScript 中,& 没有问题,不应转义,因此您可以按原样自由编写。要告诉 Jinja 您不希望它转义 字符串,您可以使用 safe 过滤器,即 {{ url_for('root', arg1='hello', arg2='world') | safe}}

关于python - url_for 使用 & 创建一个 url 查询字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51783658/

相关文章:

python - VLC 模块出现问题

python - 如何将数据框中的列与空列之间的值进行匹配

python - 如何使用 pandas melt 获取值及其错误

Python/Django - 在上传文件上使用 View 方法

python-3.x - py4JJava 错误 - 使用 select 语句时出错

python - 如何仅使用相对路径加入?

Python( flask /棉花糖)ValueError : too many values to unpack (expected 2)

docker - 无法更改 nginx.conf 文件

post - 错误 : readv() failed (104: Connection reset by peer) while reading upstream

python - 如果字符串存在于列表中,则替换整个数据框中的字符串