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

Python 基于django类的视图在POST时返回空字符串,python,django,post,django-views,django-class-based-views,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,

证明:

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')
url.py是

url(r'^test/', TestView.as_view()),
所以,当你得到你可以看到
哈哈
,但当你做文章时,你会看到一个空白页

我错过了什么

编辑:澄清我在做什么。我正在编写一个JSON流CURD视图,我需要以各种方式解析JSON。其中之一是当ppl以某种模式发布数据时,视图将分派到视图中的另一个方法并返回某些内容。但结果却是什么也不返回。因此,我向您展示了最小PoC。请帮我查一下我的代码有什么问题。蒂亚


顺便说一句,您需要实现它的
post
方法。看

有关
调度
的详细信息,请参阅

默认实现将检查HTTP方法并尝试委托给与HTTP方法匹配的方法;GET将被委托给GET(),POST将被委托给POST(),依此类推


因此,之前您干扰了上述逻辑,调用
super
将允许
dispatch
委托给post方法。

您需要实现其
post
方法。看

有关
调度
的详细信息,请参阅

默认实现将检查HTTP方法并尝试委托给与HTTP方法匹配的方法;GET将被委托给GET(),POST将被委托给POST(),依此类推


因此,之前您干扰了上述逻辑,调用
super
将允许
dispatch
委托给post方法。

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

您不需要重写
post()
和/或
get()
方法本身;使用
form\u 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())

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

您不需要重写
post()
和/或
get()
方法本身;使用
form\u 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())

我知道这并不能真正回答你的问题,但它可能提供了一个解决办法。我在JSON应用程序中使用的是,当我希望两者的结果相同时,向get方法发送post。比如:

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

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

我知道这并不能真正回答您的问题,但它可能提供了一个解决方法。我在JSON应用程序中使用的是,当我希望两者的结果相同时,向get方法发送post。比如:

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

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

只剩下调度了。

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


我真的很抱歉误导你,浪费了你的时间。但我还是花了一段时间才弄清楚堆栈的哪一部分出错了。

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


我真的很抱歉误导你,浪费了你的时间。我还是花了一些时间才弄清楚堆栈的哪一部分出错了。

但是我需要重写我自己的调度逻辑,添加
def post
也不起作用。也许我错了,但是直接在
dispatch()
中返回HttpResponse有什么区别?我在我的问题中提供了最低限度的POC。在我的例子中,调度处理的不仅仅是
get
post
,但显然,无论我在HttpResponse中输入什么,它总是返回空正文。尝试在“do something”中返回并发布URL,您将得到空白页。。。我甚至看不出django源代码的原因。但是我需要重写我自己的调度逻辑,添加
def post
也不起作用。也许我错了,但是直接在
dispatch()
中返回HttpResponse有什么区别?我在我的问题中提供了最低限度的POC。在我的例子中,调度处理的不仅仅是
get
post
,但显然,无论我在HttpResponse中输入什么,它总是返回空正文。尝试在“do something”中返回并发布URL,您将得到空白页。。。我甚至看不出django源代码的原因。是的,谢谢,我知道这一点。在我的例子中,上传不是表单,而是纯JSON数据(内容类型是application/JSON),我编写了自己的JSONCURDView,我非常想知道为什么django会返回一个空白页面,因为
dispatch
returned。正如ahsan所说,这可能是因为您已经覆盖了dispatch,所以您的post或get方法永远不会被调用。调用
super
恢复默认行为。嗯,如果我显式返回
disptch()
为什么还要
self.get()
self.post()
?默认行为已经被覆盖。为了更详细地回答这个问题,我们应该深入研究Django代码,但最好遵循应用程序的设计方式,而不是寻找快捷方式。根据我的经验,直接侵入
dispatch
会导致一些不可预测的副作用;我建议您首先尝试用尽所有的标准方法(在本例中,使用处理基于类的视图行为的许多方法中的一些方法),并仅作为最后手段求助于低级更改。您好,我深入研究了Django源代码,仔细研究了每个系统调用,发现这是一个nginx+uWSGi错误。请看下面我的答案。是的,谢谢。我知道这一点。在我的例子中,上传不是一个表单,而是纯JSON数据(内容类型是application/JSON)