Flask + Restless无法在调试模式下重新加载

时间:2017-11-30 08:44:56

标签: python flask flask-restless

我正在编写我的第一个Flask-Restless API,并且遇到了一个让我烦恼的小问题。

如果它不在DEBUG MODE中,它可以正常工作。

但是如果我将调试模式设置为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,或者即使我使用 app.run(use_reloader = False)启动它也可以正常工作)

我试图找出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 ElementaryOS 0.4.1(基于Ubuntu 16.04)

知道为什么会发生这种情况,我该如何解决?

**更新** [已解决]

问题实际上是调用 app.run 然后执行 flask运行 ...愚蠢的事情似乎产生了两个不同的线程。

1 个答案:

答案 0 :(得分:2)

问题实际上是在代码中调用它:

app.run() 

然后执行 flask run ,这似乎会产生两个不同的线程。