2009-11-05 3 views
4

Недавно я хотел вернуться через представление Django динамически созданного дерева XML. Модуль, который я использую для обработки XML, является обычным cElementTree.Django: потоковое динамическое создание XML-вывода через HttpResponse

Я думаю, что решать, что я хотел, выполнив следующие действия:

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) 

Это что-то вроде это хорошая идея? Я что-то пропустил?

ответ

11

О промежуточных программном «ломать» потоковый:

CommonMiddleware будет пытаться потреблять весь итератор если установить USE_ETAGS = True в настройках. Но в современном Django (1.1) есть лучший способ сделать условный доступ, чем CommonMiddleware + ConditionalGetMiddleware - condition decorator. Используйте это, и ваша потоковая передача будет нормально работать :-)

Еще одна вещь, которая попытается использовать итератор, - GzipMiddleware. Если вы хотите использовать его, вы можете избежать gzipping ваших потоковых ответов, превратив их в декоратора и применяя к отдельным представлениям вместо глобального.

2

Это работает? Если это не сработает, какую ошибку он бросает?

Если вы создаете полномасштабный API для сайта django, взгляните на django-piston. Он заботится о многих связанных с этим работах.

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

+0

Не допускается ошибка. И я думаю, что все работает отлично. Я просто хотел второго мнения. К несчастью, это не спокойная апи. Просто просмотр сериализации тысяч объектов за один раз. –

2

Да, это совершенно законно, чтобы вернуть итератор в HttpResponse. Как вы обнаружили, это позволяет вам передавать контент клиенту.

+0

Я беспокоился о замечании на сайте django-piston, в котором упоминается: * Поддержка Django для потоковой передачи с помощью ConditionalGetMiddleware и CommonMiddleware. Я беспокоюсь о любых невидимых последствиях. –

2

Да. Это ПУТЬ, вы делаете это на Django.

Смежные вопросы