9

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

我已经阅读了 twisted.web 文档,但我不知道该怎么做。我知道请求对象有一个名为 getSession() 的函数,然后会返回一个会话对象。接下来是什么?如何在多个请求期间存储信息?

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

4

3 回答 3

4

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

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

于 2009-06-14T08:50:06.903 回答
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()

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

  1. Twisted (Zope) 接口和适配器
  2. 组件化

计数器值存储在适配器类中,接口类记录该类提供的内容。之所以可以在 Adapter 中存储持久数据,是因为 Session(由 getSession() 返回)是 Componentized 的子类。

于 2012-05-25T05:32:45.477 回答