使用 flask-admin 和 flask 蓝图
Using flask-admin with flask blueprints
我想使用 flask-admin 设置一个基本的管理界面,我希望所有这些都放在一个蓝图中。这是我的代码的最小版本:
#app.py
from flask import Flask
from bp import bp
app = Flask(__name__)
app.register_blueprint(bp)
if __name__ == "__main__":
app.run(debug=True)
#bp.py
from flask import Blueprint, current_app
from flask_admin import Admin
from flask_admin.contrib.pymongo import ModelView
import pymongo
conn = pymongo.MongoClient()
bp = Blueprint('bp', __name__,
template_folder='templates')
admin = Admin(current_app)
admin.add_view(ModelView(conn.my_db.my_collection))
当 运行 python app.py
时,它会因 RuntimeError: working outside of application context
而崩溃,因为 admin
与 bp
。
通常,一个人会写
@bp.route('/<page>')
def show(page):
pass
但是我在创建 Admin
对象的上下文中找不到合适的装饰器。我尝试的一件事是在 bp.py
中执行 admin = Admin()
,在 app.py
中导入 admin
,然后在 app.py
中导入 admin.app = app
。这行得通,但感觉就像我在几个文件中拆分逻辑一样,所以我对此不太满意。处理这种情况的 pythonic 方法是什么?
您需要实际的应用程序对象来初始化 Flask 管理 Class。 Current_app 行不通。此呼叫应置于 app.py。然后在蓝图上你可以使用
from app import admin
是这样算的。仅供参考。
#YourApp/init.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_admin import Admin
db = SQLAlchemy()
admin = Admin(name='TuozhanOA', template_mode='bootstrap3')
def create_app(config_class=Config):
app = Flask(name)
app.config.from_object(Config)
db.init_app(app)
admin.init_app(app)
from YourApp.main.routes import main
app.register_blueprint(main)
from YourApp.adminbp.routes import adminbp, user_datastore
app.register_blueprint(adminbp)
security = Security(app, user_datastore)
return app
#YourApp/adminbp/routes.py
from flask import render_template, Blueprint
from YourApp.models import User, Role
from YourApp import db, admin
from flask_admin.contrib.sqla import ModelView
from wtforms.fields import PasswordField
from flask_admin.contrib.fileadmin import FileAdmin
import os.path as op
from flask_security import current_user, login_required, RoleMixin, Security,
SQLAlchemyUserDatastore, UserMixin, utils
adminbp = Blueprint('adminbp', name)
admin.add_view(ModelView(User, db.session, category="Team"))
admin.add_view(ModelView(Role, db.session, category="Team"))
path = op.join(op.dirname(file), 'tuozhan')
admin.add_view(FileAdmin(path, '/static/tuozhan/', name='File Explore'))
我想使用 flask-admin 设置一个基本的管理界面,我希望所有这些都放在一个蓝图中。这是我的代码的最小版本:
#app.py
from flask import Flask
from bp import bp
app = Flask(__name__)
app.register_blueprint(bp)
if __name__ == "__main__":
app.run(debug=True)
#bp.py
from flask import Blueprint, current_app
from flask_admin import Admin
from flask_admin.contrib.pymongo import ModelView
import pymongo
conn = pymongo.MongoClient()
bp = Blueprint('bp', __name__,
template_folder='templates')
admin = Admin(current_app)
admin.add_view(ModelView(conn.my_db.my_collection))
当 运行 python app.py
时,它会因 RuntimeError: working outside of application context
而崩溃,因为 admin
与 bp
。
通常,一个人会写
@bp.route('/<page>')
def show(page):
pass
但是我在创建 Admin
对象的上下文中找不到合适的装饰器。我尝试的一件事是在 bp.py
中执行 admin = Admin()
,在 app.py
中导入 admin
,然后在 app.py
中导入 admin.app = app
。这行得通,但感觉就像我在几个文件中拆分逻辑一样,所以我对此不太满意。处理这种情况的 pythonic 方法是什么?
您需要实际的应用程序对象来初始化 Flask 管理 Class。 Current_app 行不通。此呼叫应置于 app.py。然后在蓝图上你可以使用
from app import admin
是这样算的。仅供参考。
#YourApp/init.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_admin import Admin
db = SQLAlchemy()
admin = Admin(name='TuozhanOA', template_mode='bootstrap3')
def create_app(config_class=Config):
app = Flask(name)
app.config.from_object(Config)
db.init_app(app)
admin.init_app(app)
from YourApp.main.routes import main
app.register_blueprint(main)
from YourApp.adminbp.routes import adminbp, user_datastore
app.register_blueprint(adminbp)
security = Security(app, user_datastore)
return app
#YourApp/adminbp/routes.py
from flask import render_template, Blueprint
from YourApp.models import User, Role
from YourApp import db, admin
from flask_admin.contrib.sqla import ModelView
from wtforms.fields import PasswordField
from flask_admin.contrib.fileadmin import FileAdmin
import os.path as op
from flask_security import current_user, login_required, RoleMixin, Security,
SQLAlchemyUserDatastore, UserMixin, utils
adminbp = Blueprint('adminbp', name)
admin.add_view(ModelView(User, db.session, category="Team"))
admin.add_view(ModelView(Role, db.session, category="Team"))
path = op.join(op.dirname(file), 'tuozhan')
admin.add_view(FileAdmin(path, '/static/tuozhan/', name='File Explore'))