【问题标题】:FLASK Server breaks with an INTERNAL SERVER ERROR on passing context to template [duplicate]FLASK 服务器在将上下文传递给模板时出现内部服务器错误 [重复]
【发布时间】:2021-06-05 07:57:23
【问题描述】:

我无法弄清楚我的 Flask 服务器的问题,当我尝试将任何上下文或全局变量从我的视图函数传递到模板时,它就没有启动。浏览器仅在尝试访问 url 时显示“内部服务器错误”。经过一番观察,我意识到问题只发生在尝试访问模板中传递的上下文变量时。当我从模板中删除 jinja 语法时,服务器会启动。

app.py

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def home():
    return render_template("home.html", name="Satya")

home.html

<html>
<head>
   <title>Home</title>
</head>
<body>
   <h1>Hi {{name}}</h1>
</body>
</html>

这是我使用“flask run”运行应用程序时的堆栈跟踪:


**I just can't seem to get past this and it is so frustrating. Any help would be appreciated.**
AttributeError
AttributeError: 'Token' object has no attribute 'test'

Traceback (most recent call last)
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\flask\app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\flask\app.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\flask\app.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\flask\app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\flask\app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "D:\MCA\BIT-2020\FlaskProject\main.py", line 7, in home
return render_template("home.html", name="Satya")
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\flask\templating.py", line 138, in render_template
ctx.app.jinja_env.get_or_select_template(template_name_or_list),
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\jinja2\environment.py", line 1068, in get_or_select_template
return self.get_template(template_name_or_list, parent, globals)
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\jinja2\environment.py", line 997, in get_template
return self._load_template(name, globals)
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\jinja2\environment.py", line 958, in _load_template
template = self.loader.load(self, name, self.make_globals(globals))
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\jinja2\loaders.py", line 137, in load
code = environment.compile(source, name, filename)
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\jinja2\environment.py", line 749, in compile
source = self._parse(source, name, filename)
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\jinja2\environment.py", line 606, in _parse
return Parser(self, source, name, filename).parse()
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\jinja2\parser.py", line 1038, in parse
result = nodes.Template(self.subparse(), lineno=1)
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\jinja2\parser.py", line 1012, in subparse
add_data(self.parse_tuple(with_condexpr=True))
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\jinja2\parser.py", line 725, in parse_tuple
args.append(parse())
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\jinja2\parser.py", line 523, in parse_expression
return self.parse_condexpr()
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\jinja2\parser.py", line 528, in parse_condexpr
expr1 = self.parse_or()
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\jinja2\parser.py", line 543, in parse_or
left = self.parse_and()
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\jinja2\parser.py", line 552, in parse_and
left = self.parse_not()
File "D:\MCA\BIT-2020\VirtualEnvs\test_env\lib\site-packages\jinja2\parser.py", line 560, in parse_not
if self.stream.current.test("name:not"):
AttributeError: 'Token' object has no attribute 'test'

【问题讨论】:

标签: python templates flask jinja2 internal-server-error


【解决方案1】:

使用 app.run() 方法启动您的应用程序。 将此添加到您的代码中:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def home():
    return render_template("home.html", name="xyz")

if __name__ == '__main__':
    app.run(debug=True) # You can set debug to false as weel, though it will help you debug your code

现在只需运行 app.py,它应该可以工作了

【讨论】:

  • 我建议了一种不同的方法,因为我无法复制错误,你提供的相同代码在我的机器上都可以完美运行(flask run 和 app.run()),所以你可能想要尝试不同的方法。如果这也不起作用,你能告诉我你的神社版本吗?我的版本是 Jinja2==3.0.0
  • 感谢 Mayank 的建议,但我已经尝试使用 app.run() 运行它并抛出相同的错误。即使我以前从未在使用 Flask 时遇到过这个问题。如果代码在您的机器上运行良好,我怀疑它与最新版本的 Flask 或 Jinja2 或其他一些组件有关。我正在使用 Flask==2.0.1 和 Jinja2==3.0.1;我会尝试将我的 Jinja2 版本降级到 3.0.0 并检查。
  • 将 Jinja2 降级到 3.0.0 版本就像一个魅力。再次感谢您的建议。在过去的两天里,我一直在为此头疼。
  • 没关系,很高兴能帮上忙!
【解决方案2】:

[已修复] 仅适用于近期访问此主题的任何人。这个问题出在当时最新版本的 Jinja2==3.0.1 上。因此,遵守以下版本规范将使应用运行流畅:

Python > 3.6.0
Jinja2

flask 的版本在这里似乎并没有真正的影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2016-08-21
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    相关资源
    最近更新 更多