当变量以 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()
我需要呈现一个字符串模板,其中包含以数字开头的标签,但出现此异常: 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()