Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用户模型更改时,Flask admin会覆盖密码

用户模型更改时,Flask admin会覆盖密码
EN

Stack Overflow用户
提问于 2016-08-27 20:00:10
回答 2查看 3.4K关注 0票数 6

我目前正在研究一个flask项目,并第一次尝试使用flask-admin。到目前为止,一切都很正常,但有一件事真的困扰着我:每当我编辑我的用户模型时,用户的密码都会被覆盖。我正在遵循this question第二个答案中给出的建议,以防止flask-admin重新散列我的密码。不幸的是,空的密码字段仍然会写入数据库。

我试图从User-Model获取当前密码,该密码是作为on_model_change方法的参数提供的,但不知何故,密码似乎在此时已被覆盖(或者它不是我在这里查看的实际数据库模型-我在这里有点困惑)。

下面是我的代码:

用户模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class User(UserMixin, SurrogatePK, Model):
    """A user of the app."""

    __tablename__ = 'users'
    username = Column(db.String(80), unique=True, nullable=False)
    email = Column(db.String(80), unique=True, nullable=False)
    #: The hashed password
    password = Column(db.String(128), nullable=True)
    created_at = Column(db.DateTime, nullable=False,
                        default=datetime.datetime.utcnow)
    first_name = Column(db.String(30), nullable=True)
    last_name = Column(db.String(30), nullable=True)
    active = Column(db.Boolean(), default=False)
    is_admin = Column(db.Boolean(), default=False)

    def __init__(self, username="", email="", password=None, **kwargs):
        """Create instance."""
        db.Model.__init__(self, username=username, email=email, **kwargs)
        if password:
            self.set_password(password)
        else:
            self.password = None

    def __str__(self):
        """String representation of the user. Shows the users email address."""
        return self.email

    def set_password(self, password):
        """Set password"""
        self.password = bcrypt.generate_password_hash(password)

    def check_password(self, value):
        """Check password."""
        return bcrypt.check_password_hash(self.password, value)

    def get_id(self):
        """Return the email address to satisfy Flask-Login's requirements"""
        return self.id

    @property
    def full_name(self):
        """Full user name."""
        return "{0} {1}".format(self.first_name, self.last_name)

    @property
    def is_active(self):
        """Active or non active user (required by flask-login)"""
        return self.active

    @property
    def is_authenticated(self):
        """Return True if the user is authenticated."""
         if isinstance(self, AnonymousUserMixin):
            return False
        else:
            return True

    @property
    def is_anonymous(self):
        """False, as anonymous users aren't supported."""
        return False

Flask-管理员UserView

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class UserView(MyModelView):
    """Flask user model view."""
    create_modal = True
    edit_modal = True

    def on_model_change(self, form, User, is_created):
        if form.password.data is not None:
            User.set_password(form.password.data)
        else:
           del form.password

    def on_form_prefill(self, form, id):
        form.password.data = ''                                              

任何帮助都是非常感谢的。提前谢谢你,

oneiro

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-28 10:29:42

重写get_edit_form方法并从编辑窗体中完全删除密码字段可能更容易。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class UserView(MyModelView):
    def get_edit_form(self):
        form_class = super(UserView, self).get_edit_form()
        del form_class.password
        return form_class

另一种替代方法是从表单中完全删除模型密码字段,并使用虚拟密码字段,然后可以使用该字段填充模型的密码。通过删除真实密码字段,Flask-Admin将不会涉及我们的密码数据。示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class UserView(MyModelView):
    form_excluded_columns = ('password')
    #  Form will now use all the other fields in the model

    #  Add our own password form field - call it password2
    form_extra_fields = {
        'password2': PasswordField('Password')
    }

    # set the form fields to use
    form_columns = (
        'username',
        'email',
        'first_name',
        'last_name',
        'password2',
        'created_at',
        'active',
        'is_admin',
    )

    def on_model_change(self, form, User, is_created):
        if form.password2.data is not None:
            User.set_password(form.password2.data)
票数 9
EN

Stack Overflow用户

发布于 2020-03-20 18:11:54

