首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Flask-Login?

如何使用Flask-Login?
EN

Stack Overflow用户
提问于 2014-09-04 04:44:31
回答 2查看 1.4K关注 0票数 3

我正在使用Flask-Login,并试图了解它是如何工作的。如果我理解正确的话,我应该创建一个user类,其中包含四个方法: is_authenticated、is_active、is_anonymous和get_id。我真的不知道在那之后我应该做什么。有一个名为login_user( user )的函数,据我所知,它将获取一个尚未通过身份验证的用户的实例并对其进行身份验证,但是当我的user类没有任何设置方法时,该函数如何工作呢?

下面是一些代码:

代码语言:javascript
复制
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对用户进行身份验证的猜测:

代码语言:javascript
复制
@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

我遗漏了什么?

编辑,下面是user_loader:

代码语言:javascript
复制
@lm.user_loader
def load_user(userid):
    return User.get(userid)

我在上面也有这个:

代码语言:javascript
复制
lm = LoginManager()
lm.init_app(app)
EN

回答 2

Stack Overflow用户

发布于 2014-09-04 19:01:13

在定义用户模型时,您必须让这四个方法实现(这是Flask-Login的工作方式)。但是,您不必自己定义它们,除非您需要一些自定义行为。Flask-Login为您提供了UserMixin类。你所要做的就是子类化你的用户模型,UserMixin会为你提供所有四种默认行为的方法。例如:

代码语言:javascript
复制
from flask.ext.login import UserMixin

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

在您的用户模型中,您可以覆盖这四种方法中的任何一种来满足您的需求。此外,请参考“您的用户类”部分的底部以获得进一步的参考:https://flask-login.readthedocs.org/en/latest/#your-user-class

为了获取用户数据,您应该使用表单。按照你的说法,用户必须将他/她的数据直接输入到网址中(我猜像/login?username=yourusername&password=youruserpassword)这样的东西是不安全的,通常被认为是一种糟糕的做法)。

相反,您应该使用表单让用户在中输入他们的登录数据。WTForms和Flask-WTF扩展为您提供了轻松创建表单的方法。例如:

代码语言:javascript
复制
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/

之后,您的视图应该只捕获表单数据,检查数据库中是否存在具有所提供数据的用户,以及所提供的密码是否与数据库中存储的密码匹配。这是您的视图所希望的方式:

代码语言:javascript
复制
@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/

票数 1
EN

Stack Overflow用户

发布于 2014-09-04 05:56:29

我发现这很有帮助:https://www.openshift.com/blogs/use-flask-login-to-add-user-authentication-to-your-python-application

请记住,永远不要将纯文本密码存储在数据库中以进行用户身份验证。

你还被卡住了吗?如果你需要我,我就在这里:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25653318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档