首页 > 解决方案 > 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, db, 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), nullable=False, server_default='')
    first_name = db.Column(db.String(100), nullable=False, server_default='')
    last_name = db.Column(db.String(100), nullable=False, server_default='')
    email_confirmed_at = db.Column(db.DateTime())
    active = db.Column('is_active', db.Boolean(), nullable=False, 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 中,但这会使

标签: pythonflaskblueprintflask-user

解决方案


推荐阅读