Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django: Streaming dynamically generated XML output through an HttpResponse

Tags:

python

xml

django

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 ?

like image 294
Leonidas Tsampros Avatar asked Dec 04 '22 14:12

Leonidas Tsampros


2 Answers

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.

like image 159
isagalaev Avatar answered Jan 28 '23 13:01

isagalaev


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

like image 37
Paul McMillan Avatar answered Jan 28 '23 13:01

Paul McMillan