1

リクエストが来たらすぐにログファイルを更新したい。TRUE に初期化されたクラス変数 event_logging_enabled があります。POST() 関数で、event_logging_enabled の値を確認します。

実行時に、後続のリクエストのためにこのフラグの値を FALSE に変更します。しかし、それはTRUEのままです。

デバッグ中に、リクエストを受信すると、各リクエストを処理するために新しいオブジェクトが作成されるため、初期化された値 ieTRUE が選択されることがわかりました。

これは、同じクラスの getlogEnabled() などの他の関数には当てはまりません。回避策を提案してください。

import web
import threading

class webServer(threading.Thread):
    port = "1234"
    event_logging_enabled  = "True"

    def getlogEnabled(self):
        print "Stub getlogEnabled(): ",self.event_logging_enabled

    def __init__(self):
        threading.Thread.__init__(self) 
        """ Logging """
        print "Init------------------------",self.event_logging_enabled
        self.event_logging_filename = "ueLogs.log"

    def run(self):
        urls = (
        '/','webServer',
        )
        app = web.application(urls,globals())
        sys.argv.append(webServer.port)
        app.run()

    def POST(self):
        print "in POST"
        print "Stub POST(): Logging Enabled : ",self.event_logging_enabled
4

2 に答える 2

12

私が過去に行ったことがあり、問題なく動作しているように見えるのは、すべてのリクエストを通じて永続的な変数が必要な場合、app.run() の直前に Web オブジェクトにジャムすることです。

たとえば、すべてのリクエストで共有され、リクエスト間で永続化される「foo」という変数が必要な場合は、次のようにします。

web.app = web.application(urls, globals())

# Add my custom foo
web.foo = 'some value'

# Start the app
web.app.run()

次に、foo 変数を変更または使用する必要がある場合は、コードのどこかで

import web

web.foo = 'some other value'

起動スクリプトで Web オブジェクトに詰め込んだものは、アプリが再起動されるまで保持されます。ちょっとしたハックですが、うまくいきます。

于 2011-09-23T19:49:51.537 に答える
3

私は web.py フレームワークにはあまり詳しくありませんが、一般的に Web アプリケーションについては詳しくありません。複数のリクエスト間で状態を保持する必要がある場合は、セッション オブジェクトで管理する必要があります。セッション オブジェクトは、Web ユーザーごとに個別にすることも、アプリケーション全体で共通にすることもできます。

web.py フレームワークにはセッション オブジェクトがあります: http://webpy.org/docs/0.3/api#web.session

セッションの内容をデータベースに保存するか、ファイルに直接保存するかを決定できます。そのページの「DiskStore」の下にあるコード サンプルは、変数をセッションに配置する方法を示しています。

(ちなみに、Python のブール値リテラルは True と False であり、"True" ではありません)。

于 2011-09-22T10:47:55.663 に答える