私は最初のFlask-Restless APIを書いていて、ちょっと気になる小さな問題に遭遇しました。Flask + Restlessがデバッグモードで再読み込みに失敗する
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
それがためにデバッグモードでリロード機能の起こっていることは明らかである、と私が言ったように、私はFalseにDEBUGを設定した場合、それは正常に動作、または私はそれがapp.runを使用して起動しても、 (use_reloader = False)
私が落ち着きがDEBUGの中であってもいくつかのマルチスレッドを使用しているかどうかを調べようとしましたが、それを無効にすることはできますが、関連するものは何も見つかりませんでした。
バージョン:
Python==3.5.2
Flask==0.12.2
Flask-Restless==0.17.0
Flask-SQLAlchemy==2.3.2
Werkzeug==0.12.2
OS:(Ubuntuの16.04に基づく)のLinux ElementaryOS 0.4.1
任意のアイデアは、なぜ起こって、どのように私はそれを修正することができるということですか?
** UPDATE ** [SOLVED]問題は、実際にapp.runを呼び出し、2つの異なるスレッドを生成しているようだフラスコラン ...愚かな事を実行していた
。
app.run()
と、2つの異なるスレッドを生成しているようだフラスコランで実行:
質問を更新する代わりに回答してください。 –
私は、Stackoverflowが私の質問に答えることができるようになるまで、数時間待たなければなりません... IIRC – danielfranca