1

我在 Django 应用程序中有许多视图,它们都返回如下内容:

return HttpResponse(jsonpickle.encode(data, unpicklable=False), 'application/json')

这很好用,但我想在 JSON 编码上创建一个抽象并创建响应对象,这样我就可以做类似的事情

return JsonResponse(data)

班级JsonResponse为我做了所有繁重的工作。

我试过这样的事情:

class JsonResponse(HttpResponse):
    def __init__(self, obj):
        super(HttpResponse, self).__init__(jsonpickle.encode(obj, unpicklable=False), 'application/json')

但是当我拥有它时,我会在A server error occurred. Please contact the administrator.查看网页时获得标准。我还尝试使用 withself作为内部调用的第一个参数,__init__以及使用名为 (contentcontent_type分别) 的参数以及使用和不使用 named的参数status=200。这些变化似乎都没有改变任何东西。

开发服务器的终端输出更具描述性,但不是很多:

Traceback (most recent call last):
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 85, in run
    self.result = application(self.environ, self.start_response)
  File "/usr/local/lib/python2.7/dist-packages/Django-1.5.1-py2.7.egg/django/core/handlers/wsgi.py", line 267, in __call__
    start_response(force_str(status), response_headers)
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 175, in start_response
    assert int(status[:3]),"Status message must begin w/3-digit code"
ValueError: invalid literal for int() with base 10: 'app'
[02/Jun/2013 00:51:06] "GET / HTTP/1.1" 500 59

我知道我可以创建一个返回的方法HttpResponse,如下所示:

def json(obj):
    return HttpResponse(...)

但如果可能的话,我想学习一种按照我最初想象的方式来做这件事的方法——如果没有别的,那就是为了我的学习(而且它似乎也符合我喜欢的 Django 的设计)。

有没有办法让JsonResponse上面的子类工作?如果是这样,我做错了什么?

4

1 回答 1

4

您必须JsonResponse作为 的第一个参数传递super,否则您将调用 的构造函数HttpResponseBase

class JsonResponse(HttpResponse):
    def __init__(self, obj):
        super(JsonResponse, self).__init__(jsonpickle.encode(obj, unpicklable=False), 'application/json')
于 2013-06-01T23:11:22.083 回答