Flask-Admin:设置可从config.py配置的自定义视图

时间:2018-04-13 19:39:40

标签: python flask flask-admin

我正在使用Flask和Flask-Admin创建文档存储库。

问题:

如何在文档视图中动态设置base_path以使用配置文件中的变量?目前我正在使用current_app而我正在使用RuntimeError: Working outside of application context.

根据我是否使用我的测试,开发或prod配置,我想使用不同的路径,我希望在config.py中的相应类中进行理想配置。有没有办法在不从我的文档视图中推送应用程序上下文的情况下执行此操作?

这是我在admin.py中的课程:

class DocumentView(CustomView):
    # Override form field to use Flask-Admin FileUploadField
    form_overrides = {
        'path': form.FileUploadField
    }

    # Pass additional parameters to 'path' to FileUploadField constructor
    form_args = {
        'path': {
            'label': 'File',
            'base_path': current_app.config['DOCUMENT_REPO'],
            'allow_overwrite': True
        }
    }

和我在config.py中的课程:

class DevConfig(Config):
    SQLALCHEMY_DATABASE_URI = 'sqlite:///database.db'
    DEBUG = True
    DEBUG_TB_INTERCEPT_REDIRECTS = False
    CACHE_TYPE = 'simple'
    CACHE_NO_NULL_WARNING = True
    DOCUMENT_REPO = #path

更新

我尝试将form_args拉入方法并将其设置为before_first_request,这解决了我的应用程序上下文问题。但是,现在我在添加文件时收到ValueError: FileUploadField field requires base_path to be set.

create_app函数中的

方法:

@app.before_first_request
def add_context_to_admin():
    admin.add_link(MenuLink(name='Main', url=url_for('main.home')))
    admin.add_link(MenuLink(name='Logout', url=url_for('main.logout')))

    view = DocumentView(
        Document,
        db.session,
        name='Documents'
    )

    view.init_form_args(current_app)

    admin.add_view(
        view
    )

和admin.py中的重构类:

class DocumentView(CustomView):

    # Override form field to use Flask-Admin FileUploadField
    form_overrides = {
        'path': form.FileUploadField
    }

    # Pass additional parameters to 'path' to FileUploadField constructor
    def init_form_args(self, app):
        self.form_args = {
            'path': {
                'label': 'File',
                'base_path':  app.config['DOCUMENT_REPO'],
                'allow_overwrite': True
            }
        }

1 个答案:

答案 0 :(得分:1)

解决方案最终是覆盖DocumentView子类中的init并初始化它before_first_request

create_app中的方法:

@app.before_first_request
def add_context_to_admin():
    admin.add_link(MenuLink(name='Main', url=url_for('main.home')))
    admin.add_link(MenuLink(name='Logout', url=url_for('main.logout')))

    admin.add_view(
        DocumentView(
            current_app,
            Document,
            db.session,
            name='Documents'
        )
    )

admin.py中的类:

class DocumentView(CustomView):

    def __init__(self, app, model, session, name=None, category=None, endpoint=None, url=None, static_folder=None,
                 menu_class_name=None, menu_icon_type=None, menu_icon_value=None):

        # Override form field to use Flask-Admin FileUploadField
        self.form_args = {
            'path': {
                'label': 'File',
                'base_path':  app.config['DOCUMENT_REPO'],
                'allow_overwrite': True
            }
        }

        super().__init__(model, session, name, category, endpoint, url, static_folder, menu_class_name,
                         menu_icon_type, menu_icon_value)

    form_overrides = {
        'path': form.FileUploadField
    }