如何在twisted.web中使用session / cookie?

时间:2009-06-08 02:07:36

标签: python twisted

我正在使用twisted.web实现一个http服务器。问题出在这里:有一个登录操作;之后,我希望http服务器使用acookie / session记住每个客户端,直到用户关闭浏览器。

我已经阅读了twisted.web文档,但我无法弄清楚如何做到这一点。我知道请求对象有一个名为getSession()的函数,然后会返回一个会话对象。接下来是什么?如何在多个请求中存储信息?

我还搜索了扭曲的邮件列表;没有什么非常有用的,我仍然感到困惑。如果以前有人用过这个,请向我解释一下,或者甚至在这里放一些代码,这样我自己就能理解。非常感谢你!

3 个答案:

答案 0 :(得分:4)

您可以使用“request.getSession()”来获取组件化对象。

您可以在http://twistedmatrix.com/documents/current/api/twisted.python.components.Componentized.html中阅读有关组件化的更多信息 - 使用它的基本方法是通过定义接口和实现,并将您的对象推送到会话中。

答案 1 :(得分:4)

调用getSession()将生成一个会话并将cookie添加到请求中:

getSession() source code

如果客户端已有会话cookie,则调用getSession()将读取它并返回具有原始会话内容的会话。因此,无论是否实际创建会话cookie或只是阅读它,它对您的代码都是透明的。

会话cookie具有某些属性...如果您想要更多地控制cookie的内容,那么请查看在场景后面调用getSession()的Request.addCookie()。

答案 2 :(得分:2)

请参阅此相关问题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()

如果这看起来令人困惑,请不要担心 - 在此行为有意义之前,您需要了解两件事:

  1. Twisted (Zope) Interfaces & Adapters
  2. Componentized
  3. 计数器值存储在Adapter类中,Interface类记录该类提供的内容。您可以在适配器中存储持久数据的原因是因为Session(由getSession()返回)是Componentized的子类。