Как манипулировать объектом отклика в джанго-поршне? - PullRequest
3 голосов
/ 09 сентября 2010

У меня есть некоторый существующий код на python, который использует django-pneon, который возвращает словарь в качестве ответа.Например:

from piston.handler import BaseHandler

class FooHandler(BaseHandler):
    allowed_methods = ('GET',)

    @classmethod
    def create(self, request):
        return { 'foo': 'bar' }

Этот код работает нормально и сериализуется в JSON с соответствующим набором заголовков HTTP (я предполагаю, что это работает с помощью магии поршня с использованием излучателей; для получения бонусных баллов не стесняйтесь уточнитькак это поведение работает, так как я все еще знакомлюсь с django-pneon).

Мне нужно иметь возможность изменять ответ произвольным образом, например, устанавливать заголовки, коды состояния и т. д., не используяпредварительно приготовленный раствор, предназначенный для определенной цели.Есть ли удобный способ получить доступ к объекту ответа в контексте этого кода и манипулировать им, или объект ответа еще не был создан?Для того чтобы получить доступ к объекту ответа, мне нужно будет создать его вручную (по-японски, django), сериализовать словарь, вручную установить соответствующие заголовки и, таким образом, потерять часть полезной магии django-pneon

Ответы [ 3 ]

1 голос
/ 21 июля 2011

Можно установить собственный код ответа, возвращая объект HttpResponse из методов вашего обработчика.

return HttpResponse({'foo': 'bar'}, status=404)

К сожалению, вы не можете установить заголовки таким же образом.Для этого вам нужно написать собственный Emitter, который устанавливает нужные вам заголовки.Что-то в этом роде может работать:

class CustomEmitter(JSONEmitter):
    def render(self, request):
        content = super(CustomEmitter, self).render(request)
        response = HttpResponse(content)
        response['Cache-Control'] = 'max-age=60'

Emitter.register('json', CustomEmitter, 'application/json; charset=utf-8')
1 голос
/ 10 февраля 2011

Каждый метод django-pneon возвращает HTTPResponse.

Когда вы возвращаете этот словарь, django-pneon просто сериализует его и помещает в HTTPResponse, который он создал некоторого разнообразия.

Вроде удивило, что вы не поняли это, учитывая, что эти строки «return rc.CREATED» во всех примерах django-поршня в вики - просто гиперпростые ответы с кодом HTTP и телом ответа. *

Взгляните сюда: https://bitbucket.org/jespern/django-piston/src/c4b2d21db51a/piston/utils.py

в классе rc_factory, который создает множество простых объектов HTTPResponse для использования с Piston.

По крайней мере, вы можете наблюдать, как они это делают, а затем создавать свои собственные.

Но ответ на суть вашего вопроса «могу ли я сделать собственный HTTPResponse» - да, вы можете. Конечно, это то, что веб-серверы делают .

0 голосов
/ 10 февраля 2011

Вы совершенно правы, что django-pneon использует излучатели для сериализации / десериализации запросов и ответов.Вы даже можете зарегистрировать свои собственные излучатели с помощью поршня и использовать их.

Есть несколько способов определить, какой формат должен быть.манипулировать?Могут быть и другие решения, чем просто взломать объект ответа.

...