6

例如:

from flask import Flask
from flask.ext.admin import Admin, BaseView, expose

class MyView(BaseView):
    @expose('/')
    def index(self):
        return self.render('index.html')

app = Flask(__name__)

admin = Admin(app)
admin.add_view(MyView(name='Hello'))

app.run()

但是,如果我需要一个名为“views.py”的新文件,如何将视图添加views.py到管理员?我需要使用蓝图吗?

4

4 回答 4

8

对于我的项目,我实际上制作了一个支持烧瓶管理员的蓝图子类:

from flask import Blueprint
from flask_admin.contrib.sqla import ModelView
from flask_admin import Admin

class AdminBlueprint(Blueprint):
    views=None


    def __init__(self,*args, **kargs):
        self.views = []
        return super(AdminBlueprint, self).__init__('admin2', __name__,url_prefix='/admin2',static_folder='static', static_url_path='/static/admin')


    def add_view(self, view):
        self.views.append(view)

    def register(self,app, options, first_registration=False):
        admin = Admin(app, name='microblog', template_mode='adminlte')

        for v in self.views:
            admin.add_view(v)

        return super(AdminBlueprint, self).register(app, options, first_registration)

有关详细信息,您可以在这里阅读我的博客:http: //blog.sadafnoor.me/blog/how-to-add-flask-admin-to-a-blueprint/

于 2016-09-21T13:55:56.253 回答
7

这个问题我很晚了,但无论如何......我的猜测是你使用应用程序工厂模式并使用 Flask-Admin。关于潜在问题有一个很好的讨论。我使用了一个非常丑陋的解决方案,在init .py 文件中实例化 Flask-Admin:

from flask_admin.contrib.sqla import ModelView

class UserModelView(ModelView):

    create_modal = True
    edit_modal = True
    can_export = True

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    db.init_app(app)


    # import models here because otherwise it will throw errors    
    from models import User, Sector, Article

    admin.init_app(app)
    admin.add_view(UserModelView(User, db.session))      

    # attach blueprints
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    from .auth import auth as auth_blueprint
    app.register_blueprint(auth_blueprint, url_prefix='/auth')

    return app
于 2015-11-19T13:12:24.747 回答
5

您不需要为此制定蓝图。为您在主项目中定义的对象添加views.py导入:admin

from projectmodule import admin
from flask.ext.admin import BaseView, expose

class MyView(BaseView):
    @expose('/')
    def index(self):
        return self.render('index.html')

admin.add_view(MyView(name='Hello'))

并在您的主projectmodule文件中使用:

from flask import Flask
from flask.ext.admin import Admin


app = Flask(__name__)
admin = Admin(app)

# import the views
import views

app.run()

例如,您在设置的行import views 之后admin = Admin(app)添加。

于 2014-02-27T22:46:24.113 回答
3

我有一个带有一个蓝图的烧瓶应用程序(并登录/注销到管理员)。这是我发现使用一些自定义功能实现烧瓶管理的最佳解决方案。

我的结构如下:

my_app
  main
    __init__.py
    routes.py
  static
  templates
  __init__.py
  config.py
  models.py
  run.py

来自 models.py 的自定义管理索引视图

from flask_admin import AdminIndexView

class MyAdminIndexView(AdminIndexView):
    def is_accessible(self):
        return current_user.is_authenticated

    def inaccessible_callback(self, name, **kwargs):
        return redirect(url_for('main.home'))

主要初始化.py如下:


from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_admin import Admin
from flask_admin.menu import MenuLink
from my_app.config import Config

# create extensions
db = SQLAlchemy()
admin = Admin()

def create_app(config_class=Config): # default configutation

    app = Flask(__name__)
    app.config.from_object(Config)

    #initialize extensions
    db.init_app(app)
    ...

    # customized admin views
    from my_app.models import MyAdminIndexView
    admin.init_app(app,index_view=MyAdminIndexView())
    admin.add_link(MenuLink(name='Home', url='/'))
    admin.add_link(MenuLink(name='Logout', url='/logout'))

    #blueprint
    from my_app.main.routes import main
    app.register_blueprint(main)

    return app

我认为这是迄今为止我提出的最优雅的解决方案。

于 2020-03-31T00:02:11.833 回答