2011-06-15 2 views
2

Prenons cet exemple:Django à piston: Définir la priorité des éléments retournés

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

Avec le gestionnaire suivant:

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

Le résultat lors de l'appel de l'API sera:

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> 

Je ne veux pas obtenir le 'No way' en premier lieu, alors comment définir une priorité de commande sur les éléments retournés?

+0

donc poster ci-dessous. –

+0

J'aimerais connaître votre solution. veuillez l'afficher comme réponse – vikingosegundo

Répondre

0

J'ai trouvé une réponse en créant ma propre Emitter:

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',)) 

et retourner l'élément imbriqué de cette façon:

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