[mod_python] PSP content-type problem

Robert Fendt rmfendt at web.de
Sat Sep 25 18:33:11 EDT 2004


Hi,

I am playing around with mod_python at the moment (partly because I
developed a bit of a dislike for PHP lately). Normally I use XHTML and use
the "Accept:" header information by the UA to determine if it can parse
the document as XML. In that case, it gets the document as
application/xhtml+xml, otherwise (e.g., the IE) as text/html. The code I
use for this in PHP is irrelevant, of course. In mod_python currently I
use this:

-----------------------------
CHARSET = "utf-8"

def index(req):
  xmlctype = 'application/xhtml+xml'
  htmlctype = 'text/html'
  supportsxml = string.count(req.headers_in.get('Accept', ""), xmlctype)

  if (supportsxml):
    ctype = xmlctype
  else:
    ctype = htmlctype
  req.content_type = ctype + '; charset=%s' % CHARSET
-----------------------------

This works quite well, but problems start when I try to include a psp page
template like this:

-----------------------------
  vars = {'usexml': supportsxml,
          'charset': CHARSET}
  page = psp.PSP(req, 'index.psp', vars=vars)
  return page
-----------------------------

Whatever I do, the page is _always_ delivered as "text/html". If I repeat
the content_type assignment inside the psp template, it works, but of
course I do not want to repeat the recognition code in every page
template. A look inside psp.py showed that indeed the content_type is
overwritten. Here:

-----------------------------
    def __str__(self):
        self.req.content_type = 'text/html'
        self.run()
        return ""
-----------------------------

and here:

-----------------------------
def handler(req):

    req.content_type = "text/html"
-----------------------------

I would suggest changing it to what the publisher handler does (if this
does not break anything, but at least it seems to work for me), e.g.:

-----------------------------
    def __str__(self):
        if not self.req._content_type_set:
            self.req.content_type = 'text/html'
        self.run()
        return ""
-----------------------------

One final remark: defining __str__(self) like above is (in my opinion) a
very ugly hack. On trying something like

page=str(psp.PSP(req, 'page.psp'))

I would expect "page" to contain the PSP rendering of 'page.psp' as a
string. What I would not expect, however, is the (attempted) string
conversion causing a direct write to the UA. In fact I tried this while
trying to get the psp class not to rewrite my content-type and was quite
surprised at the result.

Regards,
Robert


More information about the Mod_python mailing list