2014-09-03 28 views
2

我正在使用Flask-Login並試圖瞭解它是如何工作的。如果我理解文檔的權利,我應該創建一個用戶類,該類包含四種方法,is_authenticated,is_active,is_anonymous和get_id。我真的不明白我應該怎麼做。有一個函數,login_user(用戶),我明白了我的實例還沒有通過身份驗證的用戶並進行身份驗證,但是當我的用戶類沒有任何設置方法時,它是如何工作的?如何使用Flask-Login?

下面是一些代碼:

class User: 
    isAuth = False 
    isActive = False 
    isAnon = True 
    id = unicode(0) 

    def __init__(self, isAuth, isActive, isAnon, id): 
     self.isAuth = isAuth 
     self.isActive = isActive 
     self.isAnon = isAnon 
     self.id = id 

    def is_authenticated(self): 
     return isAuth 

    def is_active(self): 
     return isActive 

    def is_anonymous(self): 
     return isAnon 

    def get_id(self): 
     return id 

這裏是我對我應該如何驗證用戶身份的猜測,通過使用authomatic和燒瓶登錄:

@app.route('/login/<provider_name>/', methods=['GET', 'POST']) 
def login(provider_name): 
    response = make_response() 
    result = authomatic.login(WerkzeugAdapter(request, response), provider_name) 
    user = User() 

    if result: 
     if result.user: 
      result.user.update() 
      login_user(user) 
     return render_template('login.html', result=result) 

    return response 

我缺少什麼?

EDIT中,這裏是user_loader:

@lm.user_loader 
def load_user(userid): 
    return User.get(userid) 

而且我也有這個頂部:

lm = LoginManager() 
lm.init_app(app) 
+0

嘗試增加'@ login_required'裝飾你上面的方法來處理響應(如'指數()'或類似的)。 – 2014-09-03 20:46:15

+0

這已完成,但在上面的代碼示例中不可見。 – theva 2014-09-03 20:47:21

+0

看看是否有幫助:http://stackoverflow.com/questions/12075535/flask-login-cant-understand-how-it-works?rq=1 – 2014-09-03 20:49:01

回答

1

當defininig用戶模型,你必須這四種方法實現(這是如何燒瓶登錄工程)。但是,除非需要一些自定義行爲,否則不必自己定義它們。 Flask-Login爲您提供了UserMixin類。你所要做的就是對你的用戶模型進行子類化,UserMixin將爲你提供所有四種默認行爲的方法。例如:

from flask.ext.login import UserMixin 

class User(UserMixin, Model): 
    # your user model definition 

在您的用戶模型中,您可以覆蓋這四種方法中的任何一種以滿足您的需求。 另外,請參閱進一步參考「User類」部分的底部: https://flask-login.readthedocs.org/en/latest/#your-user-class

對於獲取用戶數據,你應該使用的形式。你的方式,用戶將不得不直接輸入他/她的數據到URL中(我猜的是/login?username = yourusername & password = youruserpassword)這是不安全的,通常被認爲是壞的實踐。

相反,您應該使用表單爲您的用戶輸入其登錄數據.WTForms和Flask-WTF擴展爲您提供了輕鬆創建表單的方式。例如:

from flask_wtf import Form 
from wtforms import StringField, PasswordField, SubmitField 
from wtforms.validators import Required 

class LoginForm(Form): 
    username = StringField('Your username', validators=[Required()]) 
    password = PasswordField('Your password', validators=[Required()]) 
    submit = SubmitField('Sign In') 

更多參考: https://wtforms.readthedocs.org/en/latest/https://flask-wtf.readthedocs.org/en/latest/

您的視圖應該只捕獲表單數據後,檢查是否有提供數據的用戶在數據庫中,如果所提供的密碼存在匹配存儲在數據庫中的那個。這是你的看法如何想:

@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    form = LoginForm() 

    # on POST check if the submitted form is valid 
    if form.validate_on_submit(): 

     # get user from database 
     user = User.query.filter_by(username=form.username.data).first() 

     #check if the user exists and if he/she provided correct password 
     if user is not None and user.password == form.password.data: 

      # if everything checks out, call the login function 
      login(user) 

      # redirecting after form submission is also considered good practice 
      redirect(url_for('somewhere')) 

     # if user is not found or he/she provided wrong password, inform them 
     flash('Invalid username and/or password') 

    # on GET, just render the template with login form 
    return render_template('login.html', form=form) 

作爲一個側面說明,這種說法假定您存儲純文本,這是一個壞主意,因爲有人指出的密碼。我這樣做只是爲了演示登錄功能。

另外,如果你想知道如何定義模式以及如何查詢數據庫數據,是指瓶,SQLAlchemy的https://pythonhosted.org/Flask-SQLAlchemy/和SQLAlchemy的http://www.sqlalchemy.org/