【发布时间】:2019-08-01 22:06:27
【问题描述】:
我目前有一个 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'] }}">
我错过了 jinja 环境的一些东西吗?
【问题讨论】:
-
应该是
g['words'] = words而不是g.words? -
@shmuels 这没有设置,它给了我一个
TypeError: '_AppCtxGlobals' object does not support item assignment。此外,我在主要问题中发布的错误有时只会发生 -
您确定这只是
get请求吗?因为您仅在获取请求上设置变量,否则您的代码看起来很好 -
@TarunLalwani 好点,将尝试发布和获取请求(如果发布请求使用它的任何原因),看看它是否仍然显示。
-
@TarunLalwani,如果你想把它作为答案,我可以接受