Python 如何使用Flask登录?

Python 如何使用Flask登录?,python,flask-login,Python,Flask Login,我正在使用Flask登录,并试图了解它是如何工作的。如果我对文档理解正确,我应该创建一个用户类,它包含四种方法,即“已验证”、“已激活”、“匿名”和“获取id”。我真的不明白在这之后我应该做什么。有一个函数,login_user(user),我知道它会以一个尚未经过身份验证的用户为例对其进行身份验证,但是当我的用户类没有任何设置的方法时,它是如何工作的呢 下面是一些代码: class User: isAuth = False isActive = False isAnon

我正在使用Flask登录,并试图了解它是如何工作的。如果我对文档理解正确,我应该创建一个用户类,它包含四种方法,即“已验证”、“已激活”、“匿名”和“获取id”。我真的不明白在这之后我应该做什么。有一个函数,login_user(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登录对用户进行身份验证的猜测:

@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
我上面还有一个:

lm = LoginManager()
lm.init_app(app)

我发现这很有帮助:

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


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

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

from flask.ext.login import UserMixin

class User(UserMixin, Model):
    # your user model definition
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')
在您的用户模型中,您可以覆盖这四种方法中的任何一种,以满足您的需要。 此外,请参阅“您的用户类”部分的底部以获取进一步参考:

要获取用户数据,应使用表单。按照您的说法,用户必须将其数据直接输入URL(我猜类似于/login?username=yourusername&password=youruserpassword),这是不安全的,通常被认为是一种不好的做法

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

from flask.ext.login import UserMixin

class User(UserMixin, Model):
    # your user model definition
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')
供进一步参考: 和

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

@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和SQLAlchemy

尝试在处理响应的方法(如
index()
或类似方法)上方添加
@login#required
装饰器。这已经完成,但在上面的代码示例中不可见。请查看这是否有帮助:PEP-#(我真的不记得是哪一个):不要使用Camels!
isAuth
->
is_auth
,或者甚至
is_auth
如果这应该是常量,你实现了@login_manager.user_loader def load_user(user_id):return user.get(user.id==int(user_id))?(抱歉格式化)