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

时间:2018-08-10 09:46:09

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

假设我在烧瓶应用程序的html模板中有以下脚本

<script type="text/javascript">
  console.log('{{ url_for('root', arg1='hello', arg2='world') }}')
<script>

我有一个烧瓶端点root()

@app.route('/', methods=['GET'])
def root():
  print(print(request.args))

当我调用我的页面时,内部脚本将呈现为

console.log('/api/art_structure?arg2=world&amp;arg1=hello')

当我将此网址称为request.args字典时:

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

这是不正确的,因为arg1的密钥是错误的。 有什么线索可以防止Jinja2将&转换为&amp;

2 个答案:

答案 0 :(得分:1)

尝试使用safe

例如:

console.log("{{ url_for('root', arg1='hello', arg2='world') | safe}}")

MoreInfo

答案 1 :(得分:1)

与号

正确的URL为/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}}