[Product-Developers] Re: Setting a mime-type on a Zope 3 browser view

Derek Broughton derek at pointerstop.ca
Sat Jan 23 16:31:02 UTC 2010


Martin Aspeli wrote:

> David Glick wrote:
>> Derek Broughton wrote:
>>> I have a couple of browser views that are trying to render XML and
>>> getting bitten by the "bug" of
>>> https://bugs.launchpad.net/zope2/+bug/142801
>>>
>>> I realize this isn't really a bug, but how DOES one set a mime-type on a
>>> browser view?  There doesn't seem to be anything in the ZCML<view>
>>> definition.  Because the ISO 19139 xml tags I'm trying to use are mixed
>>> case, but the template is being processed as text/html, the mixed-case
>>> tags below are being rendered in lowercase - and then my xsl stylesheet
>>> doesn't
>>> work.  If I put the<?xml-stylesheet?>  tag into the viewlet, it would
>>> probably actually look like it worked, but the raw XML would still be
>>> wrong, since those tags really are mixed-case.
>>>
>>> My view template is simply:
>>>    <?xml version="1.0" encoding="iso-8859-1" ?>
>>>    <?xml-stylesheet type="text/xsl" href="++resource++ISO2text.xsl" ?>
>>>      <div tal:replace="structure provider:MetadataViewlets"
>>>        xmlns:tal="http://xml.zope.org/namespaces/tal"
>>>      />
>>>
>>> while the code included by the viewlet manager starts:
>>>
>>>    <mcp:MD_Metadata
>>>        xmlns:ns1="http://www.opengis.net/gml/"
>>>        xmlns:tal="http://xml.zope.org/namespaces/tal"
>>>        xmlns:xlink="http://www.w3.org/1999/xlink"
>>>        xmlns:mcp="http://bluenet3.antcrc.utas.edu.au/mcp"
>>>        xmlns:gco="http://www.isotc211.org/2005/gco"
>>>        xmlns:gmd="http://www.isotc211.org/2005/gmd"
>>>        xmlns:srv="http://www.isotc211.org/2005/srv"
>>>        xmlns:gts="http://www.isotc211.org/2005/gts"
>>> gco:isoType="gmd:MD_Metadata">
>>>      <gmd:fileIdentifier>
>>>          <gco:CharacterString tal:content="context/id" />
>>>      </gmd:fileIdentifier>
>>> ...
>>>
>> You probably need to set the Content-Type HTTP header in the
>> response...here's an example from
>> 
http://svn.plone.org/svn/plone/Plone/branches/3.3/Products/CMFPlone/skins/plone_templates/rss_template.pt
>> --
>>
>> <metal:block tal:define="dummy
>> python:request.RESPONSE.setHeader('Content-Type',
>> 'text/xml;;charset='+context.plone_utils.getSiteEncoding())" />
> 
> Instead of doing this in the template, I'd do it in the view itself. e.g.:
> 
> class MyView(object):
>      def __init__(self, context, request):
>          self.context = context
>          self.request = request
>      def __call__(self):
>          self.request.response.setHeader('Content-Type',
> 'text/xml;;charset="utf-8"')
>          return self.index() # render template associated in ZCML
> 
> (You can look up the site encoding if you'd like, but it's going to be
> utf-8 in virtually all situations. After speaking to Hanno about this
> I've made the utf-8 assumption explicit in my code most of the time.)

That makes more sense than setting it in the template - at least we have a 
content-type before the TAL markup is rendered.  Unfortunately, it doesn't 
work either.  I have tried:
- setting the View name to "Text.xml"
- setting an attribute "content_type = 'text/xml'" in the view class
- the examples from you and David
- your example omitting the second, I believe extraneous, ';' in   
  'text/xml;;charset="utf-8"' and/or omitting the __init__() (that's just 
  the default method, is it not?)
all with no success.

Is it possible to explicitly invoke the TAL XML parser in the "self.index()" 
call above, rather than the HTML parser?  I guess it must be...
-- 
derek





More information about the Product-Developers mailing list