python中snip怎么使用_python中描述符descriptor在实际案例使用

做过网站开发的朋友应该知道,在保存客户信息的时候,是不能明文保存用户密码等重要信息的,都是通过加密后再保存到数据库的。笔者在用flask框架写一个注册页面时,当然也意识到这个问题了。这里关于flask环境搭建就不细说了,直接码关键的部分代码了

当用户传进来的数据到相应的api时,我们通过框架获取到用户传过来明文用户名等数据:

@api.route('/users', methods=["POST"])

def register():

"""注册"""

# 获取参数 手机号、短信验证码、密码、确认密码 请求体(json格式)

req_dict = request.get_json()

mobile = req_dict.get("mobile")

password = req_dict.get("password")

password2 = req_dict.get("password2")

# 校验参数完整性

if not all([mobile, sms_code, password, password2]):

return jsonify(errcode=RET.PARAMERR, errmsg="参数不完整")

# 验证手机号格式

if not re.match(r"1[3456789]\d{9}", mobile):

# 表示格式错误

return jsonify(errcode=RET.PARAMERR, errmsg="手机号格式错误")

# 判断密码一致

if password != password2:

return jsonify(errcode=RET.PARAMERR, errmsg="两次密码不一致")

# 将用户数据保存到数据库中

在保存前,要将密码先处理一下,这里用到了Flask框架自带的模块

from werkzeug.security import generate_password_hash

password_hash = generate_password_hash(password)

user = User(

name=mobile,

password_hash=password_hash,

mobile=mobile

)

这里看起来是不是也很正常,但是笔者希望是用user.password = password来设置属性

所以这里用将类先做些修改

class User(db.Model):

"""用户"""

__tablename__ = "ih_user_profile"

id = db.Column(db.Integer, primary_key=True) # 用户编号

name = db.Column(db.String(32), unique=True, nullable=False) # 用户暱称

password_hash = db.Column(db.String(128), nullable=False) # 加密的密码

mobile = db.Column(db.String(11), unique=True, nullable=False) # 手机号

real_name = db.Column(db.String(32)) # 真实姓名

avatar_url = db.Column(db.String(128)) # 用户头像路径

def check_password(self, origin_password):

"""检验用户的密码是否正确,是框架自身提供的方法

: param origin_password: 用户登录时输入的原始密码

"""

return security.check_password_hash(self.password_hash, origin_password)

# property装饰器将方法变成属性password

@property

def password(self):

"""

对应额外添加的属性password的读取行为

:return:

"""

# 在我们这个应用场景中,读取密码没有实际意义

# 所以对于password属性的读取行为的函数不再实现

# 通常以抛出AttributeError的方式来作为函数代码

raise AttributeError("不支持读取操作")

@password.setter

def password(self, origin_password):

"""

对应额外添加的属性password的设置行为

: params origin_password: 在进行属性设置的时候,要设置的值 # user.password = origin_password

:return:

"""

self.password_hash = security.generate_password_hash(origin_password)

通过property装饰后,再次定义类属性时,就可以直接来写:

user = User(

name=mobile,

password_hash="",

mobile=mobile

)

user.password = password

看到这里,应该有了一个认识,当修改类属性时,需要对传入的数据进行处理,而不是直接赋值时,就可以使用描述符!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值