码迷,mamicode.com
首页 > 其他好文 > 详细

用flask-failsafe实现出现语法错误时flask仍然自带重启

时间:2017-10-07 17:28:46      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:hellip   route   功能   一个   python3   filename   deb   *args   main   

1问题描述:

flask自带的reload只能在语法没毛病的情况下auto_relaod,但是如果有语法错误,进程就会报错退出。

这时修改完语法错误,还得在控制台按“↑”和“enter”重新执行一次python3 app.py 重新启动flask。

希望省掉手动重启flask的过程

 

2解决方案

用flask-failsafe插件。

这样语法错误也会reload,语法错误修正,系统继续运行。这样手和光标不用频繁切到控制台,也省了“↑”和“enter”的按键。懒人专用。

这个插件使用很简单:

技术分享

myapp模拟flask应用。main.py作为启动脚本。核心就是装饰器,监控各种文件改动。然后reraise。

 

3原理

(好奇心不强的可以不看)

虽然flask_failsafe是代码只有80行的一个单独py文件,但是还不是太能看懂啊啊……把我理解的作为注释加进去了:

import functools
import
sys import traceback import flask PY2 = sys.version_info[0] == 2 def failsafe(func): """ Wraps an app factory to provide a fallback in case of import errors. Takes a factory function to generate a Flask app. If there is an error creating the app, it will return a dummy app that just returns the Flask error page for the exception. This works with the Flask code reloader so that if the app fails during initialization it will still monitor those files for changes and reload the app. """ @functools.wraps(func) def wrapper(*args, **kwargs): extra_files = [] try:
    #如果create_app运行不报错。就直接在开头退出。
return func(*args, **kwargs) except:
#捕获异常,并打印 exc_type, exc_val, exc_tb
= sys.exc_info() traceback.print_exc()
#添加异常中依赖的文件,和“SyntaxError”爆出来的文件。 tb
= exc_tb while tb: filename = tb.tb_frame.f_code.co_filename extra_files.append(filename) tb = tb.tb_next if isinstance(exc_val, SyntaxError): extra_files.append(exc_val.filename) #启动dummy app,专门用来显示错误的文件 app = _FailSafeFlask(extra_files) app.debug = True @app.route(/) @app.route(/<path:path>) def index(path=/): reraise(exc_type, exc_val, exc_tb) return app return wrapper if PY2: exec(def reraise(tp, value, tb=None):\n raise tp, value, tb) else: def reraise(tp, value, tb=None): if value.__traceback__ is not tb: raise value.with_traceback(tb) raise value class _FailSafeFlask(flask.Flask): """ Binds the extra_args parameter of run() to include the extra files we want to monitor for changes. """ def __init__(self, extra_files): flask.Flask.__init__(self, __name__) self.extra_files = extra_files def run(self, *args, **kwargs): extra_files = self.extra_files if extra_files in kwargs: extra_files = extra_files + kwargs[extra_files] kwargs[extra_files] = extra_files flask.Flask.run(self, *args, **kwargs)

关键好像是最后2行 flask自己会跟踪‘extra_files‘文件的改动。又百度了一下flask的auto_reloader机制,准确地说是werkzeug用子进程实现的这个功能。也很巧妙,不是太容易理解。

 以我的水平,理解到这样就基本满意啦。

用flask-failsafe实现出现语法错误时flask仍然自带重启

标签:hellip   route   功能   一个   python3   filename   deb   *args   main   

原文地址:http://www.cnblogs.com/xuanmanstein/p/7635007.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!