2012-02-01 24 views
8

Pracuję nad aplikacją do butelkowania, która wymaga uwierzytelnienia. Podłączyłem login w kolbie, ale nie wydaje się to bardzo wdzięczne.przy użyciu skrzynki z loginem z postgresql

Pierwszy kolba Login musi upewnić się, że użytkownik istnieje:

@login_manager.user_loader 
def load_user(id): 
    return User.query.get(id) 

Ale trzeba także użyć 'login_user', aby utworzyć obiekt użytkownika

# Some code above 
    user = User.query.filter_by(email = form.email.data, password = form.password.data).first() 
    user.login_status = 1 
    db.session.commit() 
    login_user(objects.SignedInUser(user.id, user.email, user.login_status == LoginStatus.Active))  
# Some code below 

W powyższym kodzie „user "jest modelem dla PostgreSQL, a SignedInUser jest tylko obiektem do logowania na kolbę.

Czy ktoś ma przykład z kolbą-login używany z postgresem?

Odpowiedz

35

Wygląda na to, że możesz nie wiedzieć co obsługuje Flask-Login. Jest tam, aby śledzić wszystko na temat sesji użytkownika po tym, gdy powiesz mu, że uwierzytelnienie zakończyło się sukcesem (przez wywołanie login_user.) Oddzwanianie user_loader mówi tylko, jak ponownie załadować obiekt dla użytkownika, który już został uwierzytelniony, na przykład, gdy ktoś ponownie połączy się z sesja "zapamiętaj mnie". Dokumenty nie są specjalnie jasne.

Nie powinno być potrzeby przechowywania flagi w bazie danych dla statusu logowania użytkownika. Ponadto, kod, który zawierasz, podniesie AttributeError, jeśli poświadczenia są nieprawidłowe (user = None).

Oto przykład z aplikacji Flask-SQLAlchemy. Używa zewnętrznego źródła uwierzytelnienia i opakowania dla obiektu użytkownika SQLAlchemy, ale proces jest zasadniczo taki sam.

user_loader zwrotna:

@login_manager.user_loader 
def load_user(user_id): 
    user = User.query.get(user_id) 
    if user: 
     return DbUser(user) 
    else: 
     return None 

klasa użytkownika (wrapper dla obiektu sqlalchemy):

# User class 
class DbUser(object): 
    """Wraps User object for Flask-Login""" 
    def __init__(self, user): 
     self._user = user 

    def get_id(self): 
     return unicode(self._user.id) 

    def is_active(self): 
     return self._user.enabled 

    def is_anonymous(self): 
     return False 

    def is_authenticated(self): 
     return True 

Logowanie obsługi:

@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    error = None 
    next = request.args.get('next') 
    if request.method == 'POST': 
     username = request.form['username'] 
     password = request.form['password'] 


     if authenticate(app.config['AUTH_SERVER'], username, password): 
      user = User.query.filter_by(username=username).first() 
      if user: 
       if login_user(DbUser(user)): 
        # do stuff 
        flash("You have logged in") 

        return redirect(next or url_for('index', error=error)) 
     error = "Login failed" 
    return render_template('login.html', login=True, next=next, error=error) 

Zauważ, że logowania nie powiedzie się, jeśli:

  • zewnętrzny auth nie
  • zapytania użytkownik zwróci None (użytkownik nie istnieje)
  • login_user zwraca False (user.is_active() == False)

Wyloguj

@app.route('/logout') 
@login_required 
def logout(): 
    logout_user() 
    flash('You have logged out') 
    return(redirect(url_for('login'))) 
+1

trzeba @login_required dla metody wylogowania –

+1

dodałem go do wylogowania –

+0

Jakie rzeczy należą do "if login_user (DbUser (user)): # do stuff"? – Mittenchops

Powiązane problemy