2013-03-13 56 views
0

在于向世人证明:Django的基于类的视图返回空字符串时,POST

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()), 

所以当让你可以看到haha,但这样做POST,当你得到一个空白页...

我在这里错过了什么?

编辑:澄清我在做什么。我正在写一个JSON流CURD视图,我需要以各种方式解析JSON。其中之一就是当某些模式的数据发布数据时,视图会派发到视图内的另一个方法并返回一些内容。但事实证明,它没有任何回报。所以我向你展示最小的PoC。请帮助我什么我的代码文泰错了。 TIA!

BTW possible related question

回答

0

对不起球员,这是uWSGI和nginx的一个bug ......

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

我感谢你误导浪费你的时间真的很抱歉。然后,我花了一段时间来确定我的堆栈哪部分出了问题。

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!') 

查看更多的dispatchdocs

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

所以以前你被扰乱上面的逻辑,调用super将使dispatch委托给POST方法。

+0

但我需要重写我自己的调度逻辑,并添加'def post'也不起作用。 – est 2013-03-14 04:24:42

+0

@est查看最新的答案! – Ahsan 2013-03-14 07:39:24

+0

也许我错了,但是直接在'dispatch()'中返回HttpResponse有什么区别?我在我的问题中提供了最小的POC。在我的例子中,dispatch处理的不仅仅是'get'或'post',但显然无论我放入HttpResponse中它总是返回空主体。 – est 2013-03-14 07:52:17

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()) 
+0

是的,谢谢我知道这一点。在我的情况下,上传不是表单,而是纯JSON数据(COntent-Type是application/json),我写了我自己的JSONCURDView,非常需要知道为什么django返回一个给出'dispatch'的空白页面。 – est 2013-03-14 14:38:00

+0

正如ahsan所说,这可能是因为你已经重写了调度,所以你的post或get方法从不会被调用。像他一样调用'super'来恢复默认行为。 – 2013-03-14 16:49:45

+0

嗯,如果我明确地返回'disptch()'为什么我们需要'self.get()'或'self.post()'?默认行为已被覆盖。 – est 2013-03-15 00:41:28

1

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

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

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

发送单独留下。