15

所以我有我的用户模块的请求前路由。但现在我也想从其他蓝图访问 g.users。我发现唯一的方法是将下面的代码复制到每个蓝图。

我尝试将它放在我的 app.py 中用于@app.before_request,但是由于您必须导入会话、g、用户,所以您遇到错误,然后您仍然会在其他地方收到 _requestglobal 错误。

@app.before_request
def before_request():
  g.user = None
  if 'user_id' in session:
    g.user = User.query.get(session['user_id']);

最好的放置位置是什么?

我得到了很多:

AttributeError: '_RequestGlobals' object has no attribute 'user'
4

4 回答 4

18

Blueprint.before_request在蓝图中的每个请求之前调用。如果您想在所有蓝图之前调用它,请使用before_app_request

于 2013-04-20T14:18:59.900 回答
17

这里有点晚了,但是:
这就是我所做
的:使用蓝图变量来设置之前的请求

myblueprint = Blueprint('myblueprint', __name__, template_folder="templates")

def before_myblueprint():
    #code here

myblueprint.before_request(before_myblueprint)
于 2013-08-27T12:20:48.617 回答
6

我什至在这里,但随着约翰斯顿的回答增加,您也可以使用相同的before_request装饰器,例如:

bp_v1 = Blueprint('api_v1', __name__)

@bp_v1.before_request
def before_anything():
    pass
于 2017-04-13T23:57:27.000 回答
2

我认为您通过尝试在中启动用户做得很好before_request,问题是g对象在请求之前没有任何内容,因此您需要以不同的方式处理它。很可能从 cookie 中获取用户before_request,然后将其添加到会话中,从那里可能会添加到g. 我认为值得一看或使用 Flask-login。或者只是阅读它的代码,也许它会给你一些想法。

于 2012-12-01T09:34:28.600 回答