Martin Aspeli wrote:
> Derek Broughton wrote:
>> 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"
>
> That's kind of irrelevant. Zope sets the Content-Type header.
Well, I know that _now_ - but it came from some hints on one of the Zope
lists that, at least at one time, that would work.
>
>> - setting an attribute "content_type = 'text/xml'" in the view class
>
> Don't know why you think that would work. Nothing I know of would look
> for it. :)
For the same reason I tried renaming the view name to Text.xml - and for the
record, I'm pretty sure I'm on the right track.
>
>> - the examples from you and David
>
> My example definitely works. You can see it in action in
> plone.namedfile's @@download view for example.
>
>> - 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.
>
> Why don't you try without the charset first, just to test a simpler
> header value?
>
>> 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...
>
> I'm sure it is, but that's not what controls the Content-Type header
> that is sent back to the browser. That header is set by setBody() in
> ZPublisher.HTTPResponse::
No, I really don't care what content type header is sent back - I suspect
text/html for the content type might work, but that's well beyond my current
problem. My problem is that TAL, not my browser, is treating the template
as HTML rather than XML and therefore lowercases all the tags (using
HTMLParser.py).
A little debugging shows me that the problem is in using the viewlet. My
main view template, Text.pt, starts with <?xml... and is treated as XML. My
viewlet, _cannot_ start with <?xml (generates an error "XML Parsing Error:
XML or text declaration not at start of entity" if I add it).
I put some prints in Products/PageTemplates/PageTemplateFile.py:
def sniff_type(text):
print __name__, 'sniff', text
if text.startswith('<mcp:MD_Meta'):
raise
for prefix in XML_PREFIXES:
if text.startswith(prefix):
return "text/xml"
return None
and find that I get two prints:
Products.PageTemplates.PageTemplateFile sniff <?xml versio
Products.PageTemplates.PageTemplateFile sniff <mcp:MD_Meta
The first is from Text.pt - which is recognized as xml - and the second is
the first line of the viewlet template, and gets treated as html.
I traced back that call, and found in _exec():
if not response.headers.has_key('content-type'):
response.setHeader('content-type', self.content_type)
so, yes, really, content_type should be settable in the view, somewhere, and
pulling out all my other code changes it seems that it _does_ work for the
_View_, but not for the _Viewlet_. The only thing that actually seems to
set "text/xml" for the viewlet is that "sniff_type()" call and afaict it
can't possibly be right - surely the type of a viewlet must always be the
type of it's parent view?
Meanwhile, I haven't found anything that will work for a viewlet, so for
now, I'm going to just pull it out and duplicate the code in the two View
templates that were using it.
--
derek
_______________________________________________
Product-Developers mailing list
[email protected]
http://lists.plone.org/mailman/listinfo/product-developers