python - 带有应用程序工厂方法的 Flask-Security RecursionError
问题描述
我是使用蓝图和应用程序工厂的新手。我在尝试使 Flask-Security 与应用程序工厂方法一起工作时遇到问题。我浏览了几篇帖子,但找不到有效的解决方案。使用我当前的设置,我收到此错误:RecursionError: maximum recursion depth exceeded while calling a Python object,我相信设置 @security.context_processor 会导致此错误。我想知道我的结构方式是否有意义,以及如何将 Flask-Security 集成到应用程序工厂中。应用程序的结构如下(我在这里有一些芹菜任务,但为了简单起见暂时将其删除):
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)
提前感谢您对此进行调查!
解决方案
看起来你一直在尝试一些事情。
首先 - 初始化 security.init_app(app, user_datastore) - 不要分配给 _state。这是一个内部使用的变量。如果你想在你的应用程序中跟踪它 - 将它分配给 app.security 或 app.mysecurity 之类的东西。请注意,它始终作为 app.extensions["security"] 可用,就像任何其他 Flask 扩展一样。
其次 - 不确定你想用 securitybp 完成什么 - Flask-Security 已经有它自己的 BP - 你可以在初始化过程中更改名称。
最后 - 我认为真正的问题是你的 context_processor 是一个全局的 - 最简单和最好的放置它的地方是你的 create_app() 方法(并使用装饰器)。
推荐阅读
- tensorflow - 运行 Horovod 训练作业,遇到这个错误:只有秩的子集在提交张量,这会导致死锁
- selenium - Selenium 尝试弹出功能失败
- python - 从子类获取父类中的特定属性,而不将父类的属性传递给子类
- angular - y 所需的入口点 x 不存在
- flutter - 我更改了版本gradle并出现了这个问题
- sql - 在值和数量方面在 2 个表中找到完全相同的行
- vb.net - 面板控件卡在 visible=false
- html - 用css使按钮变圆
- xml - 如何在flutter的launch_background.xml中添加背景gif图像作为启动画面
- android-studio - Kotlin 类中的构造函数参数和成员变量有什么区别?