当变量以 render_template_string 方法上的数字开头时,Flask Jinja2 异常

Flask Jinja2 exception when a variable starts with a digit on render_template_string method

我需要呈现一个字符串模板,其中包含以数字开头的标签,但出现此异常: jinja2.exceptions.TemplateSyntaxError:预期令牌 'end of print statement',得到 'd_printer_name'

>>> jinja2.__version__
'2.10.3'
>>> flask.__version__
'1.1.1'

hello.py:

from flask import Flask, render_template_string

app = Flask(__name__)

@app.route("/")
def hello():
    render_data = { "3d_printer_name": "A name for printer"}
    rendered = render_template_string("Name: {{ 3d_printer_name}}.", **render_data)

    return rendered

我也试过添加 {% autoescape false %} 标签,但问题仍然存在。

欢迎任何帮助!

这是回溯:

[2019-11-07 14:11:50,609] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
  File "/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/site-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/site-packages/flask/app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/mgieco/Developments/tmp/flask_render/hello.py", line 8, in hello
    decoration = render_template_string("Name: {{ 3d_printer_name}}.", **decoration_data)
  File "/site-packages/flask/templating.py", line 155, in render_template_string
    return _render(ctx.app.jinja_env.from_string(source), context, ctx.app)
  File "/site-packages/jinja2/environment.py", line 880, in from_string
    return cls.from_code(self, self.compile(source), globals, None)
  File "/site-packages/jinja2/environment.py", line 591, in compile
    self.handle_exception(exc_info, source_hint=source_hint)
  File "/site-packages/jinja2/environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/site-packages/jinja2/_compat.py", line 37, in reraise
    raise value.with_traceback(tb)
  File "<unknown>", line 1, in template
  File "/site-packages/jinja2/environment.py", line 497, in _parse
    return Parser(self, source, name, encode_filename(filename)).parse()
  File "/site-packages/jinja2/parser.py", line 901, in parse
    result = nodes.Template(self.subparse(), lineno=1)
  File "/site-packages/jinja2/parser.py", line 876, in subparse
    self.stream.expect('variable_end')
  File "/site-packages/jinja2/lexer.py", line 384, in expect
    self.name, self.filename)
jinja2.exceptions.TemplateSyntaxError: expected token 'end of print statement', got 'd_printer_name'
127.0.0.1 - - [07/Nov/2019 14:11:50] "GET / HTTP/1.1" 500 -

Python 不能使用以数字开头的变量。当您使用 **render_data 时,它将字典转换为分隔变量。它似乎跳过了 3 并且在错误消息中显示了 d_printer_name

的问题

但您可以将其作为字典发送(而不是转换为分隔变量)

render_template_string(..., my_data=render_data)

然后你就可以像字典一样使用它了

"{{ my_data['3d_printer_name'] }}"

from flask import Flask, render_template_string

app = Flask(__name__)

@app.route("/")
def hello():
    render_data = {"3d_printer_name": "A name for printer"}
    rendered = render_template_string("Name: {{ my_data['3d_printer_name'] }}.", my_data=render_data)
    return rendered

app.run()