首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用户模型更改时,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

复制
相关文章
nginx 502
错误: nginx 转发报502错误。查看错误日志: [error] 5056#0: *180 connect() failed (113: No route to host) while connecting to upstream 百度了一下说是防火墙问题,果然,把要转发的服务器防火墙关闭就ok了
红目香薰
2022/11/28
7050
Nginx中的502和504
Nginx作为一个流行、轻量、高性能、稳定的web服务器,是应用运维日常最常接触的web服务器,更多的时候它是用于web代理服务,今天要说的是日常维护Nginx中最常遇到的两个HTTP状态码502和504
李俊鹏
2020/06/15
8.4K0
Nginx中的502和504
php-fpm报502问题「建议收藏」
搭建lnmp完lnmp环境后,测试时出现502报错,看到这个问题,我立刻想到是php-fpm没有起来,但是我用 ps -ef | grep php-fpm 截取 php-fpm 的进程,发现是有的,这时我有查看nginx的错误日志,发现错误信息是:
全栈程序员站长
2022/07/18
4550
php-fpm报502问题「建议收藏」
解决502 bad gateway的九种方案及原因
502 Bad Gateway 是一种HTTP协议的服务器端错误状态代码,它表示作为网关或代理角色的服务器,从上游服务器(如tomcat、php-fpm)中接收到的响应是无效的。
无刺鱼
2022/03/29
71.5K0
解决502 bad gateway的九种方案及原因
一边制造,一边讲解http状态码502|504|499|500
Status Code 499、500、502、504也是后端Http服务经常返回的状态码,试想一下,对于每个状态码,如果你能通过一些修改或配置来人为复现它,是不是会更利于你去掌握它呢?本文就是通过制造它们的方式来学习它们。
后端技术探索
2018/12/18
9.2K0
nginx的502问题
1.配置错误 因为nginx找不到php-fpm了或者socket文件权限不对,所以报错,一般是fastcgi_pass后面的路径配置不当,后面可以是socket或者是ip:port,从php5.4版本之后如果使用socket方式,默认权限给的比较低,所以需要把监听权限改为777,对应配置为 listen.mode=0777 2.资源耗尽 lnmp架构在处理php时,nginx直接调取后端的php-fpm服务,如果nginx的请求量偏高,我们又没有给php-fpm配置足够的子进程,那么php-fpm就会
老七Linux
2018/05/31
1.4K0
501:502:503:504都是什么原因
一:500错误 1、500 Internal Server Error 内部服务错误:顾名思义500错误一般是服务器遇到意外情况,而无法完成请求。
Java帮帮
2018/12/26
5.8K0
[HTTP] http中的502 , 504 , 499 500都是啥
经常我们会遇到502错误 , 502错误究竟是啥呢 , 在字面意思是指bad gateway 网关错误 , 网关是啥
唯一Chat
2020/03/24
1.7K0
nginx 自定义 502 页面
server conf 配置 server { listen 80; listen 443; server_name www.xieboke.net xieboke.net; charset utf-8; client_max_body_size 50m; ssl on; ssl_certificate /root/yzq/djangos/blog/cert
卓越笔记
2023/02/18
8720
nginx 自定义 502 页面
宝塔面板创建DVWA靶场,php-fpm报502问题
今天闲来无事,想着重新搭建DVWA靶场耍耍,遂在宝塔面板上尝试搭建DVWA靶场,搭建过程中,发现访问php页面访问报错502状态码,于是就把排查解决过程中记录了下来,供大家参考。
韦锡隆
2023/04/19
2.7K0
nginx 请求头过大导致502
我遇到这个问题是因为最近博客从solo迁移到bolo 在迁移完了之后点击链接比较深的时候,会报502错误,但是整个链接的响应速度比较快,于是就看了当时报错的请求参数,如下图所示:
zeekling
2022/06/17
1.8K0
nginx 请求头过大导致502
nginx之php-fpm优化
先来看一段日志(此日志来自于 var/log/php-fpm.log ): [13-Aug-2017 03:30:03] NOTICE: fpm is running, pid 28263 [13-Aug-2017 03:30:03] NOTICE: ready to handle connections [13-Aug-2017 10:11:04] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or p
老七Linux
2018/05/09
4.9K0
08 . Nginx状态码
HTTP状态码 本篇文章主要介绍运维过程中经常遇到的状态码,并通过业界流行的Nginx进行模拟实现。 2XX状态码 2XX类型状态码表示一个HTTP请求成功,最典型的就是200 # 200状态码 # 这个使我们最希望看到的状态码,表示一个HTTP请求得到了正确的响应,在此不做模拟测试 3XX状态码 # 3XX 类型状态码主要表示HTTP请求URL重定向行为,最常见的3XX状态码有301,302,304 301 测试用例 # URL: 永久性重定向,在Nginx中通过rewrite指令结合per
iginkgo18
2020/09/27
1.2K0
解Bug之路-Nginx 502 Bad Gateway
事实证明,读过Linux内核源码确实有很大的好处,尤其在处理问题的时刻。当你看到报错的那一瞬间,就能把现象/原因/以及解决方案一股脑的在脑中闪现。甚至一些边边角角的现象都能很快的反应过来是为何。笔者读过一些Linux TCP协议栈的源码,就在解决下面这个问题的时候有一种非常流畅的感觉。
呆呆
2021/05/20
2.3K0
前端报502 bad gateway的原因及解决方案
502 Bad Gateway服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。 解决办法是:再刷新一下网页或清理一下电脑的缓冲文件在打开你想打开的网页就好了. 一般情况下,这种办法是行得通的,但也不排除你所访问的网页被屏蔽的可能,如果你所访问的网页被屏蔽的话,就不管你怎么刷新也是没用的了。
全栈程序员站长
2022/09/30
11.6K0
前端报502 bad gateway的原因及解决方案
解Bug之路-Nginx 502 Bad Gateway
事实证明,读过Linux内核源码确实有很大的好处,尤其在处理问题的时刻。当你看到报错的那一瞬间,就能把现象/原因/以及解决方案一股脑的在脑中闪现。甚至一些边边角角的现象都能很快的反应过来是为何。笔者读过一些Linux TCP协议栈的源码,就在解决下面这个问题的时候有一种非常流畅的感觉。
无毁的湖光-Al
2020/07/27
1.8K0
解Bug之路-Nginx 502 Bad Gateway
nginx + php-fpm 性能调优
对于PHP服务而言,nginx + php-fpm 是常用的服务配置,如何进行服务器性能调优是一个服务端开发的必备技能。
用户3147702
2022/06/27
1.4K0
12.15 Nginx解析php相关配置
Nginx解析php相关配置目录概要 配置如下: location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/tmp/php-fcgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name; } fastcgi_
运维小白
2018/02/06
2K0
nginx,php-fpm配置部分小结
一、有了方向才不会一次又一次的抓狂 路径解析: 1.1 /usr/local/nginx 目录下: /usr/local/src //下载目录 /usr/local/nginx/conf/nginx.conf //nginx主配置文件 /usr/local/nginx/conf/vhost/ //虚拟主机配置目录 /usr/local/nginx/conf/htpasswd //配置密钥 /usr/local/nginx/logs/ //ng
老七Linux
2018/05/09
1.2K0
详解 Nginx 和 php-fpm 调用方式
PHP 项目使用 Nginx 时,一般通过 php-fpm Nginx+PHP-FPM 形式访问交互,本文将详细解读 Nginx 配置文件、PHP-FPM、PHP-CGI 和 fastCGI 的概念。
Yangsh888
2022/03/28
2.6K0

相似问题

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

10

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

112

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

10

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

30

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

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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