1

web.py コードを Apache で構成したときに、奇妙な問題に遭遇しました。2 つのクラスで使用する必要がある 3 つの変数があります。以前はグローバル変数を使用してこれを処理していましたが、残念ながら現在は機能しません。

例:

   urls = (
              '/', 'index',
              '/result','Result' 
   )
   # index is basically a form which takes some inputs     
   class index:
        def POST(self):
                global VAR1, VAR2, VAR3
                 i = web.input()
                 VAR1 = i.word1.__str__()
                 VAR2 = i.word2.__str__()
                 VAR3 = i.word3.__str__()
                 raise web.seeother('/result')
   class Result:
        def GET(self):
                print VAR1, VAR2
                return r_result(VAR1, VAR2)
        def POST(self):
                print VAR2, VAR3

これは、コードを個別に実行すると(つまり、python webappy.py)完全に正常に機能しますが、Apache 設定で使用すると、次のようになります。

NameError: Result.Get の print ステートメントでグローバル名 'VAR1' が定義されていません

ApplicationIssues: http://code.google.com/p/modwsgi/wiki/ApplicationIssuesをチェックしていたところ、次のステートメントが見つかりました。

アプリケーション グローバル変数

WSGI アプリケーションをホストする Python サブ インタープリターはリクエスト間でメモリに保持されるため、グローバル データは事実上永続的であり、あるリクエストから次のリクエストに状態を転送するために使用できます。ただし、UNIX システムでは、Apache は通常複数のプロセスを使用して要求を処理し、そのような各プロセスには独自のグローバル データがあります。つまり、グローバル データは使用できますが、その単一プロセスのコンテキスト内で安全に再利用できるデータをキャッシュするためにのみ使用できます。どのプロセスで実行されるかに関係なく、すべての要求ハンドラーに表示される必要がある情報を保持する手段として、グローバル データを使用することはできません。

これらの変数をクラスと関数に渡さなければなりません。変数をビルトインおよびWebモジュールに追加しようとしましたが、うまくいきませんでした。

PS: また、これらの変数をファイルやデータベースに保存したくありません。

私は自分自身を明確にしたことを願っています。

4

2 に答える 2

1

ある時点で、これらの変数を共有しない別のプロセスで実行するように構成されている可能性があるため、Web アプリケーションを開発するときはグローバル変数に依存しないでください。

リクエスト間でそれらを保持するには、保存して永続ストレージからロードする必要があるため、データベースまたは同様のソリューションを使用しないと不可能だと思います。

それらをロードおよび保存する良い方法は、これらの変数を web.ctx にロードするアプリケーション プロセッサを使用して、コントローラー メソッドでそれらにアクセスできるようにすることです。

例えば:

def global_variables_processor(handle):
    # load variables from persistent storage and save them in web.ctx.global_variables
    try:
        return handle()
    finally:
        # save variables from web.ctx.global_variables in persistent storage

app = web.application(urls, globals()
app.add_processor(global_variables_processor)
于 2013-04-26T11:10:23.517 に答える
0

さて、あなたの質問からのこの抜粋には考えられる理由があります...

Apache は通常、複数のプロセスを使用してリクエストを処理し、そのような各プロセスには独自のグローバル データがあります。

...したがって、ディレクティブを使用して、決して終了しない単一のプロセスを使用するようにApacheを構成した場合にのみ、コードは確実に機能します...

MaxClients 1
MaxRequestsPerChild 0

これが実用的なオプションでない場合は、これらの変数を別の場所に保存する必要があります。

于 2013-04-25T14:35:37.137 に答える