Django-fr

Forum

#1 21-01-2011 14:50:58

Tonton
Membre
Inscription : 20-09-2010
Messages : 75

serializer

Bonjour

alors pour ma question du jour wink

je trouve d'exemple de methode qui serialize avec un return ..  alors je
comprend pas comment ça s'utilise du coup

def listCharettes(request):

    json_serializer = serializers.get_serializer("json")()
    json_serializer.serialize(Charette.objects.all(), ensure_ascii=False,
stream=response)

là je serai enclin a faire un return response


on trouve aussi
    out= open("file.xml","w")   et stream=out)

ça je lit la doc mais c'est confu sad

Si c'est plus clair pour quelqu'un ?
Merci de votre aide

tonton

Hors ligne

#2 21-01-2011 15:37:30

Tonton
Membre
Inscription : 20-09-2010
Messages : 75

Re : serializer

bon j'ai fait

def listCharettes(request):

    json_serializer = serializers.get_serializer("json")()
json_serializer.serialize(Charette.objects.all(), ensure_ascii=False)
    return render_to_response('list.xml', {'umlist':data})

et dans list.xml
{% for UM in umlist %}
{{UM}}
    {% endfor %}

par contre je sais pas si c'est tres othodoxique
ça semble plutot coder avec des moufles ...


On Fri, Jan 21, 2011 at 2:50 PM, Tonton <to.tonton _AT_ gmail.com> wrote:

> Bonjour
>
> alors pour ma question du jour wink
>
> je trouve d'exemple de methode qui serialize avec un return ..  alors je
> comprend pas comment ça s'utilise du coup
>
> def listCharettes(request):
>
>     json_serializer = serializers.get_serializer("json")()
>     json_serializer.serialize(Charette.objects.all(), ensure_ascii=False,
> stream=response)
>
> là je serai enclin a faire un return response
>
>
> on trouve aussi
>     out= open("file.xml","w")   et stream=out)
>
> ça je lit la doc mais c'est confu sad
>
> Si c'est plus clair pour quelqu'un ?
> Merci de votre aide
>
> tonton
>
>

Hors ligne

#3 21-01-2011 15:52:37

quinode
Membre
Lieu : Auvergne
Inscription : 14-10-2010
Messages : 89
Site Web

Re : serializer

bien compliqué tout ça
j'ai trouvé ça de mon coté:
"json.dumps"  renvoie les valeurs d'un dictionnaire "dict" nommé "ajax_response" bien formaté et tout, pas besoin de template

return HttpResponse(json.dumps(ajax_response), mimetype="application/json")

Hors ligne

#4 21-01-2011 16:01:16

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : serializer

Salut,

> def listCharettes(request):
>     json_serializer = serializers.get_serializer("json")()
> json_serializer.serialize(Charette.objects.all(), ensure_ascii=False)
>     return render_to_response('list.xml', {'umlist':data})
>
> et dans list.xml
> {% for UM in umlist %}
> {{UM}}
>     {% endfor %}
(ton exemple est étrange, tu sérialize en json et tu renvoi un truc xml)

Bon effectivement c'est pas très orthodoxe parce que là tu va renvoyer ton xml
dans une réponse avec un mime type 'html'. En général pour les réponses à
faire en autre chose que du html, on passe par HttpResponse pour lui spécifier
le mime type à déclarer.

HttpResponse ça renvoi du plain/text, essaye de faire une vue avec un "return
HttpResponse('Hello World')" tu verras.

Y'a plusieurs techniques, mais pour tes objets sérializés il faut de toute
facon spécifier un mime type correct sinon tu va avoir des problèmes les
clients qui vont accéder à ta ressources.

À savoir que ce que renvoi les sérializer possèdent toujours une version
__str__ ce qui permet de le passer directement à un httpresponse mais ce
dernier ne peut détecter tout seul ton mime type.

Quelques exemples de code pour te faciliter la vie, bidouille les à ta
convenance et selon tes besoins.

Pour du XML par exemple :

def render_to_xml_response(*args, **kwargs):
    """
    Fonctions gruik reprise du code de Django modifiée pour envoyer du vrai xml
    tout en utilisant l'idiome render_to_response
    Nécessite les memes arguments que l'original.
    """
    return HttpResponse(loader.render_to_string(*args, **kwargs),
mimetype="text/xml")

# Wrapper de HttpResponse pour renvoyer un backend XML
class XMLResponse(HttpResponse):
    def __init__(self, xml_string):
        self.original_obj = xml_string
        HttpResponse.__init__(self, xml_string, mimetype='application/xml')

Pour du JSON :

class JSONResponse(HttpResponse):
    """
    Surcharge de l'objet ``django.http.HttpResponse`` pour renvoyer un backend
JSON aux
    normes
    """
    def __init__(self, obj, signal=False):
        self.original_obj = obj
        self.response_signal = signal
        HttpResponse.__init__(self, self.serialize())
        self["Content-Type"] = "text/javascript; charset=utf-8"
        if nocache:
            self['Pragma'] = "no-cache"
            self['Cache-Control'] = "no-cache, must-revalidate, max-age=0"

    def serialize(self):
        data = simplejson.dumps(self.original_obj, ensure_ascii=False)
        signal = simplejson.dumps(self.response_signal, ensure_ascii=False)
        return('{"%s": %s, "%s": %s}' % ('data', data, 'signal', signal ))


> >     out= open("file.xml","w")   et stream=out)
> >
> > ça je lit la doc mais c'est confu sad
stream=out ça sert à renvoyer le contenu directement généré à ton pointeur de
fichier (ou même un StringIO), de cette façon cela écrit directement le contenu
dans ce pointeur que tu peux te servir à ta guise (en faire un fichier,
retraiter la chaîne si c'était un objet StringIO, etc..).

Certaines API procède comme ça pour te permettre de gérer directement la façon
dont tu va exploiter le contenu à générer, tu lui passes ton objet qui
implémente les méthodes d'un objet "file" (comme StringIO le fait), il le
remplit et à la fin du processus tu l'exploites. Au lieu d'avoir une méthode
dédié à l'écriture d'un fichier ou bien à une sortie en 'string'.

> On Fri, Jan 21, 2011 at 2:50 PM, Tonton <to.tonton _AT_ gmail.com> wrote:
> > Bonjour
> >
> > alors pour ma question du jour wink
> >
> > je trouve d'exemple de methode qui serialize avec un return ..  alors je
> > comprend pas comment ça s'utilise du coup
> >
> > def listCharettes(request):
> >     json_serializer = serializers.get_serializer("json")()
> >     json_serializer.serialize(Charette.objects.all(), ensure_ascii=False,
> >
> > stream=response)
> >
> > là je serai enclin a faire un return response
> >
> >
> > on trouve aussi
> >
> >     out= open("file.xml","w")   et stream=out)
> >
> > ça je lit la doc mais c'est confu sad
> >
> > Si c'est plus clair pour quelqu'un ?
> > Merci de votre aide
> >
> > tonton

Hors ligne

Pied de page des forums