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
- CMD终端:
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. 本地验证步骤
- 用正确命令激活虚拟环境
- 执行
pip freeze确认Flask-Security-Too版本兼容(最新稳定版均支持上述导入方式) - 运行
python app.py,检查是否仍有导入错误
内容的提问来源于stack exchange,提问作者JPlayAAA1
相关产品推荐
相关产品推荐

