2017-01-24 4 views
0

Derzeit bin ich den folgenden Code in meinem Prototyp mit:‚Wenn ein Benutzer authentifiziert wird‘ in Flask

@app.before_first_request 
def init(): 
global project 
project = user_project.Project() 
project.init() 

Allerdings habe ich programmiert jetzt einen Anmeldebenutzer mit flask_login. Daher muss ich diese Funktion so ändern, dass sie ONCE auslöst, wenn sich der Benutzer nicht nur bei der ersten Anforderung der Site angemeldet hat.

Ich versuchte das @ login_required jedoch, das startet diese Funktion nicht explizit.

Antwort

1

Dies ist ein häufiges Problem, und sowohl Django als auch Flask verwenden ein Konzept namens "Signale".

Lassen Sie die Benutzer-Login-Funktion ein Signal ausgeben und lassen Sie die Init-Funktion (connect() in diesem Fall) auf das Signal hören.

Folgen Sie dieser Anleitung:

http://flask.pocoo.org/docs/0.12/signals/

from flask import Flask, current_app, request 
from blinker import Namespace 

custom_signals = Namespace() 
user_logged_in_signal = custom_signals.signal('logged-in') 


def init(app, user, **extra): 
global project 
project = user_project.Project() 
project.init() 

user_logged_in_signal.connect(init, app) 

# example login 
def login(): 
    # user logs in 
    user = login(username, password) 
    user_logged_in_signal.send(current_app._get_current_object(), user=user) 
    return Response() 

Dieses ist mehr auf den Punkt: http://code.runnable.com/UqFCHJklakUbAAJT/creating-and-sending-signal-in-flask-for-python

@user_logged_in_signal.connect_via(app) 
def init(sender, user, **extra): 
    global project 
    project = user_project.Project() 
    project.init() 

und kein

user_logged_in_signal.connect(init, app) 

scheint auch praktikabel und einfacher zu lesen

+0

Dies ist ein hilfreicher Start. Ich habe ein paar Fragen: Erstens bin ich etwas verwirrt darüber, welchen Wrapper ich über die init-Funktion setzen würde, um() zu verbinden oder auf das Signal zu warten. Wäre es @connect oder wie funktioniert dieser Teil des Prozesses? –

+0

Sie nicht. 'user_logged_in_signal.connect (init, app)' macht es auf das Signal zu hören – codyc4321

+0

Es scheint von http://flask.pooco.org/docs/0.12/signals/, dass Sie diesen Dekorateur direkt über 'init' setzen können:' @ user_logged_in_signal.connect_via (app) '. Beispiel jetzt über – codyc4321

Verwandte Themen