質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Q&A

解決済

1回答

485閲覧

Herokuの「ルーティング機能」を無効にしたい

kogehipo

総合スコア15

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

0グッド

0クリップ

投稿2021/01/20 08:10

前提・実現したいこと

Heroku上に、ある種の測定データを時系列に受け取るアプリをFlaskで作成しています。Flask内でグローバル宣言した変数にデータを保持しようとしています。

発生している問題・エラーメッセージ

ローカル環境では問題なく動作するのですが、Herokuで動作させると、グローバル変数があたかも2個存在して、どちらかにデータが不規則に割り振られているような振る舞いをします。試しに、単なる Hello World を作ってみました。

# coding: utf-8 from flask import Flask app = Flask(__name__) print("APP STARTED!!") # ←デバッグ出力 @app.route('/') def main(): return "Hello world!" if __name__ == "__main__": app.run(debug=True, host="0.0.0.0")

すると、アプリ開始時にHerokuのログにデバッグ出力が2回出ていることを確認しました。

2021-01-20T06:38:43.078502+00:00 heroku[web.1]: State changed from starting to up 2021-01-20T06:38:43.129118+00:00 app[web.1]: APP STARTED!! 2021-01-20T06:38:43.129963+00:00 app[web.1]: APP STARTED!! 2021-01-20T06:38:50.000000+00:00 app[api]: Build succeeded

調べたこと

Herokuのドキュメントによると、ルーティング機能というものがあり、「ルーターは、ランダム選択アルゴリズムを使用して、Web dyno 間で HTTP リクエストのバランシングを行います」という記述を見つけました。Heroku側でFlaskアプリが並列に2本走っているとすれば上記の現象と辻褄が合います。

知りたいこと

Herokuではこのようなことが起こるのでしょうか?もしそうならルーティング機能を無効化する方法を知りたいです。

もし無効にできないのであれば、グローバル変数にデータを持つのではなくSQLightなどの外部データベースにデータを保存することを考えていますが、Herokuはデータファイルが保存されないという制限もあり、システム構成が複雑になってしまうことを懸念しています。

補足情報

Herokuは無償ライセンスで使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Herokuはよくわかりませんが、gunicornを使って動かしていたような気がするので、workerが2にでも設定されているんじゃないでしょうか?

gunicornのworkerって指定回数で再起動したりするので、データを保存するのには向かないと思いますよ。(再起動しないにしてもずっとデータをメモリ上に保存するのはコストが高いです。herokuはメモリ少ないですし、やめた方が良いです)

Webアプリでデータを受け取って表示する場合は、DBやテキストなど(普通はDB)の消えない場所にデータを保存するのが一般的ですので、DBあたりに入れた方が良いと思います。
flaskでdbを使う場合は、flask-sqlalchemyを使うと接続や制御が簡単でおすすめです。

というか、herokuって最初からDBついてませんでしたっけ?
同じDBMSを使ってローカルで開発すればそんなに難しいことはないと思いますが・・・。

投稿2021/01/22 06:52

FiroProchainezo

総合スコア2402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kogehipo

2021/01/22 08:30

回答ありがとうございました。解決しました。Procfileというファイルを作ってHerokuに実行コマンドを送るのですが、その内容に --workers オプションを付けることで期待通りの動作になりました。それにしてもデフォルトで2とは、トリッキーな仕様です。 web: gunicorn app:app --log-file=- --workers 1 Heroku使用にあたっては、測定作業は長くても1日で終わり、作業が終わったらCSV形式でダウンロード・管理する、という限定された使用環境なのでとりあえずは問題ないだろうと踏んでいます。何か問題があったらアドバイスを参考にさせていただきます。この度は本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問