Boa*_*oaz 5 python flask flask-security
我希望在User模型中使用该字段,用户通过它来登录username而不是email
我定义了:
app.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = 'username'
但我仍然得到:
user_datastore.add_role_to_user(name, 'mgmt')
File "/Users/boazin/sentinal/sentinel-cloud/.env/lib/python2.7/site-packages/flask_security/datastore.py", line 105, in add_role_to_user
user, role = self._prepare_role_modify_args(user, role)
File "/Users/boazin/sentinal/sentinel-cloud/.env/lib/python2.7/site-packages/flask_security/datastore.py", line 72, in _prepare_role_modify_args
user = self.find_user(email=user)
File "/Users/boazin/sentinal/sentinel-cloud/.env/lib/python2.7/site-packages/flask_security/datastore.py", line 203, in find_user
return self.user_model.query.filter_by(**kwargs).first()
File "/Users/boazin/sentinal/sentinel-cloud/.env/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 1333, in filter_by
for key, value in kwargs.items()]
File "/Users/boazin/sentinal/sentinel-cloud/.env/lib/python2.7/site-packages/sqlalchemy/orm/base.py", line 383, in _entity_descriptor
(description, key)
InvalidRequestError: Entity '<class 'flask_app.models.User'>' has no property 'email'
Run Code Online (Sandbox Code Playgroud)
似乎电子邮件被硬编码到烧瓶安全...
我可以改变吗?
编辑:用户模型(在评论中请求):
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))
token = db.Column(db.String(255), unique=True, index=True)
active = db.Column(db.Boolean())
confirmed_at = db.Column(db.DateTime())
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
Run Code Online (Sandbox Code Playgroud)
eri*_*ric 13
要使用用户名而不是电子邮件地址登录(使用Flask-Security 1.7.0或更高版本),您可以email使用模型中的username字段替换该字段User
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'))
Run Code Online (Sandbox Code Playgroud)
并更新app配置.
app.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = 'username'
Run Code Online (Sandbox Code Playgroud)
接下来,为了允许用户使用用户名而不是电子邮件进行登录,我们将使用LoginForm验证方法假定用户身份属性位于email表单字段中的事实.
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)
Run Code Online (Sandbox Code Playgroud)
这样,我们可以使用用户名登录而无需重写验证方法或登录模板.当然,这是一个hack,更正确的方法是添加一个自定义validate方法,它检查username表单字段,ExtendedLoginForm类,并相应地更新登录模板.
但是,上述方法可以轻松使用用户名或电子邮件地址登录.为此,请使用用户名和电子邮件字段定义用户模型.
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'))
Run Code Online (Sandbox Code Playgroud)
并更新app配置.
app.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = ('username','email')
Run Code Online (Sandbox Code Playgroud)
最后,创建自定义登录表单.
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)
Run Code Online (Sandbox Code Playgroud)
现在,登录时,Flask-Security将在电子邮件表单字段中接受电子邮件或用户名.
来自https://pythonhosted.org/Flask-Security/models.html
字段id, email, password, active是必不可少的。所以添加
email = db.Column(db.String(255), unique=True)
Run Code Online (Sandbox Code Playgroud)
只需添加您的自定义username字段即可。
| 归档时间: |
|
| 查看次数: |
2793 次 |
| 最近记录: |