Django Piston: определить приоритет возвращаемых элементов - PullRequest
2 голосов
/ 15 июня 2011

Давайте возьмем этот пример:

url(r'^test[/]$', test_handler, { 'emitter_format': 'xml' }),

Со следующим обработчиком:

class testHandler(BaseHandler):
    allowed_methods = ('GET',)
    def read(self, request):
        return {'element': 'I want to be first', 'test': 'No way', }

Результат при вызове API будет:

Content-Type: text/xml; charset=utf-8
<?xml version="1.0" encoding="utf-8"?>
<response><test>No way</test><element>I want to be first</element></response>

Iне хотите получать «Нет пути», так как определить приоритет порядка для возвращаемых элементов?

1 Ответ

0 голосов
/ 17 июня 2011

Я нашел ответ, создав собственный эмиттер:

class CustomXmlEmitter(Emitter):
    def _to_xml(self, xml, data):
        if isinstance(data, (list, tuple)):            
            for item in data:
                self._to_xml(xml, item)
        elif isinstance(data, dict):
            for key, value in data.iteritems():
                xml.startElement(key, {})
                self._to_xml(xml, value)
                xml.endElement(key)
        else:
            xml.characters(smart_unicode(data))

    def render(self, request):
        stream = StringIO.StringIO()
        xml = SimplerXMLGenerator(stream, "utf-8")
        xml.startDocument()
        xml.startElement("response", {})
        self._to_xml(xml, self.construct())
        xml.endElement("response")
        xml.endDocument()
        return stream.getvalue()
Emitter.register('custom_xml', CustomXmlEmitter, 'text/xml; charset=utf-8')
Mimer.register(lambda *a: None, ('text/xml',))

и вернул вложенный элемент следующим образом:

return [{'element': 'I want to be first'}, {'test': 'No way', }]
...