如何操纵django-piston中的响应对象?

时间:2010-09-09 01:47:23

标签: django django-piston

我有一些使用django-piston的现有python代码,它返回一个字典作为它的响应。例如:

from piston.handler import BaseHandler

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

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

此代码工作正常,并使用适当的HTTP标头集序列化为JSON(我假设这可以通过一些涉及发射器的活塞魔法来实现;对于奖励积分,请随时澄清这种行为是如何工作的,因为我我还是要了解django-piston)。

我需要能够以任意方式修改响应,例如设置标题,状态代码等,而不使用为特定目的设计的某些预先烘焙的解决方案。是否有方便的方法在此代码的上下文中访问响应对象并对其进行操作,或者尚未创建响应对象?为了获得对响应对象的访问,我是否必须手动构建它(la vanilla django),序列化字典,并手动设置相应的标题,从而失去django-piston的一些有用魔法?

3 个答案:

答案 0 :(得分:1)

每个django-piston方法都返回一个HTTPResponse。

当你返回那个字典时,django-piston只是将它序列化并将它粘贴在一个多种多样的HTTPResponse中。

鉴于wiki中所有django-piston示例中的“返回rc.CREATED”行只是使用HTTP代码和响应正文的超简单响应,你有点意外没有接受。

看看这里:https://bitbucket.org/jespern/django-piston/src/c4b2d21db51a/piston/utils.py

在rc_factory类中,它创建了各种用于活塞的简单HTTPResponse对象。

至少你可以观察他们是如何做到的,然后自己制作。

但问题的本质答案“我可以制作自定义HTTPResponse”是肯定的,你可以。当然,这就是网络服务器做的事情

答案 1 :(得分: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')

答案 2 :(得分:0)

django-piston使用发射器序列化/反序列化请求和响应,这是对的。您甚至可以使用活塞注册自己的发射器并使用它们。

有几种方法可以确定格式应该是什么。

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

您想要操作哪些特定标题?可能还有其他解决方案只是在攻击对象。