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

Flask实现密码更新功能报AttributeError: 'NoneType'无encode属性如何解决

问题原因
  • 核心错误为表单字段名与后端取值的字段名不匹配:你HTML中新密码输入框的name属性是updated_password(下划线分隔),但后端Flask代码里用request.form.get('updated-password')(横杠分隔)取值,导致取不到对应值,返回None。
  • generate_password_hash方法需要传入字符串参数,内部会自动调用字符串的encode方法做哈希运算,传入None就会触发'NoneType' object has no attribute 'encode'报错。
解决方案
  1. 首先修正后端取值的字段名,和HTML配置保持一致即可解决当前报错:
    把报错行修改为:
updated_password = generate_password_hash(request.form.get('updated_password'))
  1. 额外代码逻辑优化建议:
    你当前代码的缩进存在逻辑错误,现在的else分支是和if request.method == 'POST'对齐的,只有请求不是POST的时候才会触发"Passwords Do Not Match"提示,完全不符合业务逻辑,需要调整缩进,把else放在if check_password_hash的下方,同时修正跳转时的用户名字段取值,修正后的完整POST请求逻辑参考:
if request.method == 'POST':
    # 先校验旧密码是否正确
    if check_password_hash(user['password'], request.form.get('existing-password')):
        # 旧密码校验通过才生成新密码哈希
        updated_password = generate_password_hash(request.form.get('updated_password'))
        mongo.db.users.update_one(
            {'username': username},
            {'$set': {'password': updated_password}}
        )
        flash("Password Updated Successfully")
        return redirect(url_for("user.profile", username=username))
    else:
        # 旧密码校验不匹配走这个分支
        flash("Passwords Do Not Match")
        return redirect(url_for("user.update_password", username=username))

内容的提问来源于stack exchange,提问作者Callan Maguire

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:39:03