跨Flask应用程序重复使用样板代码

3

我有一些针对Flask应用的错误处理调用。例如,我的404响应使用@app.errorhandler装饰器来定义:

@app.errorhandler(404)
def page_not_found(e):
    return jsonify({'status': 'error',
                    'reason': '''There's no API call for %s''' % request.base_url,
                    'code': 404}), 404

由于我有大量的样板代码,我希望将其放在一个公共文件中,并从单个位置继承或导入我的flask应用程序。

是否可能从不同的模块继承或导入flask样板代码?


也许你可以编写一个样板 Flask 扩展?http://flask.pocoo.org/docs/extensiondev/ - msvalkon
使用 Blueprint.app_errorhandler:https://dev59.com/jWcs5IYBdhLWcg3wiEiK - Jinsong Li
1个回答

7
当然可以,但是您需要对注册进行参数化。
不要使用装饰器,而是将注册移动到一个函数中:
def page_not_found(e):
    return jsonify({'status': 'error',
                    'reason': '''There's no API call for %s''' % request.base_url,
                    'code': 404}), 404


def register_all(app):
    app.register_error_handler(404, page_not_found)

然后导入register_all并将其与您的Flask()对象一起调用。
这使用Flask.register_error_handler()函数而不是装饰器。
为了支持蓝图,您需要等待Flask的下一个版本(其中包括此提交),或直接使用装饰器函数:
app_or_blueprint.errorhandler(404)(page_not_found)

对于很多这样的任务,您也可以使用蓝图(Blueprint)来完成,只要使用Blueprint.app_errorhandler()

common_errors = Blueprint('common_errors')


@common_errors.errorhandler(404)    
def page_not_found(e):
    return jsonify({'status': 'error',
                    'reason': '''There's no API call for %s''' % request.base_url,
                    'code': 404}), 404

并不是所有的功能都可以使用蓝图来处理,但是如果你要注册的只是错误处理程序,那么使用蓝图是一个很好的方法。

像往常一样导入蓝图并将其注册到您的应用程序中:

from yourmodule import common_errors
app.register_blueprint(common_errors)

谢谢!很高兴再次见到你。如果我理解正确,这个解决方案仅适用于错误处理,而不适用于其他实用函数(例如您之前的答案中提到的那个)。蓝图是否是解决方案? - Adam Matan
@AdamMatan:那个答案中的装饰器可以在任何地方重复使用。它们已经是可重用的了。 - Martijn Pieters
我可以把它们放在一个蓝图中,然后在应用程序的其他位置进行注册吗? - Adam Matan
@AdamMatan:Blueprints 可以用于添加模板过滤器、模板全局变量、模板测试、请求钩子、上下文处理器、URL 默认值等等。 - Martijn Pieters
1
@AdamMatan:你通常在应用程序上注册的几乎所有内容也可以在蓝图上注册,以便仅适用于蓝图上的路由或适用于所有路由(名称中带有“app_” 的任何内容都适用于所有路由)。 - Martijn Pieters
谢谢。这似乎是一个非常有用的工具 - 我已经开始阅读文档了。 - Adam Matan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接