我目前正在开发一个Flask应用程序(已经进行了一年),遇到了一个相当奇怪的错误。我有一些文件始终包含在我的Jinja2模板中(导航栏),它们使用用户的名称和头像。因此,每次渲染模板时,我都会传递用户信息。最近,在我的生产服务器上注意到了一个错误:
<img alt="image" class="img-circle" src="{{ user.image }}" style="width: 48px;"/>
File "/usr/local/lib/python2.7/dist-packages/jinja2/environment.py", line 397, in getattr
return getattr(obj, attribute)
jinja2.exceptions.UndefinedError: 'user' is undefined
这是我的导航栏之一。渲染此模板的方法使用了以下内容:
@mod.route('/broken_pus', methods=['POST', 'GET'])
def view_broken_pus():
return render_template("view_broken_pus.html", user=g.user, urls_for_active_clients=DeletedURLs.objects()[0].urls_for_active_clients, other_urls=DeletedURLs.objects()[0].other_urls)
正如您所看到的,我将user = g.user传递了下去。我在我的网站上的每个视图中都这样做。它在任何地方都有效,除了这个方法,它相当小。我有很多其他类似的路由,只有一个渲染模板,所以我不知道问题出在哪里。
我还在另一个更大的方法中遇到了这个问题,以前它总是有效的:
@mod.route('/users/add', methods=['GET', 'POST'])
@requires_roles("admin", "project-leader")
def add():
"""
Method adding a new user.
"""
# We do not use WTForms there since we need custom checkboxes for the role
# Instead we use basic HTML and treat the checkboxes here
if request.method == 'POST':
user = User(name=request.form.get('name'),
email=request.form.get('email'))
l = []
# big switch assignement
user.role = l
try:
user.save()
except errors.NotUniqueError:
flash(u'User %s already in database.' % user.name, 'danger')
return redirect(url_for('home'))
flash(u'User %s registered.' % user.name, 'success')
return redirect(url_for('home'))
return render_template('add_user.html', page=url_for('users.add'), user=g.user, clients=Client.objects())
当我第一次加载添加用户表单时,它可以正常工作。但是当我添加后,由于某种原因,我遇到了错误(用户没有保存到数据库中)。
由于在本地完美运行,我开始怀疑生产服务器本身存在问题。我们使用nginx和uwsgi来运行应用程序,并最近实施了一些Celery任务。你有什么想法吗?
提前致谢。
render_template
之前打印g.user
看看会发生什么吗? - ljk321