我也遇到过类似的问题。当密码的字段被更改时,我需要生成密码的哈希。我不想添加额外的表单来更改密码。在后端,我使用了MongoDB。我对flask admin的解决方案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class User(db.Document, UserMixin):
    ***
    password = db.StringField(verbose_name='Password')
    roles = db.ListField(db.ReferenceField(Role), default=[] 

    def save(self) -> None:
        if not self.id:
            self.password = hashlib.md5((self.password + Config.SECURITY_PASSWORD_SALT).encode()).hexdigest()
            return super(User, self).save(self)
        else:
            return super(User, self).update(
            ***
            password = self.password,
            )

class UserModelView(ModelView):   
    def on_model_change(self, form, model, is_created):
        user = User.objects(id=model.id)[0]
        if user.password != form.password.data:
            model.password = hashlib.md5((form.password.data + Config.SECURITY_PASSWORD_SALT).encode()).hexdigest()

admin.add_view(UserModelView(User, 'Users'))

对于SQL解决方案,它也将是实际的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39185230

复制
相关文章
使用VBA将图片从一个工作表移动到另一个工作表
今天跟大家分享的技巧来自thesmallman.com,一个分享Excel技巧技术的网站。
fanjy
2022/11/16
4K0
使用VBA将图片从一个工作表移动到另一个工作表
VBA实战技巧29:从一个工作表复制数据到另一个工作表
今天演示一个简单的例子,也是经常看到网友问的问题,将一个工作表中的数据复制到另一个工作表。
fanjy
2021/07/30
25.6K1
SQL如何使用Merge将一个上传的表与另一个表对比并更新
例如我们需要更新PeopleEmailList这个表,这表里有100个人,但是我上传的临时表里只有15个人(需要修改)。 且我们Source的表是需要先和别的表合并展示才可以的,那么我们需要先Join查询并加上括号:
繁华是客
2023/03/03
2.5K0
MySQL里用一个表的数据更新另一个表
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/53908593
用户1148526
2019/05/25
4K0
php 使用PHPEXcel导出表数据
PHPEXCEL ~ 13KB    下载(28)
用户7999227
2021/09/22
3.4K0
将顺序表中非零元素移动到顺序表的前面
已知长度为n的线性表A采用顺序存储结构,编写算法将A中所有的非零元素依次移到线性表A的前端
别团等shy哥发育
2023/02/27
4400
将顺序表中非零元素移动到顺序表的前面
PHP将数据导出Excel表中(投机型)
  因为ms word和excel的文档都支持html文本格式,因此我们可以基于这个原理采用html文本格式进行数据的输出。
那一叶随风
2018/08/22
1.6K0
PHP将数据导出Excel表中(投机型)
MySQL/Oracle怎么把一个表的数据复制到另一个表
创建新表复制原有表的结构和数据 create table new_table as select * from old_table; 复制一张表的数据到另一张表(表结构相同) INSERT into table1 select * from table2; 复制一张表的数据到另一张表(表结构相同) INSERT into table1(表中字段1,表中字段2) select 表中字段1,表中字段2 from table2;
共饮一杯无
2022/11/28
1.3K0
使用PHP脚本创建MySQL 数据表
通过 mysql> 命令窗口可以很简单的创建MySQL数据表。你可以使用 SQL 语句 CREATE TABLE 来创建数据表。
用户9239730
2021/11/29
3K0
使用mysql触发器新增或修改一个表后,触发到另一个表
在工作中,有时候,我们需要备份一个表。或者是在向一张表中添加一条数据后,另一张同结构的表也要添加用于备份。如下:
凯哥Java
2019/06/28
7.4K0
使用mysql触发器新增或修改一个表后,触发到另一个表
错误:该行已经属于另一个表
从一个TABLE中取一行放到另一个TABLE里报错: 该行已经属于另一个表。的解决办法  用下面来个方法就OK了。   DataTable dt = new DataTable();   dt = ds.Tables["All"].Clone();//克隆All的结构传递给dt   DataRow[] dr=this.dataSet31.Tables["Product"].Select("bc=1"); //通过条件得到符合条件的行 for(int i=0;i<dr.Length;i++) { //将数组元
跟着阿笨一起玩NET
2018/09/18
8230
PHP将PDO读取的数据转JSON格式输出
数据库结构及内容如下: PHP处理 <?php // 链接数据库 require_once('conn.php'); // 头部声明为json header("Content-type:applic
岳泽以
2023/04/23
2.6K0
PHP将PDO读取的数据转JSON格式输出
SQL 复制表到另一个表
 INSERT INTO targetTableName SELECT COLUMNS FROM sourceTableName;
星哥玩云
2022/08/18
9710
如何在SQL Server中将表从一个数据库复制到另一个数据库
在某些情况下,作为DBA,您需要将模式和特定表的内容从数据库复制到同一实例中或在不同的SQL实例中,例如从生产数据库中复制特定表到开发人员以进行测试或排除故障。 SQL Server提供了许多方法,可以用来执行表的数据和模式复制过程。为了研究这些方法中的每一个,我们将考虑下面的场景: 托管SQL服务器:localhost。这两个数据库都驻留在同一个SQL Server 2014实例中。 源数据库:AdventureWorks2012。 目标数据库:SQLShackDemo。 将从源数据库复制到目标数据库的表
程序你好
2018/07/20
8.3K0
将一个工作表拆分为多个工作表
最近已经不止一次被人问到:怎么将一个工作表拆分为多个工作表?一般这样的需求,是因为将1-12月的数据写在了一个工作表上,而现在又想将它拆分为12个单独的工作表,每个工作表单独一个月份.总结了一下,文艺
但老师
2022/03/22
4.4K0
将一个工作表拆分为多个工作表
错误:该行已经属于另一个表
从一个TABLE中取一行放到另一个TABLE里报错: 该行已经属于另一个表。的解决办法 用下面来个方法就OK了。 DataTable dt = new DataTable(); dt = ds.Tables["All"].Clone();//克隆All的结构传递给dt DataRow[] dr=this.dataSet31.Tables["Product"].Select("bc=1"); //通过条件得到符合条件的行 for(int i=0;i<dr.Length;i++) { //将数组元素加入表.
hbbliyong
2018/03/05
7930
yhd-VBA从一个工作簿的某工作表中查找符合条件的数据插入到另一个工作簿的某工作表中
【问题】我们在工作中有时要在某个文件(工作簿)中查找一些数据,提取出来。常用的方法是打开文件,来查找,再复制保存起来。如果数据少还是手工可以的,如果数据多了可能就。。。。
哆哆Excel
2022/10/31
5.5K0
php清空mysql数据表,mysql怎么清空数据表数据[通俗易懂]
在mysql中,可以利用“DELETE”和“TRUNCATE”关键字来清空数据表中的数据,具体语法为“DELETE FROM 数据表;”和“TRUNCATE TABLE 数据表;”。
全栈程序员站长
2022/08/25
12.3K0
php清空mysql数据表,mysql怎么清空数据表数据[通俗易懂]
点击加载更多

相似问题

红移将数据从一个表移动到另一个表

10

使用PDO将MySQL表行移动到另一个表

112

将数据从一个表移动到另一个表

10

将数据从一个表移动到另一个表

30

将数据从一个表移动到另一个表

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文