<p>要使用用户名而不是电子邮件地址登录(使用Flask Security 1.7.0或更高版本),可以在<code>User</code>模型中将<code>email</code>字段替换为<code>username</code>字段</p>
<pre><code>class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(255), unique=True, index=True)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
confirmed_at = db.Column(db.DateTime())
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
</code></pre>
<p>{cd4>更新配置。在</p>
^{pr2}$
<p>接下来,为了允许用户使用用户名而不是电子邮件登录,我们将使用<a href="https://github.com/mattupstate/flask-security/blob/develop/flask_security/forms.py" rel="noreferrer">LoginForm validation method</a>假定用户标识属性在<code>email</code>表单字段中。在</p>
<pre><code>from flask_security.forms import LoginForm
from wtforms import StringField
from wtforms.validators import InputRequired
class ExtendedLoginForm(LoginForm):
email = StringField('Username', [InputRequired()])
# Setup Flask-Security
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore,
login_form=ExtendedLoginForm)
</code></pre>
<p>这样,我们就可以使用用户名登录,而不必重写验证方法或登录模板。当然,这是一种黑客攻击,更正确的方法是向<code>ExtendedLoginForm</code>类添加一个自定义的<code>validate</code>方法,该方法检查<code>username</code>表单字段,并相应地更新登录模板。在</p>
<p>然而,使用上述地址登录<strong或strong>的方法更容易。为此,请定义一个同时包含用户名和电子邮件字段的用户模型。在</p>
<pre><code>class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(255), unique=True)
username = db.Column(db.String(255), unique=True, index=True)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
confirmed_at = db.Column(db.DateTime())
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
</code></pre>
<p>并更新<code>app</code>配置。在</p>
<pre><code>app.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = ('username','email')
</code></pre>
<p>最后,创建自定义登录表单。在</p>
<pre><code>from flask_security.forms import LoginForm
from wtforms import StringField
from wtforms.validators import InputRequired
class ExtendedLoginForm(LoginForm):
email = StringField('Username or Email Address', [InputRequired()])
# Setup Flask-Security
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore,
login_form=ExtendedLoginForm)
</code></pre>
<p>现在,当登录时,Flask Security将接受电子邮件表单字段中的电子邮件或用户名。在</p>