【问题标题】:Flask.request object not available in Jinja2 templateFlask.request 对象在 Jinja2 模板中不可用
【发布时间】:2020-05-28 17:16:02
【问题描述】:

我希望处理如下网址: http://localhost/say?something=hello

在我的模板中有

{% for a in request.args %}
    {{a}} = {{ request.args[a]}} <br>
{% endfor %}

但是这会导致 'jinja2.exceptions.undefinederror'

我可以通过将 args 显式传递给变量中的模板来“解决”这个问题,但显然这只是一个臃肿的 hack。任何帮助将不胜感激。

版本: Python 3.7.7 烧瓶 1.1.2 Jinja2 2.11.2


我创建了一个重现错误的新项目。它除了创建一个模板并且不向它传递任何变量之外什么都不做。

from flask import Flask
from jinja2 import Template

app = Flask(__name__)


@app.route('/')
def hello_world():
    return Template('{{request.args}}').render()


if __name__ == '__main__':
    app.run()

以下是我对错误的回溯:

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
[2020-06-02 11:28:44,660] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
  File "/Users/dmg/Documents/Dev/TemplateTest/lib/python3.7/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/dmg/Documents/Dev/TemplateTest/lib/python3.7/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/dmg/Documents/Dev/TemplateTest/lib/python3.7/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/dmg/Documents/Dev/TemplateTest/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/Users/dmg/Documents/Dev/TemplateTest/lib/python3.7/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/dmg/Documents/Dev/TemplateTest/lib/python3.7/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/dmg/PycharmProjects/TemplateTest/app.py", line 9, in hello_world
    return Template('{{request.args}}').render()
  File "/Users/dmg/Documents/Dev/TemplateTest/lib/python3.7/site-packages/jinja2/environment.py", line 1090, in render
    self.environment.handle_exception()
  File "/Users/dmg/Documents/Dev/TemplateTest/lib/python3.7/site-packages/jinja2/environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  File "/Users/dmg/Documents/Dev/TemplateTest/lib/python3.7/site-packages/jinja2/_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  File "<template>", line 1, in top-level template code
  File "/Users/dmg/Documents/Dev/TemplateTest/lib/python3.7/site-packages/jinja2/environment.py", line 471, in getattr
    return getattr(obj, attribute)
jinja2.exceptions.UndefinedError: 'request' is undefined
127.0.0.1 - - [02/Jun/2020 11:28:44] "GET / HTTP/1.1" 500 -

【问题讨论】:

  • 你的代码对我有用。
  • 你可能想这样做{{a = request.args[a]}}
  • 也适合我。你可以发布堆栈跟踪吗?你确定你没有在其他地方无意中定义“请求”覆盖 Flask.request 对象吗?尝试在某处打印 {{request.args}} 的输出,它应该返回一个 ImmutableDictionary。
  • @RyanH 我是 python 新手。使用 PyCharm 作为 IDE。我将尝试弄清楚如何生成堆栈跟踪。同时:当我模板 {{request}} 时,我什么也得不到。当我模板 {{request.args}} 我得到“'request'未定义”时,我还将尝试启动一个全新的项目,看看它是否发生在一个基本上是空的项目中。谢谢!
  • 在from flask import Flask, request中包含request

标签: python-3.x flask jinja2


【解决方案1】:

为了得到“标准”的flask函数和对象,你需要通过app.create_jinja_environment()创建jinja模板环境。

该函数初始化环境全局变量 url_for、get_flashed_messages、请求、会话和g

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多