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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

895閲覧

flask + uWSGIの環境構築について

退会済みユーザー

退会済みユーザー

総合スコア0

Flask

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/05/27 04:18

前提・実現したいこと

flaskで実装したwebアプリケーションをuWSGIで本番環境に構築しようとしています。
テストサーバでは正常に動作していたものが、本番(uWSGI)にデプロイするとうまく動作させることができずに困っています。

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

実装の中でエラーハンドラの設定等を行なっています。
テストで例外を発生させてみたところ、本来エラーハンドラで処理されるはずのものがスルーされていました。
調べてみると、どうやら下記で __name____main__ が渡されておらず、 app.run() が実行されていませんでした。

python

1if __name__ == '__main__': 2 app.run()

デバッグしてみたところ、上記実装がされているファイル名が __name__ に渡されているようでした。
しかし、 app.run() の中で行われているエラーハンドラ以外の通常の実装は正常に動作しており、状況がよくつかめていない状態です。
また、上記if文から app.run() を外に出し、かならず実行されるようにしたところ、今度は app.run() の箇所でブロッキングされるような状態になり、一切正常に動作しないようになりました。

該当のソースコード

app.py

python

1def create_app(): 2 app = Flask(__name__) 3 CORS(app) 4 5 app.register_error_handler(Exception, handle_internal_error) 6 7 api = Api(app) 8 api.add_resource(API, '/') 9 10app = create_app()

prod_server.py

本番でuWSGIから実行させようとしているプログラムです。

python

1from app import app 2 3 4if __name__ == '__main__': 5 app.run()

dev_server.py

開発環境で用いていたプログラムです。
こちらでは全て正常に動作しています。

python

1from app import app 2 3 4if __name__ == '__main__': 5 app.run(host='0.0.0.0', port=8080, debug=True)

uwsgi.ini

[uwsgi] pythonpath = /usr/local/hoge/ module = prod_server callable = app master = true processes = 1 socket = /var/run/uwsgi/uwsgi.sock chmod-socket = 666 vacuum = true die-on-term = true

試したこと

  • prod_server.py__name__ をデバッグしてみたところ、 prod_server が出力されました。
  • prod_server.py を直接実行してみたところ、 __main__ が出力されました。
  • prod_server.pyapp.run() をifの外に出してみましたが、そこでブロッキングされてしまって正常に動作しませんでした。

python

1from app import app 2 3 4app.run() 5#if __name__ == '__main__': 6# app.run()

補足情報(FW/ツールのバージョンなど)

bash

1$ flask --version 2Flask 1.0.2 3Python 3.6.7 (default, Dec 5 2018, 15:02:05) 4[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] 5 6$ uwsgi --version 72.0.18

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

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

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

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

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

quickquip

2019/05/27 04:55

> 実装の中でエラーハンドラの設定等を行なっています。 ここの詳細が必要に思います。
退会済みユーザー

退会済みユーザー

2019/05/27 05:18

app.pyの中の以下部分です。 > app.register_error_handler(Exception, handle_internal_error) 中身はデバッグログを出力しているのみなので省略しています。
quickquip

2019/05/27 05:36

uwsgiで動かしたらproductionモードで動くので、ログレベルがwarning以上になっていてログ出力されていないのを勘違いしているのでは? と思ったのでした。
退会済みユーザー

退会済みユーザー

2019/05/27 05:47

エラーハンドラ以外でのデバッグログは出力されており、同じ方法で出力するようにしているので勘違いの可能性は低いかと思います。
quickquip

2019/05/27 05:50

と書かれましてもhandle_internal_errorの内部ソースも宣言部分も提示されていない以上、他者にはそういった判断はできないかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問