Как использовать Flask-Login?

Я использую Flask-Login и пытаюсь понять, как это работает. Если я правильно понимаю документы, я должен создать пользовательский класс, который содержит четыре метода: is_authenticated, is_active, is_anonymous и get_id. Я не понимаю, что я должен делать после этого. Существует функция login_user (пользователь), которая, как я понимаю, возьмет мой экземпляр еще не прошедшего проверку подлинности пользователя и проверит его подлинность, но как это работает, когда у моего пользовательского класса нет установленных методов?

Вот какой код:

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 и Flask-Login:

 @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) 

Когда вы определяете модель User, вам необходимо реализовать эти четыре метода (как работает 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) - @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) 

В качестве дополнительной заметки этот взгляд предполагает, что вы храните пароли в текстовом виде, что является плохой идеей, как указал кто-то. Я сделал это так, чтобы продемонстрировать функциональность входа в систему.

Кроме того, если вам интересно, как определять модели и как запрашивать данные из базы данных, см. Flask-SQLAlchemy https://pythonhosted.org/Flask-SQLAlchemy/ и SQLAlchemy http://www.sqlalchemy.org/

Я нашел, что это очень полезно: https://www.openshift.com/blogs/use-flask-login-to-add-user-authentication-to-your-python-application

Помните, что никогда не хранить пароли с открытым текстом в БД для аутентификации пользователей.

Вы все еще застряли? Я здесь, если ты мне нужен 🙂