I'm curious about request.getSession
Per the docs:
It seems like it's tricky to use correctly. My code needs to:
- define an Interface
- define a class that implements my Interface
- call registerAdapter, passing in my class, server.Session and my
- get a Session instance
- brace myself
- create an instance of my Interface class, passing in the Session instance
- update that Interface instance.... it will persisted, but only in-memory
By default, that data doesn't go to database/memcached/whatever, so it's
only accessible in-process
On first blush, that seems like a lot of legwork. I'm not clear on what
utility's provided by all this versus say maintaining a dict as a
class-attribute on Site or something. It's also (for me) counter-intuitive
to be creating an instance of an _Interface_ and poking data into it.
Also I was a bit surprised that getSession doesn't return a deferred, since
it seems like it'd be common to want to persist session data in an external
store so that multiple twisted-web processes can access it in a
clustered/load-balanced setup. How do other folks go about that?
I hacked something together a while ago to run session data into Redis, but
what I ended up with required so much surgery on twisted web's classes that
I figured I must be doing it wrong. I think Site, SessionFactory and
Request were all customised.
I was thinking about this again in the context of Cory's "Implement
server-side HTTP/2 server push" ticket:
In this context, I'd like to have access to my session data in multiple
Resource objects without _necessarily_ having to round-trip to an external
store each time to get/put the same data. In the case of http 1.1 requests,
I guess there's no way around that round-trip, so it might be optimal if my
Resource objects could be oblivious to the underlying protocol version and
Session get/put mechanism.
So it'd be great if the default Session mechanism could take care of me
there, and I could just have my cake and eat it.
Another wrinkle that surprised me when I was hacking on this was that there
didn't seem to be a way to uniquely identify a request instance, so within
the session code it was impossible to tell if two calls to getSession were
coming from different points in the callback chain responding to a single
Request, or if the second belonged to a different Request entirely.
So my confusion is probably apparent at this stage :)
I'm guessing others have been here before me. What approaches have you
taken to storing your sessions? Are there good open source projects that I
should look to for best practice?
On behalf of Twisted Matrix Laboratories, I am honoured to announce the release of Twisted 16.3.0.
The highlights of this release are:
- The Git migration has happened, so we've updated our development documentation to match. We're now trialling accepting pull requests at github.com/twisted/twisted, so if you've ever wanted an excuse to contribute, now's the chance!
- In our steady shedding of baggage, twisted.spread.ui, twisted.manhole (not to be confused with twisted.conch.manhole!), and a bunch of old and deprecated stuff from twisted.python.reflect and twisted.protocols.sip have been removed.
- twisted.web's HTTP server now handles pipelined requests better -- it used to try and process them in parallel, but this was fraught with problems and now it processes them in series, which is less surprising to code that expects the Request's transport to not be buffered (e.g. WebSockets). There is also a bugfix for HTTP timeouts not working in 16.2.
- Twisted now has HTTP/2 support in its web server! This is currently not available by default -- you will need to install hyper-h2, which is available in the [h2] setuptools extras. If you want to play around with it "pip install twisted[h2]" (on Python 2, a bugfix release will make it available on Python 3) and add "h2" to your Site's acceptableProtocols.
- 53 tickets closed overall, including cleanups that move us closer to a total Python 3 port.
For more information, check the NEWS file (link provided below).
You can find the downloads at <https://pypi.python.org/pypi/Twisted> (or alternatively <http://twistedmatrix.com/trac/wiki/Downloads>). The NEWS file is also available at <https://github.com/twisted/twisted/blob/twisted-16.3.0/NEWS>.
Many thanks to everyone who had a part in this release - the supporters of the Twisted Software Foundation, the developers who contributed code as well as documentation, and all the people building great things with Twisted!
Amber Brown (HawkOwl)