<p>定义用户模型时,<strong>必须</strong>实现这四种方法(Flask Login就是这样工作的)。但是,您不必自己定义它们,除非您需要一些自定义行为。Flask Login为您提供<em>UserMixin</em>类。您所要做的就是将您的用户模型子类化,UserMixin将为您提供具有默认行为的所有四个方法。例如:</p>
<pre><code>from flask.ext.login import UserMixin
class User(UserMixin, Model):
# your user model definition
</code></pre>
<p>在用户模型中,您可以覆盖这四种方法中的任何一种来满足您的需要。
此外,请参阅“您的用户类”部分的底部以获取进一步的参考:
<a href="https://flask-login.readthedocs.org/en/latest/#your-user-class" rel="nofollow">https://flask-login.readthedocs.org/en/latest/#your-user-class</a></p>
<p>要获取用户数据,应该使用窗体。按照你的说法,用户必须直接在URL中输入他/她的数据(我猜是<em>/login?username=yourusername&password=youruserpassword</em>),这是不安全的,通常被认为是一种不好的做法。在</p>
<p>相反,您应该使用表单让用户在其中输入他们的登录数据。WTForms和Flask WTF扩展为您提供了轻松创建表单的方法。例如:</p>
^{pr2}$
<p>供进一步参考:
<a href="https://wtforms.readthedocs.org/en/latest/" rel="nofollow">https://wtforms.readthedocs.org/en/latest/</a>和
<a href="https://flask-wtf.readthedocs.org/en/latest/" rel="nofollow">https://flask-wtf.readthedocs.org/en/latest/</a></p>
<p>之后,您的视图应该只捕获表单数据,检查数据库中是否存在具有提供数据的用户,以及提供的密码是否与数据库中存储的密码匹配。您的观点如下:</p>
<pre><code>@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)
</code></pre>
<p>顺便说一句,这个视图假设您以纯文本存储密码,这是一个坏主意,正如有人指出的那样。我这样做只是为了演示登录功能。在</p>
<p>另外,如果您想知道如何定义模型以及如何从数据库中查询数据,请参考Flask SQLAlchemy<a href="https://pythonhosted.org/Flask-SQLAlchemy/" rel="nofollow">https://pythonhosted.org/Flask-SQLAlchemy/</a>和SQLAlchemy<a href="http://www.sqlalchemy.org/" rel="nofollow">http://www.sqlalchemy.org/</a></p>