2014-09-03 3 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' декоратор над вашими методами, которые обрабатывают ответы (такие как' индекс() 'или аналогичный). –

+0

Это сделано, но не видно в приведенном выше примере кода. – theva

+0

Посмотрите, поможет ли это: http://stackoverflow.com/questions/12075535/flask-login-cant-understand-how-it-works?rq=1 –

ответ

1

При определении модели пользователя у вас есть есть эти четыре метода реализации (как работает Flask-Login). Однако вам не обязательно определять их самостоятельно, если вам не нужно какое-то индивидуальное поведение. Flask-Login предоставляет вам класс UserMixin. Все, что вам нужно сделать, это подкласс вашей модели пользователя, а UserMixin предоставит вам все четыре метода по умолчанию. Например:

from flask.ext.login import UserMixin 

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

В вашей модели пользователя вы можете переопределить любой из этих четырех методов в соответствии с вашими потребностями. Кроме того, пожалуйста, обратитесь к нижней части раздела «Ваш класс пользователя» для дальнейшего использования: 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/

Смежные вопросы