如何在Peewee中创建创建时自动转为MD5值的字段
两种实现方式:MySQL内置MD5或Peewee钩子处理
好问题!针对你想让User模型的password字段自动哈希为MD5值的需求,有两种非常实用的实现方式,我给你详细说说:
一、直接用MySQL内置的MD5()函数
既然你的数据库是自带MD5函数的MySQL,咱们可以直接通过Peewee的fn模块调用数据库的MD5函数来处理密码,这样哈希操作就在数据库端完成。
创建用户时的写法
导入Peewee的fn工具,然后在创建User时把明文密码传给fn.MD5():
from peewee import fn # 创建用户时自动用MySQL的MD5哈希密码 user = User.create(username="whatever", password=fn.MD5("whatever")) # 此时user.password就是数据库返回的MD5哈希值 print(user.password) # 输出 008c5926ca861023c1d2a36653fd88e2
登录验证的写法
验证用户密码时,同样需要把用户输入的明文密码用MD5哈希后和数据库中的值比对:
def check_login(username, input_password): # 用MD5哈希输入密码,再匹配数据库记录 user = User.get_or_none( User.username == username, User.password == fn.MD5(input_password) ) return user is not None # 存在则验证通过
这种方式的好处是不用在应用层写哈希逻辑,但要注意:如果你的应用和数据库之间的传输没有加密(比如没开HTTPS),明文密码在传输过程中有泄露风险,这点要留意。
二、用Peewee的模型钩子自动处理
如果希望哈希逻辑在应用层控制(比如以后换数据库也不受影响),可以用Peewee提供的模型生命周期钩子,在保存数据前自动哈希密码。
修改User模型
给User模型添加_pre_save钩子方法,在插入或更新密码时自动进行MD5哈希:
import hashlib from peewee import Model, CharField, FixedCharField class User(Model): username = CharField(null=False) password = FixedCharField(null=False, max_length=32) # MD5哈希值是32位字符串 def _pre_save(self, insert): # 只有插入新用户,或者密码字段被修改时,才重新哈希 if insert or self.password != self._original.get('password'): # 对明文密码进行MD5哈希 md5_obj = hashlib.md5(self.password.encode('utf-8')) self.password = md5_obj.hexdigest() # 别忘了调用父类的钩子方法 super()._pre_save(insert)
使用方式
现在创建用户时直接传明文密码就好,钩子会自动帮你哈希:
user = User.create(username="whatever", password="whatever") print(user.password) # 输出 008c5926ca861023c1d2a36653fd88e2
这种方式的优势是逻辑完全在应用层,跨数据库兼容,而且你还可以扩展逻辑(比如给密码加盐,不过MD5本身安全性不高,这里按你的需求来)。
小提醒
虽然你指定用MD5,但还是要提一句:MD5已经被证明存在安全漏洞,不适合用于生产环境的密码存储。如果是正式项目,建议使用bcrypt、Argon2这类更安全的哈希算法,Peewee也有对应的第三方扩展支持哦。
内容的提问来源于stack exchange,提问作者Eray Erdin
相关产品推荐
相关产品推荐

