Leonidas Tsampros
Leonidas Tsampros

Reputation: 93

Django: Streaming dynamically generated XML output through an HttpResponse

recently I wanted to return through a Django view a dynamically generated XML tree. The module I use for XML manipulation is the usual cElementTree.

I think I tackled what I wanted by doing the following:

def view1(request):
    resp = HttpResponse(g())
    return resp

def g():
     root = Element("ist")
     list_stamp = SubElement(root, "list_timestamp")
     list_creation = str(datetime.now())

     for i in range(1,1000000):
         root.text = str(i)
         yield cET.tostring(root)

Is something like this a good idea ? Do I miss something ?

Upvotes: 4

Views: 3010

Answers (4)

isagalaev
isagalaev

Reputation: 1213

About middlewares "breaking" streaming:

CommonMiddleware will try to consume the whole iterator if you set USE_ETAGS = True in settings. But in modern Django (1.1) there's a better way to do conditional get than CommonMiddleware + ConditionalGetMiddleware -- condition decorator. Use that and your streaming will stream okay :-)

Another thing that will try to consume the iterator is GzipMiddleware. If you want to use it you can avoid gzipping your streaming responses by turning it into a decorator and applying to individual views instead of globally.

Upvotes: 11

Juanjo Conti
Juanjo Conti

Reputation: 30033

Yes. That's THE WAY you do it on Django.

Upvotes: 2

Daniel Roseman
Daniel Roseman

Reputation: 599648

Yes, it's perfectly legitimate to return an iterator in an HttpResponse. As you've discovered, that allows you to stream content to the client.

Upvotes: 2

Paul McMillan
Paul McMillan

Reputation: 20107

Does it work? If it doesn't work, what error does it throw?

If you're building a full-blown API for a django site, take a look at django-piston. It takes care of a lot of the busywork related to that.

http://bitbucket.org/jespern/django-piston/wiki/Home

Upvotes: 2

Related Questions