问题描述
我正在创建我的第一个更大的 Python Flask 应用程序,我将使用的模块之一是 Flask_User。为了让一切更易于管理,我想发布一个蓝图和工厂应用程序。
结构简单:
app.py
config.py
auth/
__init__.py
models.py
所以目标是在 auth 部分包含所有身份验证内容。但是,归结为在哪里初始化 UserManager 不会有错误,循环引用等。
user_manager = UserManager(app,db,User)
代码的样子 - app.py
from flask import Flask
# Configuration
from config import Config,HomeDevelopmentConfig
# Extensions
from flask_sqlalchemy import sqlAlchemy
from flask_migrate import Migrate
# INITIATE DB
db = sqlAlchemy()
migrate = Migrate() # this will run sqlAlchemy as well
from flask_user import UserManager
from auth.models import User
user_manager = UserManager()
# APPLICATION FACTORY
def create_app(config_class=Config):
# Create app object
app = Flask(__name__)
# Load configuration
app.config.from_object(config_class)
# Register extensions
db.init_app(app)
migrate.init_app(app,db)
user_manager = UserManager(app,User) # !!! this will not work - circular reference to User as User needs db
# Close session with DB at the app shut down
@app.teardown_request
def shutdown_session(exception=None):
db.session.remove()
with app.app_context():
# Register blueprints
# Main flask app
from main import bp_main
app.register_blueprint(bp_main)
# Authentication (flask-user)
from auth import bp_auth
app.register_blueprint(bp_auth)
return app
# RUN APPLICATION
if __name__ == '__main__':
app = create_app(HomeDevelopmentConfig)
app.run()
models.py(应包含用于身份验证的数据结构)
from app import db
from flask_user import UserMixin #,UserManager
class User(db.Model,UserMixin):
__tablename__ = 'users'
id = db.Column(db.Integer,primary_key=True)
email = db.Column(db.String(100),nullable=False,unique=True)
password = db.Column(db.String(255),server_default='')
first_name = db.Column(db.String(100),server_default='')
last_name = db.Column(db.String(100),server_default='')
email_confirmed_at = db.Column(db.DateTime())
active = db.Column('is_active',db.Boolean(),server_default='0')
# Define the relationship to Role via UserRoles
roles = db.relationship('Role',secondary='user_roles')
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer(),primary_key=True)
name = db.Column(db.String(50),unique=True)
class UserRoles(db.Model,UserMixin):
__tablename__ = 'user_roles'
id = db.Column(db.Integer(),primary_key=True)
user_id = db.Column(db.Integer(),db.ForeignKey('users.id',ondelete='CASCADE'))
role_id = db.Column(db.Integer(),db.ForeignKey('roles.id',ondelete='CASCADE'))
最后 init.py 用于身份验证:
from flask import blueprints
bp_auth = blueprints.Blueprint('auth',__name__)
from auth import models
看起来像是不可能完成的任务,但也许您有一些很好的提示。有效的是将所有代码放入 app.py 中,但这样做
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)