3

我有一些使用 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)。

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

4

3 回答 3

1

可以通过从处理程序方法返回 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')
于 2011-07-21T18:04:55.580 回答
1

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

当您返回该字典时,django-piston 只是将其序列化并将其粘贴在它精心制作的各种 HTTPResponse 中。

考虑到 wiki 中所有 django-piston 示例中的那些“return rc.CREATED”行只是带有 HTTP 代码和响应主体的超简单响应,您没有注意到这一点有点惊讶。

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

在 rc_factory 类中,该类创建各种简单的 HTTPResponse 对象以供 Piston 使用。

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

但是,您的问题“我可以制作自定义 HTTPResponse”的本质答案是肯定的,您可以。当然,这就是 Web 服务器所做的。

于 2011-02-10T07:59:28.160 回答
0

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

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

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

您要操作哪些特定的标头?可能还有其他解决方案,然后只是破解响应对象。

于 2011-02-10T08:54:36.610 回答