当前位置: 首页 > news >正文

【flask+python】利用魔术方法,更优雅的封装model类

定义model

# @Time      :2024-2024/2/27-14:49
# @Email     :514422868@qq.com
# @Author    :Justin
# @file      :user.py
# @Software  :01-fishbook
from app.model.base import Base
from sqlalchemy import Column, Integer, SmallInteger, String
from werkzeug.security import generate_password_hash, check_password_hashclass User(Base):# auto_increment=True 不需要auto_incrementid = Column(Integer, primary_key=True)nickname = Column(String(32), index=True, nullable=False, unique=True)email = Column(String(32), index=True, nullable=False, unique=True)status = Column(SmallInteger, default=1)_password = Column("password", String(256))@propertydef password(self):return self._password# 这里必须是属性名称@password.setterdef password(self, raw):self._password = generate_password_hash(raw)def check_password(self, raw: str):# 必须是先是加密之后的密码,再是原始密码return check_password_hash(self.password, raw)

里面的注释要好好看,
注意@property是 obj.password时触发,因为password是密文存储的,
所以,在赋值时指向password(self,raw)的方法,将它加密
使用的generate_password_hash 和 check_password_hash 都是werkzeug.security下的方法。

因为两个魔力函数的存在,使得,
涉及密码时不可以传统的方式验证用户是否存在:

def find_user():with app.app_context():# 上面一种查询方式错误,因为对password的属性进行了getter和setter的装饰器修饰# User.query.filter_by(email=email, password=password).first()# 正确的方式应用这样# user = User.query.filter_by(_password="123456").first()# 业务上的使用方式是这样:param = {"email": "a@qq.com","password": "123456"}user = User.query.filter_by(email=param["email"]).first()if user:print(user.check_password(param["password"]))print(user)a_en = generate_password_hash("a")print(check_password_hash(a_en, "a"))print(a_en)

filter的妙用

	@propertydef intro(self):self.intro = filter(lambda x: True if x else False, [self.author, self.publisher, self.price])
http://www.lryc.cn/news/308178.html

相关文章:

  • Qt程序设计-报警灯自定义控件实例
  • Linux之定时任务02
  • PHP堆栈+errLog定位
  • 【大数据】Flink SQL 语法篇(七):Lookup Join、Array Expansion、Table Function
  • 【云原生】Spring Cloud Gateway的底层原理与实践方法探究
  • springboot 实现本地文件存储
  • Python进阶学习:Pandas--查看DataFrame中每一列的数据类型
  • Groovy - 大数据共享搜索配置
  • 第三节:Vben Admin登录对接后端login接口
  • 关于CSS 优先级布局应用的教程
  • vue2+elementui上传照片(el-upload 超简单)
  • 目标检测新SOTA:YOLOv9问世,新架构让传统卷积重焕生机(附代码)
  • Javascript:输入输出
  • Windows系统安装TortoiseSVN并结合内网穿透实现远程访问本地服务器——“cpolar内网穿透”
  • HarmonyOS 开发之———应用程序入口—UIAbility的使用
  • 推荐几款优秀免费开源的导航网站
  • input输入框过滤非金额内容保留一个小数点和2位小数
  • 推荐系统经典模型YouTubeDNN代码
  • 学习加密(三)spring boot 使用RSA非对称加密,前后端传递参数加解密
  • 面向对象编程入门:掌握C++类的基础(2/3):深入理解C++中的类成员函数
  • javaWeb学习04
  • Day07:基础入门-抓包技术全局协议封包监听网卡模式APP小程序PC应用
  • 通过elementUI学习vue
  • 音视频数字化(数字与模拟-电视)
  • CSS复合选择器(二)
  • Postgresql中VACUUM操作原理和应用
  • 5.1 Ajax数据爬取之初介绍
  • react-组件进阶
  • 企业有了ERP,为什么还要上BI?
  • P1331 海战