0

私の理解では、Apache mod_wsgiはApacheと一緒に実行されCGIリクエストを処理するpythonインタープリターを実装しますが、WSGIとCGIの違いは、WSGIではPythonセッションがApacheサーバーが実行されている限り実行され続けるのに対し、CGIではサーバーがCGI要求を取得するたびに再起動する必要があります。

私が知りたいのは、インタラクティブなPythonセッションのように、ApacheからのCGI要求をリッスンする、Apacheとは別に実行できるPythonモジュールはありますか?したがって、たとえば、Apacheを実行し、WSGIミドルウェアを実行しないようにしてから、インタラクティブなPythonセッションを開始してWSGIミドルウェアモジュールをインポートすると、ApacheからのCGI要求を処理し、それなしでシャットダウンすることもできます。 Apacheをシャットダウンします。したがって、これはApache mod_wsgiのような単一のセッションですが、常にApacheと同時に実行する必要はなく、インタラクティブなPythonセッションから実行できます。

編集1:

たとえば、私はこのフラスコアプリmyapp.pyを持っています:

from flask import Flask

app = Flask(__name__)
app.debug = True

app.apples = 0

@app.route('/')
def hello():
    app.apples += 1
    return 'blah: %d' % app.apples

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

python myapp.pyと入力して実行できますが、独自のWebサーバーが起動します。代わりに、ApacheをWebサーバーにしたいのですが、インタラクティブなPythonシェルを開いて入力from myapp import *し、アプリにApacheからのリクエストをリッスンさせたいと思っています。インタラクティブなシェルがあるので、何かを行うことができます。のようにprint app.applesまたはapp.apples = 50何でも。WebアプリをWebサーバーから分離し、Pythonシェルと対話できるようにしたいということです。

そして、私が言いたいのapp.applesは、これはグローバル変数であり、アクセスされた回数のヒットカウントのようであり'/'、アプリが実行されている限り存続するということです。

編集2:

別の例を示します。

myapp.py:

import web

def add_global_hook():
    g = web.storage({"counter": 0})
    def _wrapper(handler):
        web.ctx.globals = g
        return handler()
    return _wrapper

class Hello:
    def GET(self):
        web.ctx.globals.counter += 1
        return "<h1>Counter: %d</h1>" % web.ctx.globals.counter

urls = ("/", "Hello")
app = web.application(urls, globals())
app.add_processor(add_global_hook())
app.run()

ここで、Pythonインタープリターを開いて、と入力するfrom myapp import *と、Webサーバーが起動しますが、Webサーバーの実行中は、インタラクティブシェルの使用がブロックされます。インタラクティブシェルを使用できるように、サーバーを非ブロッキング方式で実行する方法はありますか?

4

3 に答える 3

2

フロントエンドプロキシとしてApacheを使用してgunicornWSGIサーバーを実行することを検討しましたか?

複雑すぎることを何もすることなくライブPythonWebアプリケーションをデバッグできるようになった後は、次も参照してください。

https://github.com/GrahamDumpleton/wsgi-shell

mod_wsgiを使用している場合は、単一デーモンプロセスのデフォルト内でmod_wsgiデーモンモードを使用していることを確認する必要があります。

ところで、mod_wsgiがどのように機能するかについての理解は少し間違っていますが、それを修正するのではなく、自分がやろうとしていることをやりたい理由をよりよく説明するのに役立つだけです。おそらく、あなたが認識している解決策ではなく、実際の問題を提示することから始めます。

于 2012-06-01T02:18:56.637 に答える