私の理解では、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サーバーの実行中は、インタラクティブシェルの使用がブロックされます。インタラクティブシェルを使用できるように、サーバーを非ブロッキング方式で実行する方法はありますか?