You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mod_python-dev@quetz.apache.org by Mike Looijmans <nl...@natlab.research.philips.com> on 2006/02/10 07:34:46 UTC

Re: Last modified times

I've read through the documentation. I like the interface - just call 
ap_update_mtime for every object your response depends on (and another 
great feature: It starts with the mtime of the file, so that updates to 
the script also invalidate the cached response).

Exposing those three functions would make a very good addition. A little 
Pythonic wrapping around ap_update_mtime to accept reasonable things 
like datetime objects would be helpful.

ap_discard_request_body() might help resolving the issue with HEAD 
request writing out a body, maybe that change was related to 
http://issues.apache.org/jira/browse/MODPYTHON-71 but I'm not sure.

Mike Looijmans
Philips Natlab / Topic Automation


Graham Dumpleton wrote:
> Mike, I have a feeling that Apache has ways of generating those date/time
> strings for last modified for you. Thus, the routine shouldn't be required.
> The real problem is that mod_python doesn't expose the methods which
> may actually be useful to you.
> 
> Can you look through the Apache functions described in:
> 
>   http://162.105.203.19/apache-doc/138.htm
> 
> and indicate whether if functions like:
> 
>   ap_set_etag()
>   ap_update_mtime()
>   ap_set_last_modified()
> 
> you could more easily do the same thing.
> 
> The request object already provides equivalent to ap_meets_conditions(),
> but not these others.
> 
> I also find the function:
> 
>   ap_discard_request_body()
> 
> to be interesting. That might be interesting to have access to as well.
> 
> Graham
> 
> Mike Looijmans wrote ..
> 
>>>We probably want to defer until after 3.2.7 (final) is released to have
>>>any serious discussion about what should constitute version 3.3, but
>>>am still curious to know at this point where your interests in 3.3 lie.
>>>Is it simply to help finish up eliminating all these known issues/bugs
>>>or do you have other ideas in mind as to the direction of mod_python?
>>
>>Well, since you asked...
>>
>>I'd like to see more HTTP level helper functions. For one thing, I keep
>>writing the same stuff for handling if-modified-since headers, accept,
>>and similar construct. Having one library to handle these with would be
>>very helpful.
>>
>>For example, a function to format a datetime tuple into a HTTP style
>>date string (this one should *definitely* go into mod_python), as well
>>as its counterpart. Note that this implementation is not correct as it
>>does not handle timezones...
>>
>>##
>>
>>weekdayname = ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun')
>>
>>monthname = (None,
>>              'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
>>              'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
>>
>>def httpdate(dt):
>>     """Return the current date and time formatted for a
>>     message header."""
>>     now = time.time()
>>     year, month, day, hh, mm, ss, wd, y, z = dt
>>     s = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % (
>>             weekdayname[wd],
>>             day, monthname[month], year,
>>             hh, mm, ss)
>>     return s
>>
>>##
>>
>>Another thing I use very often (when writing DB apps) is the
>>if-modified-since mechanism. This helps reducing the load on the server
>>since most clients will be visiting the same page a number of times in
>>a
>>session.
>>Calling checkLastModified in my code quickly aborts rendering the page
>>if it hasn't changed since the last visit.
>>(This one is incomplete as well - should add support for etag and length
>>extensions. The etag is very useful when things like username can change
>>between pages.)
>>
>>##
>>
>>def checkLastModified(req, lastmod):
>>     """If lastmod is non-zero (should be datetime object), outputs
>>     a Last-Modified header. If the browser supplied an identical
>>     If-Modified-Since header, this method raises
>>     apache.SERVER_RETURN with apache.HTTP_NOT_MODIFIED
>>     which informs the browser to use its cached version.
>>     """
>>     if lastmod:
>>         ifmodsince = req.headers_in.get('if-modified-since', None)
>>         strlastmod = httpdate(lastmod.timetuple())
>>         if ifmodsince:
>>             # TODO: We might want to do <= i.s.o. ==
>>             if strlastmod == ifmodsince:
>>                 raise apache.SERVER_RETURN, apache.HTTP_NOT_MODIFIED
>>         req.headers_out.add('Last-Modified', strlastmod)
>>
>>(note to self: Learn to hit "Reply All" instead of just "Reply"
>>-- 
>>Mike Looijmans
>>Philips Natlab / Topic Automation