0

説明するには:

from django.views.generic.base import View
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator

class TestView(View):
    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return HttpResponse('haha')

urls.py は

url(r'^test/', TestView.as_view()),

GET すると表示されますhahaが、POST を実行すると空白のページが表示されます...

ここで何が欠けていますか?

編集:私がやっていることを明確にするために。さまざまな方法で JSON を解析する必要がある JSON ストリーム CURD ビューを作成しています。それらの 1 つは、ビューがビュー内の別のメソッドにディスパッチし、何かを返す特定のパターンを持つ ppl POST データです。しかし、代わりに何も返さないことが判明しました。そこで、最小限の PoC を提示します。私のコードが間違っていたことを教えてください。ティア!

ところで、可能な関連する質問

4

4 に答える 4

5

postそのメソッドを実装する必要があります。クラスベースのビューを参照してください。

from django.http import HttpResponse
from django.views.generic import View

class TestView(View):

    @method_decorator(csrf_exempt)
    def dispatch(self, *args, **kwargs):
        # do something
        return super(TestView, self).dispatch(*args, **kwargs)

    def post(self, request, *args, **kwargs):
       # do somthing

    def get(self, request, *args, **kwargs):
       return HttpResponse('Hello, World!')

dispatch ドキュメントの詳細を参照してください。

デフォルトの実装では、HTTP メソッドを検査し、HTTP メソッドに一致するメソッドへの委譲を試みます。GET は get() に委任され、POST は post() に委任されます。

したがって、以前は上記のロジックを妨害していましたが、呼び出しによりpost メソッドに委任superできます。dispatch

于 2013-03-13T11:44:42.653 に答える
1

これがあなたの質問に実際に答えているわけではないことはわかっていますが、回避策を提供する可能性があります。私が JSON アプリケーションで使用したのは、両方で同じ結果が必要な場合に get メソッドにポストを送信することです。何かのようなもの:

def get(self, request, *args, **kwargs):
    return HttpResponse('Ha!')

def post(self. request, *args, **kwargs):
    return self.get(request, *args, **kwargs)

発送はお任せで。

于 2013-03-17T01:45:36.710 に答える
0

クラスベースのビューを使用する場合の最善のアプローチは、独自のメソッドハンドラーを最初から作成しないことです。代わりに、汎用クラスの1つをベースとして使用し、必要なものを処理するメソッドのみを変更します。たとえば、POSTを介して送信する必要のあるフォームがある場合は、GET要求とPOST要求の両方の応答を処理するベースとしてFormViewを使用する必要があります。

post()オーバーライドやget()メソッド自体は必要ありません。代わりform_valid()に、フォームが送信されたときに何が起こるかを定義するために使用します。

class TestView(FormView):
    form_class = MyForm
    success_url = "/your/return/url/"
    def form_valid(self, form):
        # do something
        return redirect(self.get_success_url())
于 2013-03-14T13:21:00.373 に答える
0

申し訳ありませんが、これはuWSGIとnginxのバグです...

https://stackoverflow.com/a/11115108/41948

誤解を招き、時間を無駄にしてしまい、誠に申し訳ございません。それでも、スタックのどの部分が間違っているかを理解するのにしばらく時間がかかりました.

于 2013-03-18T01:01:56.477 に答える