jinja2.exceptions.UndefinedError:'flask.ctx._AppCtxGlobals对象'没有属性'words'

时间:2019-08-01 22:06:27

标签: flask jinja2 ponyorm

我目前有一个before_request,它在g变量中存储单词。
然后,我在子模板中扩展了一个index.html。但是由于某些原因,它有时无法读取gloabl g变量。

这是设置g

的功能
@app.before_request
def setup_words_and_ratings():
    if request.method == "GET":
        lang = request.args.get('lang') or session.get('lang')
        if not lang:
            try:
                lang = request.headers.get('Accept-Language').split(",")[0][:2]
                if len(lang) != 2:
                    lang = "en"
            except:
                lang = "en"
        cache = red.get("%s%s" % (lang,version))
        if cache:
            words = pickle.loads(cache)
        else:
            words = models.Translation.translation_as_dict(lang)
            red.set("%s%s" % (lang,version), pickle.dumps(words))
            red.expire("%s%s" % (lang,version), 60 * 60 * 24 * 30)
        g.words = words
        g.words['lang'] = lang
        session['lang'] = lang

但是我得到这个错误

[2019-08-01 21:22:54 +0000] [15435] [ERROR] Error handling request /ppt-pdf
Traceback (most recent call last):
  File "/home/www/pdfenv/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 135, in handle
    self.handle_request(listener, req, client, addr)
  File "/home/www/pdfenv/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 176, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
  File "/home/www/pdfenv/lib/python3.6/site-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/www/pdfenv/lib/python3.6/site-packages/pony/utils/utils.py", line 37, in pony_wrapper
    return caller(func, *args, **kwargs)
  File "/home/www/pdfenv/lib/python3.6/site-packages/pony/orm/core.py", line 472, in new_func
    result = func(*args, **kwargs)
  File "/home/www/pdfenv/lib/python3.6/site-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "/home/www/pdfenv/lib/python3.6/site-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/www/pdfenv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/home/www/pdfenv/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/www/pdfenv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/www/pdfenv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/www/pdfenv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/home/www/pdfenv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/www/pdfenv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/www/pdfto/app.py", line 269, in ppttopdf
    return render_template('ppttopdf.html')
  File "/home/www/pdfenv/lib/python3.6/site-packages/flask/templating.py", line 135, in render_template
    context, ctx.app)
  File "/home/www/pdfenv/lib/python3.6/site-packages/flask/templating.py", line 117, in _render
    rv = template.render(context)
  File "/home/www/pdfenv/lib/python3.6/site-packages/jinja2/asyncsupport.py", line 76, in render
    return original_render(self, *args, **kwargs)
  File "/home/www/pdfenv/lib/python3.6/site-packages/jinja2/environment.py", line 1008, in render
    return self.environment.handle_exception(exc_info, True)
  File "/home/www/pdfenv/lib/python3.6/site-packages/jinja2/environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/www/pdfenv/lib/python3.6/site-packages/jinja2/_compat.py", line 37, in reraise
    raise value.with_traceback(tb)
  File "/home/www/pdfto/templates/ppttopdf.html", line 1, in top-level template code
    {% extends 'index.html' %}
  File "/home/www/pdfto/templates/index.html", line 2, in top-level template code
    <html lang="{{ g.words['lang'] }}">
  File "/home/www/pdfenv/lib/python3.6/site-packages/jinja2/environment.py", line 411, in getitem
    return obj[argument]
jinja2.exceptions.UndefinedError: 'flask.ctx._AppCtxGlobals object' has no attribute 'words'

在索引中,我像这样g<html lang="{{ g.words['lang'] }}">变量

我在神社环境中缺少某些东西吗?

1 个答案:

答案 0 :(得分:0)

查看您的代码,您将使变量仅在GET方法的情况下可用。您可能应该删除该条件,因此即使在POST请求的情况下也可以使用该条件

@app.before_request
def setup_words_and_ratings():
    lang = request.args.get('lang') or session.get('lang')
    if not lang:
        try:
            lang = request.headers.get('Accept-Language').split(",")[0][:2]
            if len(lang) != 2:
                lang = "en"
        except:
            lang = "en"
    cache = red.get("%s%s" % (lang,version))
    if cache:
        words = pickle.loads(cache)
    else:
        words = models.Translation.translation_as_dict(lang)
        red.set("%s%s" % (lang,version), pickle.dumps(words))
        red.expire("%s%s" % (lang,version), 60 * 60 * 24 * 30)
    g.words = words
    g.words['lang'] = lang
    session['lang'] = lang