基于django类的视图在POST时返回空字符串

时间:2013-03-13 10:58:58

标签: python django post django-views django-class-based-views

要说明:

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流CURD视图,我需要以各种方式解析JSON。其中之一是当ppl POST数据具有某种模式时,视图将调度到视图内的另一个方法并返回一些东西。但结果却没有回报。所以我告诉你最小的PoC。请帮我解决我的代码错误。 TIA!

btw possible related question

4 个答案:

答案 0 :(得分:5)

您需要实施其post方法。请参阅Class based views

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 docs的详情。

  

默认实现将检查HTTP方法并尝试委托给与HTTP方法匹配的方法; GET将被委托给get(),POST到post(),等等。

所以以前你打扰了上面的逻辑,调用super会允许dispatch委托给post方法。

答案 1 :(得分:1)

我知道这并没有真正回答你的问题,但它可能会提供一种解决方法。我在JSON应用程序中使用的是当我想要两者的相同结果时,将帖子发送到get方法。类似的东西:

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

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

单独派遣。

答案 2 :(得分:0)

使用基于类的视图时最好的方法不是从头开始编写自己的方法处理程序;相反,使用其中一个泛型类作为基础,然后只修改处理所需内容的方法。例如,如果您有一个需要通过POST提交的表单,则应使用FormView作为基础,它处理GET和POST请求的响应。

您无需自行覆盖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())

答案 3 :(得分:0)

对不起伙计们,这是uWSGI和nginx中的一个错误...

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

我真的很抱歉因误导你而浪费你的时间。我花了一段时间才弄清楚我的堆栈哪个部分出了问题。