Twisted系列web编程之六 :SESSION 的处理
摘要: 前面讲到了利用twisted来动态生成网页,动态dispatch url, 处理get 请求,处理post请求的数据,但还有一个重要的东西。在做网页开发时必不可少,就是 session 管理。怎么得到session, 怎么测底销毁一个session,怎么在session 中存入数据,怎么设置 session 的过期时间。这是要解决的问题。
前面讲到了利用twisted来动态生成网页,动态dispatch url, 处理get 请求,处理post请求的数据,但还有一个重要的东西。在做网页开发时必不可少,就是 session 管理。怎么得到session, 怎么测底销毁一个session,怎么在session 中存入数据,怎么设置 session 的过期时间。这是要解决的问题。
一, Session 的创建与销毁.
from twisted.internet import reactor from twisted.web.resource import Resource from twisted.web.server import Site class ShowSession(Resource): def render_GET(self, request): return 'Your session id is: ' + request.getSession().uid class ExpireSession(Resource): def render_GET(self, request): request.getSession().expire() return 'Your session has been expired.' resource = ShowSession() resource.putChild("expire", ExpireSession()) resource.putChild('getsession',ShowSession()) factory = Site(resource) reactor.listenTCP(8880, factory) reactor.run()
运行程序,并在浏览器地址栏输入 http://localhost:8880/getsession, 会得到session id, 如果在浏览器输入 http://localhost:8880/expire ,会销毁session
二 在 session 中保存内容,比如保存一个计数器,每次访问就加一。
from twisted.internet import reactor from twisted.python.components import registerAdapter from twisted.web.resource import Resource from twisted.web.server import Session, Site from zope.interface import Interface, Attribute, implements 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() resource.putChild("count", CounterResource()) factory = Site(resource) reactor.listenTCP(8880, factory) reactor.run()
运行程序之后,在浏览器上输入 http://locaohost:8880/count 会发现计数器变化,每次刷新网页,计数器将会加一.
三。设置 session 的过期时间。
from twisted.web.server import Site, Session from twisted.web.resource import Resource from twisted.internet import reactor class ShortSession(Session): sessionTimeout = 5 class ExpirationLogger(Resource): sessions = set() def render_GET(self, request): session = request.getSession() if session.uid not in self.sessions: self.sessions.add(session.uid) session.notifyOnExpire(lambda: self._expired(session.uid)) return "" def _expired(self, uid): print "Session", uid, "has expired." self.sessions.remove(uid) rootResource = Resource() rootResource.putChild("logme", ExpirationLogger()) factory = Site(rootResource) factory.sessionFactory = ShortSession reactor.listenTCP(8880, factory) reactor.run()
运行程序,在浏览器上输入 http://localhost:8880/logme 可以发现session 销毁,另外,等5秒钟,session 也会超时销毁.