2010-09-09 2 views
3

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

from piston.handler import BaseHandler 

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

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

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

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

+0

«создать» не должно быть classmethod –

+0

Per Поршень Wiki: «NB: Эти„методы ресурса“должны быть украшены @classmethod декоратора, так как они не всегда будут получить экземпляр себя.Например, если у вас определен UserHandler и вы возвращаете пользователя из другого обработчика, вы не получите экземпляр этого обработчика, а скорее UserHandler. » – SK9

ответ

1

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

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

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

Посмотрите здесь: https://bitbucket.org/jespern/django-piston/src/c4b2d21db51a/piston/utils.py

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

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

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

0

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

Существует несколько способов определить, какой формат должен быть.

1. mime-type 
2. <format> in your URL 
3. .json at the end of your URL 

Какие конкретные заголовки вы хотите манипулировать? Там могут быть другие решения, а затем просто взломать объект ответа.

+0

Ну, например, возвращающий код состояния 201 (ресурс, созданный) с помощью Заголовок местоположения является довольно стандартным для REST API. – fuzzyman

1

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

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

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

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') 
Смежные вопросы