9

twisted.web で http サーバーを実装しています。ここで問題が発生します。ログイン操作があります。その後、ユーザーがブラウザを閉じるまで、http サーバーが Cookie/セッションを使用して各クライアントを記憶するようにします。

twisted.web ドキュメントを読みましたが、これを行う方法がわかりません。リクエスト オブジェクトに getSession() という名前の関数があることはわかっています。その後、セッション オブジェクトが返されます。次は何?いくつかのリクエスト中に情報を保存するにはどうすればよいですか?

ねじれたメールリストも検索しました。非常に役立つものは何もなく、私はまだ混乱しています。誰かが以前にこれを使用した場合は、これを説明してください。または、ここにコードを追加してください。そうすれば、自分で理解できます。どうもありがとうございました!

4

3 に答える 3

4

getSession() を呼び出すと、セッションが生成され、Cookie がリクエストに追加されます。

getSession() ソースコード

クライアントがすでにセッション Cookie を持っている場合、getSession() を呼び出すと、それが読み取られ、元のセッション コンテンツを含むセッションが返されます。そのため、実際にセッション cookie を作成しているか、それを読み取るだけであるかに関係なく、コードに対して透過的です。

セッション Cookie には特定のプロパティがあります。Cookie の内容をより詳細に制御したい場合は、getSession() がバックグラウンドで呼び出す Request.addCookie() を参照してください。

于 2009-08-19T13:50:46.217 に答える
3

この関連する質問を参照してくださいStore an instance of a connection - twisted.web。そこの答えは、このブログ投稿http://jcalderone.livejournal.com/53680.htmlへのリンクです。これは、セッションの訪問数のカウンターを保存する例を示しています (例については jcalderone に感謝します)。

# in a .rpy file launched with `twistd -n web --path .`
cache()

from zope.interface import Interface, Attribute, implements
from twisted.python.components import registerAdapter
from twisted.web.server import Session
from twisted.web.resource import Resource

class ICounter(Interface):
    value = Attribute("An int value which counts up once per page view.")

class Counter(object):
    implements(ICounter)
    def __init__(self, session):
        self.value = 0

registerAdapter(Counter, Session, ICounter)

class CounterResource(Resource):
    def render_GET(self, request):
        session = request.getSession()
        counter = ICounter(session)   
        counter.value += 1
        return "Visit #%d for you!" % (counter.value,)

resource = CounterResource()

これが混乱しているように見えても心配しないでください。ここでの動作を理解するには、次の 2 つのことを理解する必要があります。

  1. Twisted (Zope) インターフェイスとアダプター
  2. コンポーネント化

カウンター値は Adapter クラスに格納され、Interface クラスはそのクラスが提供するものを文書化します。Adapter に永続データを格納できるのは、Session (getSession() によって返される) が Componentized のサブクラスであるためです。

于 2012-05-25T05:32:45.477 に答える