【问题标题】:How to manipulate the response object in django-piston?如何在 django-piston 中操作响应对象?
【发布时间】:2011-04-10 01:12:12
【问题描述】:

我有一些使用 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 的一些有用魔力?

【问题讨论】:

  • 'create' 不应该是类方法
  • 根据 Piston Wiki:“注意:这些“资源方法”应该使用 @classmethod 装饰器进行装饰,因为它们不会总是收到自身的实例。例如,如果您定义了 UserHandler ,并且您从另一个处理程序返回一个用户,您将不会收到该处理程序的实例,而是 UserHandler。"

标签: django django-piston


【解决方案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”的本质答案是肯定的,您可以。当然,这就是网络服务器所做的

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      您可以通过多种方式确定格式。

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

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

      【讨论】:

      • 好吧,例如,返回带有 Location 标头的 201(已创建资源)状态代码对于 REST API 来说是相当标准的。
      猜你喜欢
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 2020-01-21
      • 2011-01-19
      • 2021-05-10
      相关资源
      最近更新 更多