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 を知る)。

特定の目的のために設計された事前に作成されたソリューションを使用せずに、ヘッダーやステータスコードなどを設定するなど、任意の方法で応答を変更できる必要があります。このコードのコンテキストで応答オブジェクトにアクセスして操作する便利な方法はありますか、または応答オブジェクトがまだ作成されていませんか? 応答オブジェクトにアクセスするには、それを手動で作成し (バニラのジャンゴ風に)、辞書をシリアル化し、適切なヘッダーを手動で設定する必要があります。そのため、django-piston の便利な魔法の一部を失うことになります。 ?

4

3 に答える 3

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 クラスで、Piston で使用するさまざまな単純な HTTPResponse オブジェクトを作成します。

少なくとも、彼らがどのようにそれを行うかを観察してから、自分で作成することができます.

しかし、「カスタム HTTPResponse を作成できますか」という質問の本質に対する答えは、はい、できます。もちろん、それは Web サーバーが行うことです

于 2011-02-10T07:59:28.160 に答える
1

ハンドラー メソッドから 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')
于 2011-07-21T18:04:55.580 に答える
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 に答える