Python Flask安全递归错误与应用程序工厂方法

Python Flask安全递归错误与应用程序工厂方法,python,flask,flask-sqlalchemy,flask-admin,flask-security,Python,Flask,Flask Sqlalchemy,Flask Admin,Flask Security,我不熟悉使用蓝图和应用程序工厂。我在尝试使用应用程序工厂方法使Flask安全工作时遇到问题。我已经浏览了好几篇文章,没有找到一个有效的解决方案。 使用当前设置,我遇到以下错误: RecursionError:调用Python对象时超出了最大递归深度,我认为是设置@security.context\u处理器造成的。 我想知道我构建这个的方式是否有意义,以及我如何在应用程序工厂中集成Flask安全性。 应用程序的结构如下所示(我这里有一些芹菜任务,但为了简单起见,暂时将其删除): 提前感谢您的关注

我不熟悉使用蓝图和应用程序工厂。我在尝试使用应用程序工厂方法使Flask安全工作时遇到问题。我已经浏览了好几篇文章,没有找到一个有效的解决方案。 使用当前设置,我遇到以下错误: RecursionError:调用Python对象时超出了最大递归深度,我认为是设置@security.context\u处理器造成的。 我想知道我构建这个的方式是否有意义,以及我如何在应用程序工厂中集成Flask安全性。 应用程序的结构如下所示(我这里有一些芹菜任务,但为了简单起见,暂时将其删除):


提前感谢您的关注

看起来你一直在尝试一些事情

首先-初始化安全性。初始化应用程序(应用程序,用户数据存储)-不分配给_状态。这是一个内部使用的变量。如果你想在你的应用程序中跟踪它-将它分配给app.security或app.mysecurity之类的东西。注意,它总是作为app.extensions[“security”]提供,就像任何其他Flask扩展一样

第二,不确定您试图用securitybp实现什么—Flask Security已经有了自己的BP—您可以在初始化过程中更改名称


最后-我认为真正的问题是,您的上下文处理器是全局的-最简单和最好的放置位置是在您的create\u app()方法中(并使用decorator)。

感谢您的回复,我不完全确定如何应用您建议的修复,您能给出一个代码示例吗?我已更新到
security.init_应用程序(应用程序,用户数据存储)
我将在哪里使用此应用程序。扩展[“security”]?关于第二部分securitybp,我刚刚测试了一下如何使flask安全工作,我同意,我已经在context_处理器上删除了blueprint。我不知道如何使用create_app()方法中的decorator基本上-只需使用您的context处理器代码(使用@security.context_处理器)并将其放在您的create_app方法中。这应该可以解决您的无限循环。当我尝试将其放入create_app()中时,我得到递归错误:``security.init_app(app,user_datastore)@security.context_processor def security_context_processor():return dict(admin\u base\u template=admin.base\u template,admin\u view=admin.index\u view,h=admin\u helpers,get\u url=url\u for)```但是当我把这个放在securitybp>routes.py中时,我得到了这个错误:self.db.session.commit()AttributeError:'SQLAlchemy'对象没有属性'commit',我显然没有下载并处理您的代码:-)-不太清楚发生了什么-代码中有很多全局变量,因此很难遵循精确的init顺序。您的新错误听起来像是user_数据存储未初始化,但您没有说明何时何地出现错误。如果你有调试器的访问权限-我会开始设置一些断点并查看安全内容。。。
app_factory
- app/
  - __init__.py
  - factory.py
  - models.py
  - tasks.py
  - views.py
  - adminbp/
  - securitybp/
  - templates/
    - admin/
    - index.html
  - statics
- config.py
- run.py
app_factory > run.py

from app import factory
import app

if __name__ == "__main__":
    app = factory.create_app()
    app.run()
app_factory > __init_.py
from celery import Celery

def make_celery(app_name=__name__):
    celery_broker_url = ''
    celery_backend_url = ''
    return Celery(app_name, backend=celery_backend_url, broker=celery_broker_url)
celery = make_celery()
app_factory > app > factory.py

import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_admin import Admin
from flask_security import Security

db = SQLAlchemy()
admin = Admin()
security = Security()

PKG_NAME = os.path.dirname(os.path.realpath(__file__)).split("\\")[1]
def create_app(app_name=PKG_NAME, **kwargs):
    app = Flask(app_name)
    app.config.from_pyfile('config.py')
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+mysqlconnector: ...'
    db.init_app(app)
    admin.init_app(app)

    from app.views import bp
    app.register_blueprint(bp)

    from app.adminbp.routes import adminbp, user_datastore
    app.register_blueprint(adminbp)

    from app.securitybp.routes import securitybp
    app.register_blueprint(securitybp)
    security._state = security.init_app(app, user_datastore)
    # security = Security(app, user_datastore)

    return app
app_factory > app > views.py

import os
import flask_admin
from flask import Blueprint, render_template, current_app
from .factory import db
from .tasks import make_file
from .models import Role, User, MyBaseView


bp = Blueprint("views", __name__, template_folder='templates')

class CustomView(MyBaseView):
    @expose('/')
    def index(self):
        return self.render('admin/custom_index.html')

@bp.route("/")
def index():
    results = "Testing"
    return render_template ('index.html',results=results)
app_factory > app > adminbp > routes.py

from flask import render_template, Blueprint
from ..models import User, Role, MyModelView, UserView, MyBaseView, Role, User
from ..factory import db, admin, security
from flask_admin.contrib.sqla import ModelView

from flask_security import current_user, login_required, RoleMixin, Security, \
SQLAlchemySessionUserDatastore, UserMixin, utils

adminbp = Blueprint('adminbp', __name__,template_folder='templates/admin')

user_datastore = SQLAlchemySessionUserDatastore(db, User, Role)

admin.add_view(MyModelView(Role, db.session, menu_icon_type='fa', menu_icon_value='fa-server', name="Roles"))
admin.add_view(UserView(User, db.session, menu_icon_type='fa', menu_icon_value='fa-users', name="Users"))
app_factory > app > securitybp > routes.py

from flask import render_template, Blueprint
from ..factory import security

securitybp = Blueprint('securitybp', __name__)

# @security.context_processor
def security_context_processor():
    return dict(
        admin_base_template=admin.base_template,
        admin_view=admin.index_view,
        h=admin_helpers,
        get_url=url_for
    )
security.context_processor(security_context_processor)