3

1つの詳細を除いて、セッション用のCherryPyのAPIが大好きです。言う代わりに、cherrypy.session["spam"]ただ言うことができるようにしたいと思いますsession["spam"]

残念ながら、最初にページリクエストが行われるまでオブジェクトが作成されないfrom cherrypy import sessionため、モジュールの1つにグローバルを単純に含めることはできません。cherrypy.session最初のページのリクエストではなく、CherryPyにセッションオブジェクトをすぐに初期化させる方法はありますか?

答えがノーの場合、私には2つの醜い選択肢があります。

まず、私はこのようなことをすることができます

def import_session():
    global session
    while not hasattr(cherrypy, "session"):
        sleep(0.1)
    session = cherrypy.session

Thread(target=import_session).start()

cherrypy.session["spam"]これは大きな恨みのように感じますが、私は毎回書くのが本当に嫌いなので、それだけの価値があります。

私の2番目の解決策は次のようなことをすることです

class SessionKludge:
    def __getitem__(self, name):
        return cherrypy.session[name]
    def __setitem__(self, name, val):
        cherrypy.session[name] = val

session = SessionKludge()

しかし、これはさらに大きな問題のように感じます。次のような他の辞書関数を実装するには、さらに多くの作業を行う必要があります。.get

So I'd definitely prefer a simple way to initialize the object myself. Does anyone know how to do this?

4

1 に答える 1

5

CherryPy 3.1 の場合、Session の適切なサブクラスを見つけて、その「setup」クラスメソッドを実行し、cherrypy.session を ThreadLocalProxy に設定する必要があります。これはすべて、cherrypy.lib.sessions.init の次のチャンクで行われます。

# Find the storage class and call setup (first time only).
storage_class = storage_type.title() + 'Session'
storage_class = globals()[storage_class]
if not hasattr(cherrypy, "session"):
    if hasattr(storage_class, "setup"):
        storage_class.setup(**kwargs)

# Create cherrypy.session which will proxy to cherrypy.serving.session
if not hasattr(cherrypy, "session"):
    cherrypy.session = cherrypy._ThreadLocalProxy('session')

削減 (FileSession を必要なサブクラスに置き換えます):

FileSession.setup(**kwargs)
cherrypy.session = cherrypy._ThreadLocalProxy('session')

「kwargs」は、「timeout」、「clean_freq」、および tools.sessions.* config のサブクラス固有のエントリで構成されます。

于 2008-10-04T05:12:53.407 に答える