2012-12-01 2 views
7

Quindi ho il routing prima richiesta per il mio modulo utente. Ma ora voglio accedere a g.users anche da altri progetti. Ho trovato l'unico modo per farlo, è quello di copiare il codice qui sotto per ogni singolo progetto.Dove posso inserire il mio progetto prima_request

Ho provato a metterlo nella mia app.py per @app.before_request, ma poi hai errori perché devi importare session, g, User, e quindi hai ancora errori _requestglobal in altri posti.

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

Qual è il posto migliore per inserirlo?

ricevo un sacco di:

AttributeError: '_RequestGlobals' object has no attribute 'user' 
+1

'app.before_request' dovrebbe funzionare. Puoi pubblicare un esempio di un luogo in cui dovresti ottenere l'attributo 'AttributeError' quando usi' app.before_request'? –

+0

Dannatamente, a quanto pare, non l'ho impostato direttamente in @ app, ho aggiunto la funzione ma ho dimenticato di usarlo. Ora sembra funzionare bene con @app in ogni singolo progetto. Pensavo che gli altri progetti non lo vedessero. – Dexter

risposta

3

penso che farlo bene provando avviare utente nella before_request, il problema è che g oggetto non ha nulla prima della richiesta, quindi è necessario affrontare in modo diverso . Ottenere l'utente dai cookie in before_request molto probabilmente e successivamente aggiungerlo alla sessione, da lì forse a g. Penso che varrebbe la pena dare un'occhiata o usare Flask-login. O solo read the code e forse ti darà qualche idea.

+0

lo stavo osservando. Ma non capisco perché sia ​​necessario perché pensavo che la fiasca avesse già creato un cookie automatico per conservare i dati della sessione. – Dexter

8

Buleprint.before_request viene chiamato prima di ogni richiesta all'interno del progetto. Se vuoi chiamarlo prima di tutti i progetti, utilizza before_app_request.

13

Un po 'in ritardo ma qui:
Questo è quello che faccio:
utilizzare la variabile Blueprint per impostare la prima richiesta di

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

def before_myblueprint(): 
    #code here 

myblueprint.before_request(before_myblueprint) 
1

Sono anche più tardi qui, ma incrementando sulla risposta Johnston , è possibile utilizzare lo stesso before_request decoratore così, ad esempio:

bp_v1 = Blueprint('api_v1', __name__) 

@bp_v1.before_request 
def before_anything(): 
    pass