Django类视图在POST时返回空字符串

0 投票
4 回答
4205 浏览
提问于 2025-04-17 18:55

为了演示:

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。其中一种情况是,当有人用特定格式 POST 数据时,这个视图会调用视图内部的另一个方法并返回一些内容。但结果却什么都没返回。所以我给你们展示了一个最小的示例。请帮我看看我的代码哪里出问题了。谢谢!

顺便提一下 可能相关的问题

4 个回答

1

我知道这并没有直接回答你的问题,但可能会提供一个解决办法。在我使用JSON的应用中,当我想要通过get方法和post方法得到相同的结果时,我会把post请求发送到get方法。大概是这样的:

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

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

这样就可以不动dispatch了。

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请求的方法,然后尝试调用一个与这个方法匹配的函数;比如,GET请求会调用get(),POST请求会调用post(),依此类推。

所以之前你打乱了这个逻辑,调用 super 可以让 dispatch 正常调用post方法。

0

抱歉大家,这是uWSGI和nginx中的一个错误...

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

我真的很抱歉让你们浪费时间,因为我之前给你们带来了误导。其实我也花了一段时间才弄清楚我的技术栈中哪个部分出了问题。

撰写回答