我已经使用flask_security 在我的小型网络应用程序中启用身份验证。在早期阶段,我已经设法启用登录注销等功能。但是,在实现个人资料页面时,我无法更新记录。
视图:
@profile_bp.route('/', methods=('GET','POST'))
@login_required
def profile():
form_profile = ProfileForm(request.form)
user = User.query.filter_by(id=current_user.id).first()
if request.method == 'POST' and form_profile.save:
print("Profile form submitted")
user = User(
updated = utc_now_int(),
first_name = form_profile.first_name.data,
last_name = form_profile.last_name.data,
gender = form_profile.gender.data,
date_of_birth = form_profile.date_of_birth.data,
)
user.save()
return render_template('profile/profile_saved.html')
# Populate the form when when user loads his profile and then render the template
if user:
form_profile.first_name.data = user.first_name
form_profile.last_name.data = user.last_name
form_profile.gender.data = user.gender
form_profile.date_of_birth.data = user.date_of_birth
return render_template('profile/userprofile.html', form_profile=form_profile)
型号:
from app.database import Base
from flask_security.models import fsqla_v3 as fsqla
from flask_security import UserMixin, RoleMixin, AsaList
from sqlalchemy.orm import relationship, backref
from sqlalchemy.ext.mutable import MutableList
from sqlalchemy import Boolean, DateTime, Column, Integer, \
String, ForeignKey
from app.utilities.common import utc_now as now, uid_generator
class RolesUsers(Base):
__tablename__ = 'roles_users'
id = Column(Integer(), primary_key=True)
user_id = Column('user_id', Integer(), ForeignKey('users.id'))
role_id = Column('role_id', Integer(), ForeignKey('roles.id'))
class Role(Base, RoleMixin):
__tablename__ = 'roles'
id = Column(Integer(), primary_key=True)
name = Column(String(80), unique=True)
description = Column(String(255))
permissions = Column(MutableList.as_mutable(AsaList()), nullable=True)
class User(Base, UserMixin):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
email = Column(String(255), unique=True)
password = Column(String(255))
username = Column(String(255), unique=True, nullable=True)
fs_uniquifier = Column(String(64), unique=True, nullable=False)
created = Column(DateTime(), default=lambda: now())
active = Column(Boolean())
updated = Column(DateTime())
# confirmed_at = Column(DateTime(), default=lambda: now())
confirmed_at = Column(DateTime())
last_login_at = Column(DateTime())
current_login_at = Column(DateTime())
last_login_ip = Column(String(40))
current_login_ip = Column(String(40))
login_count = Column(Integer)
first_name = Column(String(255))
last_name = Column(String(255))
gender = Column(String(1))
date_of_birth = Column(DateTime())
roles = relationship('Role', secondary='roles_users',
backref=backref('users', lazy='dynamic'))
def __str__(self):
return self.email
我收到的错误是:
AttributeError: 'User' object has no attribute 'save'
我可以使用会话来更新orm之外的记录,但我想使用大多数flask_security和sqlalchamy兼容的方式来做到这一点,请帮忙。
正如其他人所说 - db.session.commit() 就是答案。我在您的示例中看到的主要问题是您正在创建一个新的用户记录并提交该记录 - 您正在覆盖“用户”变量。另外 - 您已经有“current_user” - 不知道为什么您要再次查找它! 所以:
if request.method == 'POST' and form_profile.save:
current_user.last_name = form_profile.last_name.data
db.session.commit()