You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask API中MD5加密密码遇NoneType及Buffer API错误求助

解决Flask API中MD5加密的两个错误问题

嘿,我来帮你搞定这个问题!咱们先拆解一下你遇到的两个错误:

错误原因分析

  1. AttributeError: 'NoneType' object has no attribute 'encode'
    这个错误说明_userPassword的值是None——也就是reqparse没有成功解析到password参数。要么是前端请求时没传这个参数,要么是参数名拼写错了(比如写成pwd而不是password),导致args['password']返回了None,自然没法调用encode()方法。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:04:22