一度起動gunicornフラスコ経験の問題を忘れないでください

エラー現象:

gunicorn + nginxの+フラスコ展開プロジェクト、展開プロセスは問題ありません、プロジェクトはまた、正常に起動しますが、アクセスインタフェースと、エラーは次のようになります。

トレースバック(最新の呼び出しの最後):
  ファイル" /usr/local/lib/python3.6/dist-packages/gunicorn/workers/sync.py "、ライン135、ハンドル
    self.handle_request(リスナー、REQ、クライアント、ADDR )
  ファイル" /usr/local/lib/python3.6/dist-packages/gunicorn/workers/sync.py "、ライン176、でhandle_request 
    respiter = self.wsgi(環境、resp.start_response)
TypeError例外:__call__()かかり1〜2位置引数が、図3に示すように与えられました

しかし、私はそのrunserverを介して実行ネットワークがアクセスできる外、それは、問題ありません。

そこで問題は、WSGIドッキングgunicorn、フラスコにあります。

起動するgunicornの方法がgunicornされる[オプション]ファイル:アプリ

私が理由かもしれない.......ああ........他の分野の多くを考えて、多くのことをしようとし、解決していない、そして20分間考え、これらの言葉を見つめていました。

ダイレクトスタート、それが起動し、そして最終的に(つまり、フラスコのインスタンスである)アプリのサービスを提供するためのrunserverファイル端子を介して直接実行されます

データベースの移行、スタートアップファイルのI提供して登録されたオブジェクトのフラスコスクリプトで、最終的に実際にフラスコ・スクリプトを起動するオブジェクトは簡単に言えば、のようないくつかのコマンドラインのもので、コマンドラインの拡張機能である、ではありませんコマンドラインを使用して、データベースの移行時に役に立たない(少なくとも、それは私には白に見えたので)。

このアイデアは、から出てきました。

それは、サービスエージェントが高い並行に処理することを意味gunicorn、コルーチン/スレッドがマルチプロセス/同時アクセスのために提供されているので、gunicornフラスコプロキシは、APPのフラスコにインスタンス化されるオブジェクトです。

次のように私のスタートアップファイルのコードは、おそらく次のとおりです。

以下からのプロジェクトのインポートAPP、デシベル
 から flask_migrate 輸入移行、MigrateCommand
 から flask_script インポートマネージャ

管理 = マネージャー(APP)
に移行 =移行(アプリ= APP、デシベル= デシベル)
manage.add_command(' DB ' 、MigrateCommand)

であれば __name__ == " __main__を" 
    manage.run()

間違いは、私がgunicornにつながった、gunicornにフラスコ・スクリプトの例を提供することであるパラメータは、標準のWSGIパラメータ、エラーではありません受け取りました。

解決策は単純である:(ここでは用)APPエージェントがうまくgunicornします。

だから、変更コマンドを起動しgunicorn:

1 gunicorn -D -w 3 -t 300 -b 0.0.0.0:5000管理:APPを

最も直接的なデータ処理の問題で必要な場合には、構成ログを追加し、最高のパーソナルアドバイスプラスジャーナリング、

gunicorn -D --error-ログファイル= /ログ/ gunicorn.log --pid = /ログ/ gunicorn.pid --access-ログファイル= /ログ/ access.logを-w 3 -t 300 -b 0.0.0.0:5000管理:APPを

 

したがって、この問題の原因は合意が標準実行をWSGIされていないということです、プロキシサーバーは、プロキシサーバーのAPPですが、私はこれを気づいていません。

以下に、フラスコスクリプト操作機構である場合、直接のrunserverの端子:

私はPythonが管理実行されたとき、この例では、run()メソッドを実行する、管理フラスコスクリプトの例は、上記のコードに示されています

    デフ実行(自己を、=なし、default_command =コマンド:なし)
         「」「
        コマンドライン入力を受け取るためにマネージャーを準備していない通常実行します。
        Pythonスクリプトで内部」場合__name__ == 『__main__』ブロックを。

        :パラメータコマンド:コマンドのオプション辞書。任意のコマンドに付加
                         add_commandを使用して追加()。

        :のparam default_command:何の場合に実行するデフォルトのコマンド名
                                の引数が渡されません。
        ""」

        もしコマンド:
            self._commands。

        sys.argvの)
         場合 default_commandはありません ないなし LEN(ARGV)== 1 
            argv.append(default_command)

        試す
            結果 = self.handle(ARGV [0]、ARGV [1 ):]
         以外EとしてSystemExitを:
            結果 = e.code 

        sys.exit(結果又は 0)

上記方法は、(ハンドル)、次いで、一連の方法を通じて、以下のコードを実行通過行います。

    デフadd_default_commands(自己):
         「」「
        シェルとのrunserverデフォルトのコマンドを追加し、これらを上書きする。
        単にadd_commandやデコレータを使用して、独自の同等物を追加します。
        『』」

        もし シェル ではない self._commands:
            self.add_command(シェル" シェル())
         であれば " のrunserver "  ではない self._commands:
            self.add_command(" のrunserver 、サーバー())

上記のコードは、それらの間で、我々はのrunserver非常に精通している、2つのコマンドオブジェクトを追加する方法フラスコスクリプトを呼び出します、コマンドは次のように呼び出して、サーバー()オブジェクトを実行します。

    デフ __call__ (自己、アプリ、ホスト、ポート、use_debugger、use_reloader、
                 スレッド、プロセス、passthrough_errors、ssl_crt、ssl_key): 
        私たちが要求コンテキストの中でサーバーを実行する必要はありません
        だけで直接実行するよう

        ならば use_debuggerはありませんなし:
            use_debugger = app.debug
             場合 use_debuggerがあるなし:
                use_debugger = Trueの
                 場合:sys.stderr.isatty()
                     のプリントがデバッグがオンになっている危険:ランダムなユーザーは、このサーバーへの接続を許可しないでください。"、ファイル= sys.stderrを持ち)
         場合 use_reloaderがあるなし:
            use_reloader = use_debugger 

        場合はなし[ssl_crt、ssl_key]:
            ssl_context = なし
         、他
            ssl_context = (ssl_crt、ssl_key)

        app.run(ホスト = ホスト、
                ポート = ポート、
                デバッグ = use_debugger、
                use_debugger = use_debugger、
                use_reloader =use_reloader、
                ねじ = ネジ、
                プロセス = プロセス、
                passthrough_errors = passthrough_errors、
                ssl_context = ssl_context、
                 ** self.server_options)

ここでは、コマンドが他のコマンドによって提供さフラスコスクリプトでない場合、それは本質的に、フラスコのインスタンスを実行するだろう、フラスコ(__名前__)は非常に明確であり、Pythonのmanage.pyののrunserverの実装では、実行する方法です。ファイル名を指定して実行( )

フラスコ-スクリプトは、ご注文を受けていない監視することです。

APPフラスコスクリプト剤は、フラスコスクリプトオブジェクトではなく、同じフラスコのインスタンスをフラスコであろうが、また、アプリケーションを取得するフラスコをgunicornするために提供されなければなりません

 

おすすめ

転載: www.cnblogs.com/haiton/p/11295495.html