我正在开发一个Python应用程序,我希望在其上看到实时统计信息。我想使用Flask
以便于使用和理解。
问题是我的Flask服务器应该从我的Python应用程序的最开始开始,并在最后停止。它应该是这样的:
def main():
""" My main application """
from watcher.flask import app
# watcher.flask define an app as in the Quickstart flask documentation.
# See: http://flask.pocoo.org/docs/0.10/quickstart/#quickstart
app.run() # Starting the flask application
do_my_stuff()
app.stop() # Undefined, for the idea
因为我需要我的应用程序上下文(用于统计),所以我不能使用multiprocessing.Process
。然后我试图使用threading.Thread
,但看起来Werkzeug不喜欢它:
* Running on http://0.0.0.0:10079/
Exception in thread Flask Server:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File ".../develop-eggs/watcher.flask/src/watcher/flask/__init__.py", line 14, in _run
app.run(host=HOSTNAME, port=PORT, debug=DEBUG)
File ".../eggs/Flask-0.10.1-py2.7.egg/flask/app.py", line 772, in run
run_simple(host, port, self, **options)
File ".../eggs/Werkzeug-0.7-py2.7.egg/werkzeug/serving.py", line 609, in run_simple
run_with_reloader(inner, extra_files, reloader_interval)
File ".../eggs/Werkzeug-0.7-py2.7.egg/werkzeug/serving.py", line 524, in run_with_reloader
signal.signal(signal.SIGTERM, lambda *args: sys.exit(0))
ValueError: signal only works in main thread
如果不在主线程中运行Flask,我怎么能这样做呢?
答案 0 :(得分:51)
您在调试模式下运行Flask
,启用重新加载器(在代码更改时重新加载Flask服务器)。
Flask可以在单独的线程中运行得很好,但是重新加载器期望在主线程中运行。
要解决您的问题,您应该禁用调试(app.debug = False
),或禁用重新加载器(app.use_reloader=False
)。
这些也可以作为参数传递给app.run
:app.run(debug=True, use_reloader=False)
。
答案 1 :(得分:12)
如果您正在寻找访问烧瓶中的ipython终端 在单独的线程中运行应用程序, 试试这个例子: -
from flask import Flask
import thread
data = 'foo'
app = Flask(__name__)
@app.route("/")
def main():
return data
def flaskThread():
app.run()
if __name__ == "__main__":
thread.start_new_thread(flaskThread,())
在ipython中运行此文件
答案 2 :(得分:3)
更新的Python 3答案更简单:
from flask import Flask
import threading
data = 'foo'
app = Flask(__name__)
@app.route("/")
def main():
return data
if __name__ == "__main__":
threading.Thread(target=app.run).start()
答案 3 :(得分:1)
关闭服务器
0.7版本的新功能。
从Werkzeug 0.7开始,开发服务器提供了一种方法 请求后关闭服务器。这目前只适用于 Python 2.6及更高版本,仅适用于开发服务器。 要启动关闭,您必须调用一个名为的函数 WSGI环境中的'werkzeug.server.shutdown':
def shutdown_server(environ): if not 'werkzeug.server.shutdown' in environ: raise RuntimeError('Not running the development server') environ['werkzeug.server.shutdown']()