如何自定义flask.ext.security.forms.LoginForm以提示并使用用户名而不是电子邮件?

如何自定义flask.ext.security.forms.LoginForm以提示并使用用户名而不是电子邮件?,flask,flask-security,Flask,Flask Security,如何自定义flask.ext.security.forms.LoginForm以提示并使用用户名而不是电子邮件 我已经试过了, class ExtendedLoginForm(LoginForm): name = TextField('User Name:', [Required()]) del LoginForm.email security = Security(app, user_datastore, login_form=ExtendedLoginForm) <

如何自定义flask.ext.security.forms.LoginForm以提示并使用用户名而不是电子邮件

我已经试过了,

class ExtendedLoginForm(LoginForm):
    name = TextField('User Name:', [Required()])
    del LoginForm.email

security = Security(app, user_datastore, login_form=ExtendedLoginForm)
<form action="{{ url_for_security('login') }}" method="POST" name="login_user_form">
    {{ login_user_form.hidden_tag() }}
    **{{ render_field_with_errors(login_user_form.name) }}**
    {{ render_field_with_errors(login_user_form.password) }}
    {{ render_field_with_errors(login_user_form.remember) }}
    {{ render_field(login_user_form.next) }}
    {{ render_field(login_user_form.submit) }}
</form>
更改了模板,

class ExtendedLoginForm(LoginForm):
    name = TextField('User Name:', [Required()])
    del LoginForm.email

security = Security(app, user_datastore, login_form=ExtendedLoginForm)
<form action="{{ url_for_security('login') }}" method="POST" name="login_user_form">
    {{ login_user_form.hidden_tag() }}
    **{{ render_field_with_errors(login_user_form.name) }}**
    {{ render_field_with_errors(login_user_form.password) }}
    {{ render_field_with_errors(login_user_form.remember) }}
    {{ render_field(login_user_form.next) }}
    {{ render_field(login_user_form.submit) }}
</form>

{{login\u user\u form.hidden\u tag()}
**{{render_field_带有错误(login_user_form.name)}**
{{render_field_带有_错误(login_user_form.password)}
{{render_field_带有错误(login_user_form.memory)}
{{render_字段(login_user_form.next)}
{{render_字段(login_user_form.submit)}
将userdb更改为使用名称而不是电子邮件


但是flask security仍然尝试在数据存储中而不是在用户中查找电子邮件。

在flask security的早期版本中,用户的唯一标识符是电子邮件属性。您可以通过添加自己的属性来扩展模型,但电子邮件字段仍然可以唯一标识用户(因此用户名必须是电子邮件字段)。 从1.7.0版开始,可以使用不同的属性标识用户。 在配置文件中,您应该添加

app.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = 'name'
但您仍然必须在模型中具有电子邮件属性。 git上3天报告了一个问题,这正是您想要的

使用名称而不是电子邮件地址登录(使用Flask Security 1.7.0或更高版本),您可以在
用户
模型中将
电子邮件
字段替换为
名称
字段

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    name = 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'))
并更新
app
配置

app.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = 'name'
app.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = ('name','email')
接下来,为了允许用户使用名称而不是电子邮件登录,我们将使用这样一个事实,即假定用户标识属性位于
email
form字段中

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)
这样,我们就可以使用名称登录,而无需重写验证方法或登录模板。当然,这是一种黑客行为,更正确的方法是向
ExtendedLoginForm
类添加一个自定义的
validate
方法(检查
name
表单字段),并相应地更新登录模板(如上面Raja R所做)。或者更好的方法是,将“LoginForm”中的“email”表单字段替换为“user\u identity”字段,并重写validate方法以适应任何用户标识字段

然而,上述方法使得使用姓名或电子邮件地址登录变得容易。为此,请使用名称和电子邮件字段定义一个用户模型

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), unique=True)
    name = 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'))
并更新
app
配置

app.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = 'name'
app.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = ('name','email')
最后,创建自定义登录表单

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)

现在,当登录时,Flask Security将在电子邮件表单字段中接受电子邮件或姓名。

我尝试了相同的方法,但没有成功。我使用flask security v 1.7.5
inline
app.config['security\u USER\u IDENTITY\u ATTRIBUTES']='username'类用户(db.Document,UserMixin):username=db.StringField(required=True,unique=True,index=True),但我得到了:“response”:{“errors”:{“email”:[1]0:“email not provided”-}-},允许姓名或电子邮件非常简单。只需设置SECURITY\u USER\u IDENTITY\u属性,两者都可以工作。
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)