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.しかし、私がそれを持っているとき、私はウェブページを見るときに標準を取得します. またself、 への内部呼び出しの最初の引数として、__init__(contentおよびcontent_typeそれぞれ) という名前の引数を使用して、および名前付きの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(...)

しかし、可能であれば、最初に想像した方法でこれを行う方法を学びたいと思います-それ以外の場合は、私の学習のために.

上記のようなサブクラスを機能させる方法はあり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 に答える