2015-02-18 16 views
8

Kimlik doğrulama işlemlerini gerçekleştiren bir plan oluşturdum. Bu mavi baskı Flask-Login'i kullanıyor. Ve aşağıdaki gibi, daha fazla kod gösterilmemiştir. planı olarak@login_required uygulaması flask uygulamasında

aşağıdakileri sorunum:

from flask.ext.login import LoginManager 
from flask.ext.login import UserMixin 
from flask.ext.login import current_user 
from flask.ext.login import login_required 
from flask.ext.login import login_user 
from flask.ext.login import logout_user 

auth_print = Blueprint('auth_print', __name__) 
login_manager = LoginManager() 
login_manager.login_view = '/login' 

class User(UserMixin): 

    user_store = {} # Stores the users that are already logged in. 

    def __init__(self, user_id): 
    self.user_store[user_id] = self # add the user to the user_store 
    self.username = user_id # the user_id is in fact the username 
    self.id = unicode(user_id) 

    def sign_out(self): 
    logout_user() 
    try: 
     del self.user_store[self.id] 
    except KeyError: 
     pass 

    @classmethod 
    def get(cls, user_id): 
    return cls.user_store.get(user_id) 

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

def get_current_user(): 
    return current_user 

@login_required 
@auth_print.route('/') 
def user(): 
    return "Welcome, and thanks for logging in." 

Sonra için kimlik doğrulaması eklemek istediğim küçük bir uygulaması vardır.

Küçük App

import the_above_module 
app.register_blueprint(the_above_module.auth_print) # register the blueprint 

@the_above_module.login_required 
@app.route('/profile') 
def protected(): 
    name = the_above_module.get_current_user().username 
    return "Thank you for logging in." 

if __name__ == '__main__': 
    app.run(host='0.0.0.0', port=8000) 

Şimdi ben tarayıcıyı açıp localhost giderseniz, planın @login_required çünkü çalıştığını biliyorum: 8000/I imzalamak zorunda

ben gidip Ancak eğer. localhost: 8000/profile login_required dekoratör asla tetiklenmez. Bu yüzden bir hata alıyorum çünkü mevcut kullanıcı yok.

Neden aynı ad boşluklarını koruduğumda bile, @login_required uygulamada değil, uygulamada çalışsın?

cevap

16

Dekoratörlerin sırasını değiştirmeniz gerekir. Flask documentation:

Bu dekoratörü şimdi nasıl kullanırsınız? Görüntüleme işlevine en içteki dekoratör olarak uygulayın. ayrıca dekoratörler uygularken, her zaman rota() dekoratör dıştaki olduğunu unutmayın:

@app.route('/secret_page') 
@login_required 
def secret_page(): 
    pass 
+0

çalışıyor. Teşekkürler, uzun bir gündü. – steve

0
@login_manager.unauthorized_handler 
def unauthorized_callback(): 
    return redirect(url_for('website.index')) 
+2

Lütfen sorunuzun neden/nasıl çözüldüğünü açıklayınız. –

İlgili konular