Flask_User 和 Blueprint - 如何构建应用程序?

问题描述

我正在创建我的第一个更大的 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 (将#修改为@)