Flask + Restless 在调试模式下无法重新加载
Flask + Restless fails to reload in debug mode
我正在写我的第一个 Flask-Restless API,遇到了一个让我有点恼火的小问题。
如果我不在调试模式下,它工作正常。
但是如果我将调试模式设置为 True,应用程序似乎在尝试重新加载时中断(但在访问任何端点时都会发生),并且重新加载不起作用。
我带来了这个小例子,所以你可以看到即使在非常小的应用程序中我也可以重现它:
import flask_sqlalchemy
import flask_restless
import flask
app = flask.Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = flask_sqlalchemy.SQLAlchemy(app)
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Unicode, unique=True, nullable=False)
db.create_all()
manager = flask_restless.APIManager(app, flask_sqlalchemy_db=db)
manager.create_api(Person)
app.run()
现在,每次我尝试访问我的应用程序的任何端点时,我都会收到以下错误:
127.0.0.1 - - [30/Nov/2017 09:39:59] "GET / HTTP/1.1" 500 -
Traceback (most recent call last):
File "/<path>/app.py", line 46, in <module>
app.run()
File "/<myvenc/>devices/lib/python3.5/site-packages/flask/app.py", line 841, in run
run_simple(host, port, self, **options)
File "/<myvenv>/devices/lib/python3.5/site-packages/werkzeug/serving.py", line 737, in run_simple
reloader_type)
File "/<myvenv>/devices/lib/python3.5/site-packages/werkzeug/_reloader.py", line 257, in run_with_reloader
signal.signal(signal.SIGTERM, lambda *args: sys.exit(0))
File "/usr/lib/python3.5/signal.py", line 47, in signal
handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
ValueError: signal only works in main thread
很明显,这是因为重新加载程序处于 DEBUG 模式,正如我所说,如果我将 DEBUG 设置为 False,或者即使我使用 [=45 启动它,它也能正常工作=](use_reloader=假)
我试图找出 Restless 是否在 DEBUG 中使用一些多线程,以及我是否可以禁用它,但找不到任何相关的东西。
版本:
Python==3.5.2
Flask==0.12.2
Flask-Restless==0.17.0
Flask-SQLAlchemy==2.3.2
Werkzeug==0.12.2
OS:Linux 初级OS 0.4.1(基于Ubuntu 16.04)
知道为什么会这样吗?我该如何解决?
** 更新** [已解决]
问题实际上是调用 app.run 然后用 flask 运行 执行...愚蠢似乎产生了两个不同线程的东西。
问题实际上是在代码中调用这个:
app.run()
然后使用 flask 运行 执行,这似乎产生了两个不同的线程。
我正在写我的第一个 Flask-Restless API,遇到了一个让我有点恼火的小问题。
如果我不在调试模式下,它工作正常。
但是如果我将调试模式设置为 True,应用程序似乎在尝试重新加载时中断(但在访问任何端点时都会发生),并且重新加载不起作用。
我带来了这个小例子,所以你可以看到即使在非常小的应用程序中我也可以重现它:
import flask_sqlalchemy
import flask_restless
import flask
app = flask.Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = flask_sqlalchemy.SQLAlchemy(app)
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Unicode, unique=True, nullable=False)
db.create_all()
manager = flask_restless.APIManager(app, flask_sqlalchemy_db=db)
manager.create_api(Person)
app.run()
现在,每次我尝试访问我的应用程序的任何端点时,我都会收到以下错误:
127.0.0.1 - - [30/Nov/2017 09:39:59] "GET / HTTP/1.1" 500 -
Traceback (most recent call last):
File "/<path>/app.py", line 46, in <module>
app.run()
File "/<myvenc/>devices/lib/python3.5/site-packages/flask/app.py", line 841, in run
run_simple(host, port, self, **options)
File "/<myvenv>/devices/lib/python3.5/site-packages/werkzeug/serving.py", line 737, in run_simple
reloader_type)
File "/<myvenv>/devices/lib/python3.5/site-packages/werkzeug/_reloader.py", line 257, in run_with_reloader
signal.signal(signal.SIGTERM, lambda *args: sys.exit(0))
File "/usr/lib/python3.5/signal.py", line 47, in signal
handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
ValueError: signal only works in main thread
很明显,这是因为重新加载程序处于 DEBUG 模式,正如我所说,如果我将 DEBUG 设置为 False,或者即使我使用 [=45 启动它,它也能正常工作=](use_reloader=假)
我试图找出 Restless 是否在 DEBUG 中使用一些多线程,以及我是否可以禁用它,但找不到任何相关的东西。
版本:
Python==3.5.2
Flask==0.12.2
Flask-Restless==0.17.0
Flask-SQLAlchemy==2.3.2
Werkzeug==0.12.2
OS:Linux 初级OS 0.4.1(基于Ubuntu 16.04)
知道为什么会这样吗?我该如何解决?
** 更新** [已解决]
问题实际上是调用 app.run 然后用 flask 运行 执行...愚蠢似乎产生了两个不同线程的东西。
问题实际上是在代码中调用这个:
app.run()
然后使用 flask 运行 执行,这似乎产生了两个不同的线程。