Flask API中MD5加密密码遇NoneType及Buffer API错误求助
解决Flask API中MD5加密的两个错误问题
嘿,我来帮你搞定这个问题!咱们先拆解一下你遇到的两个错误:
错误原因分析
AttributeError: 'NoneType' object has no attribute 'encode'
这个错误说明_userPassword的值是None——也就是reqparse没有成功解析到password参数。要么是前端请求时没传这个参数,要么是参数名拼写错了(比如写成pwd而不是password),导致args['password']返回了None,自然没法调用encode()方法。TypeError: object supporting the buffer API required
Python3里hashlib.md5()必须接收字节类型的输入,你直接传字符串(或者None)肯定会报错,所以encode()是必须的,但前提是你的_userPassword得是有效的字符串,不能是None。
完整解决方案
咱们从三个方面修正代码:
- 强制要求
password参数必须传入,避免None的情况 - 正确生成MD5的十六进制字符串(数据库里存的应该是这个,而不是哈希对象)
- 修正SQL语句的逻辑运算符(MySQL标准用
AND而非&&)
修正后的代码如下:
import hashlib from flask_restful import Resource, reqparse import mysql.connector # 假设你用的是mysql-connector-python class UserLogin(Resource): def post(self): # Parse the arguments,添加required=True确保参数必传 parser = reqparse.RequestParser() parser.add_argument('username', required=True, help='Username is required') parser.add_argument('password', required=True, help='Password is required') args = parser.parse_args() _user = args['username'] _userPassword = args['password'] # 生成MD5十六进制哈希字符串:先转字节,再取十六进制结果 _hashed_pwd = hashlib.md5(_userPassword.encode('utf-8')).hexdigest() conn = mysql.connect() cursor = conn.cursor() # 把SQL里的&&改成AND,符合MySQL标准语法 cursor.execute('''select * from user where username = %s AND password = %s''', (_user, _hashed_pwd)) data = cursor.fetchall() # 别忘了关闭游标和连接,避免资源泄漏 cursor.close() conn.close() return jsonify(data)
额外注意事项
- 你之前直接把
hashlib.md5()返回的哈希对象传给SQL语句,这是不对的——数据库里存的应该是MD5的十六进制字符串,所以必须调用hexdigest()方法。 - 给
add_argument加上required=True后,如果前端没传对应参数,reqparse会自动返回带有错误提示的响应,不用你自己处理None的情况。 - 生产环境里其实不推荐用MD5存储密码,安全性太低了,建议用
bcrypt或者passlib这类专门的密码哈希库,它们支持加盐和更安全的哈希算法。
内容的提问来源于stack exchange,提问作者itTech
相关产品推荐
相关产品推荐

