gpt4 book ai didi

python - 我如何使用 Flask-Login?

转载 作者:太空宇宙 更新时间:2023-11-04 05:59:56 24 4
gpt4 key购买 nike

我正在使用 Flask-Login 并试图了解它的工作原理。如果我对文档的理解正确,我应该创建一个包含四种方法的用户类,is_authenticated、is_active、is_anonymous 和 get_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-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

我错过了什么?

编辑,这里是 user_loader:

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

我也把这个放在最上面:

lm = LoginManager()
lm.init_app(app)

最佳答案

当定义用户模型时,您必须实现这四个方法(这就是 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),这是不安全的,通常是被认为是一种不好的做法。

相反,您应该使用表单让您的用户输入他们的登录数据。WTF​​orms 和 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/

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

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

作为旁注,此 View 假设您以纯文本形式存储密码,正如有人指出的那样,这是一个坏主意。我这样做只是为了演示登录功能。

此外,如果您想知道如何定义模型以及如何从数据库中查询数据,请参阅 Flask-SQLAlchemy https://pythonhosted.org/Flask-SQLAlchemy/和 SQLAlchemy http://www.sqlalchemy.org/

关于python - 我如何使用 Flask-Login?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25653318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com