2013-03-13 121 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) 

發送單獨留下。