2012-12-01 60 views
7

所以我有我的用户模块的前请求路由。但是现在我想从其他蓝图访问g.users。我发现唯一的办法就是将下面的代码复制到每一张蓝图中。我在哪里把我的蓝图before_request

我试着把它放在我app.py的app.before_request中,但是你有错误,因为你必须导入session,g,User,然后你仍然在其他地方得到_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' 
+1

'app.before_request' * should * work。你可以发布一个地方的例子,当你使用'app.before_request'时,你会得到'AttributeError'吗? –

+0

Damnit,显然,我没有在@ app中设置它,我添加了功能,但忘记使用它。现在它似乎在每一个蓝图中都可以正常使用@app。我以为其他蓝图没有看到它。 – Dexter

回答

3

我觉得你这样做很好,试图在before_request发起用户,问题是g对象具有请求之前什么都没有,所以你需要以不同的方式处理它。从before_request中最有可能的cookie中获取用户,然后将其添加到会话中,从那里可能到g。我认为这是值得看看或使用Flask登录。或者只是read the code它,也许它会给你一些想法。

+0

我一直在考虑这一点。但我不明白为什么它需要,因为我认为烧瓶已经创建了一个自动cookie来保存会话数据。 – Dexter

8

Buleprint.before_request在蓝图中的每个请求之前被调用。如果您想在所有蓝图之前打电话,请使用before_app_request

13

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

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

def before_myblueprint(): 
    #code here 

myblueprint.before_request(before_myblueprint) 
1

之前,我甚至以后在这里,但增加对约翰斯顿的答案,您也可以使用相同的before_request装饰器,例如:

bp_v1 = Blueprint('api_v1', __name__) 

@bp_v1.before_request 
def before_anything(): 
    pass