我正在使用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.
。
方法:
@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
}
}
答案 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
}