如何操作django活塞中的响应对象?

如何操作django活塞中的响应对象?,django,django-piston,Django,Django Piston,我有一些使用django活塞的现有python代码,它返回一个字典作为响应。例如: from piston.handler import BaseHandler class FooHandler(BaseHandler): allowed_methods = ('GET',) @classmethod def create(self, request): return { 'foo': 'bar' } 这段代码运行良好,并通过适当的HTTP头集序列化

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

from piston.handler import BaseHandler

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

    @classmethod
    def create(self, request):
        return { 'foo': 'bar' }
这段代码运行良好,并通过适当的HTTP头集序列化为JSON(我假设这是由一些涉及发射器的活塞魔法实现的;为了获得额外的分数,请随时澄清此行为是如何工作的,因为我仍在了解django活塞)


我需要能够以任意方式修改响应,例如设置标题、状态代码等,而无需使用为特定目的设计的预烘焙解决方案。是否有一种方便的方法来访问此代码上下文中的响应对象并对其进行操作,或者尚未创建响应对象?为了访问响应对象,我必须手动构造它(一个普通的django),序列化字典,手动设置适当的头,从而失去django活塞的一些有用的魔力吗?

每个django活塞方法都返回一个HTTPResponse

当您返回字典时,django活塞只是将其序列化,并将其粘贴到它精心编制的某种HTTPResponse中

考虑到维基中所有django活塞示例中的那些“return rc.CREATED”行都是带有HTTP代码和响应体的超简单响应,您没有意识到这一点有点奇怪

请看这里:

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

至少你可以观察他们是怎么做的,然后自己制作


但是,对于您的问题“我可以定制一个HTTPResponse吗”的本质,答案是肯定的,您可以。当然,web服务器就是这样做的。

django活塞使用发射器对请求和响应进行序列化/反序列化,这是非常正确的。你们甚至可以注册你们自己的发射器和活塞,并让它使用这些

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

1. mime-type
2. <format> in your URL
3. .json at the end of your URL
1。mime类型
2.在您的URL中
3.URL末尾的json

您想要操纵哪些特定的标题?可能还有其他的解决方案,然后只是对响应对象进行黑客攻击。

可以通过从处理程序方法返回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')

“create”不应该是一个classmethodPer the活塞Wiki:“NB:this”资源方法“应该用@classmethod decorator修饰,因为它们并不总是接收自身的实例。例如,如果您定义了一个UserHandler,并且您从另一个处理程序返回了一个用户,那么您将不会收到该处理程序的实例,而是收到UserHandler。”例如,返回带有位置头的201(资源创建)状态码对于RESTAPI来说是相当标准的。