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

Flask登录表单配置报错:无法从flask_security导入hash_password

Flask-Security-Too ImportError: cannot import name 'hash_password'

问题梳理

  • 基于YouTube视频+Flask-Security-Too官方文档「Basic SQLAlchemy Application with session」搭建带数据库交互的Flask登录表单
  • Windows系统下,使用Linux/macOS风格的虚拟环境命令报错:python3 -m venv pymyenv、. pymyenv/bin/activate
  • 已成功安装依赖:pip install flask-security-too[common] sqlalchemy
  • 代码拆分至app.py、database.py、models.py后运行,触发错误:ImportError: cannot import name 'hash_password' from 'flask_security'

解决方案

1. 修正Windows虚拟环境命令

Windows系统下创建和激活虚拟环境的正确命令:

  • 创建虚拟环境:python -m venv pymyenv(Windows默认用python而非python3,若已配置环境变量可例外)
  • 激活虚拟环境:
    • CMD终端:pymyenv\Scripts\activate
    • PowerShell终端:先执行Set-ExecutionPolicy RemoteSigned(允许运行脚本),再执行.\pymyenv\Scripts\Activate.ps1

2. 修复hash_password导入路径

Flask-Security-Too中hash_password不属于顶层flask_security模块,需从工具子模块导入,修改代码中的导入语句:

# 替换错误导入
from flask_security.utils import hash_password

3. 验证标准代码拆分结构

确保文件拆分逻辑符合官方示例规范:

database.py

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

models.py

from database import db
from flask_security import UserMixin, RoleMixin

# 关联表
roles_users = db.Table(
    'roles_users',
    db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
    db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
)

class Role(db.Model, RoleMixin):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)
    description = db.Column(db.String(255))

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), unique=True)
    password = db.Column(db.String(255))
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())
    roles = db.relationship('Role', secondary=roles_users, backref=db.backref('users', lazy='dynamic'))

app.py

from flask import Flask
from database import db
from models import User, Role
from flask_security import Security, SQLAlchemyUserDatastore, utils

app = Flask(__name__)
# 配置项请根据实际情况修改
app.config['SECRET_KEY'] = 'your-secret-key-here'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 初始化数据库
db.init_app(app)

# 初始化Flask-Security
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)

# 首次运行创建数据库和测试用户
@app.before_first_request
def create_initial_data():
    db.create_all()
    if not user_datastore.find_user(email="test@example.com"):
        user_datastore.create_user(email="test@example.com", password=utils.hash_password("password123"))
    db.session.commit()

if __name__ == '__main__':
    app.run(debug=True)

4. 本地验证步骤

  1. 用正确命令激活虚拟环境
  2. 执行pip freeze确认Flask-Security-Too版本兼容(最新稳定版均支持上述导入方式)
  3. 运行python app.py,检查是否仍有导入错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:35:12