2012-12-01 146 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