[Twisted-Python] interface for Last-Modified
Glyph Lefkowitz
glyph at twistedmatrix.com
Wed Sep 25 00:07:00 MDT 2002
On 24 Sep 2002 20:50:18 -0700, Kevin Turner <kevin.m.turner at pobox.com> wrote:
> itamar has led me to what looks to be a much more elegant solution.
> Since the only resources that worry about receiving conditional requests
> are those that set cache validation headers (such as "Last-Modified"),
> the check to see if you're dealing with a conditional request can go in
> the L{http.Request.setLastModified} method. setLastModified's return
> value can then let the caller know if they date they gave was older than
> the one in the conditional request, so they don't have to render the
> body of the request. And this works, because Last-Modified being a
> header and all, you're having to set it before you write the request
> body anyway.
Wow! This is not a solution I would have thought of, but I agree that it's
very clean. If you've got this implemented, you're probably 99% of the way
there.
> and I was all ready to check it in, until I tried to apply it in my
> actual use-case, using it in a superclass::
Your use-case is pretty much complete except for one thing:
(widgets.Widget, mvc.View):
> def display(self, request):
> if request.setLastModified(self.lastModified) is http.CACHED:
> # Body should be empty.
> return ''
> else:
> # Body is rendered by subclass.
> return ''
^^^^^^^^^
Since this is a new superclass, we can redefine the interface of its subclasses
and change them not to be regular widgets. Since .display() is rather
higher-level than .render() it might even make sense to do this at the
top-level render() rather than in a subclass... Though twisted.web.widgets is
hopefully going away once woven is well-documented and provides replacements
for everything... For an initial release, though, something like this:
return self.displayBody(request)
Worst case, if in the future this API is later supported at a lower level in
Widget itself, setLastModified will be called twice with the same argument.
> class RssChannel(AbstractCommitList):
> def display(self, request):
^^^^^^^^^^^^^^^^^^^^^^^^^^^
and this would, of course, be
def displayBody(self, request):
> s = AbstractCommitList.display(self, request)
> # Now how do I know if I'm supposed to render the body or not?
Probably for the initial implementation, the only class to support this in the
base should be static.File.
--
| <`'> | Glyph Lefkowitz: Traveling Sorcerer |
| < _/ > | Lead Developer, the Twisted project |
| < ___/ > | http://www.twistedmatrix.com |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: </pipermail/twisted-python/attachments/20020925/938f8aec/attachment.sig>
More information about the Twisted-Python
mailing list