Представление на основе класса 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()),

поэтому при GET вы видите haha, но при выполнении POST вы получаете пустую страницу...

Что мне здесь не хватает?

Изменить: чтобы уточнить, что я делаю. Я пишу представление CURD потока JSON, которое мне нужно для анализа JSON различными способами. Один из них — когда данные ppl POST с определенным шаблоном представление отправит другому методу внутри представления и что-то вернет. Но оказывается, ничего не возвращает. Итак, я представляю вам минимальный PoC. Пожалуйста, помогите мне, что мой код не так. ТИА!

кстати возможный связанный вопрос


person est    schedule 13.03.2013    source источник


Ответы (4)


Вам нужно реализовать его метод 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 и попытается делегировать метод, соответствующий методу HTTP; GET будет делегирован get(), POST — post() и так далее.

Итак, ранее вы нарушали приведенную выше логику, вызов super позволит dispatch делегировать метод post.

person Ahsan    schedule 13.03.2013
comment
Но мне нужно переписать собственную логику отправки, и добавление def post тоже не сработает. - person est; 14.03.2013
comment
Возможно, я ошибаюсь, но какая разница, если напрямую вернуть HttpResponse в dispatch()? Я предоставил минимальный POC в своем вопросе. В моем случае диспетчер обрабатывает больше, чем get или post, но, по-видимому, независимо от того, что я добавляю в HttpResponse, он всегда возвращает пустое тело. - person est; 14.03.2013
comment
Попробуйте вернуться, сделайте что-нибудь и отправьте URL-адрес, вы получите пустую страницу ... и я не могу сказать, почему даже просматривая исходный код django. - person est; 14.03.2013

Я знаю, что на самом деле это не отвечает на ваш вопрос, но может предложить обходной путь. Я использовал в приложениях JSON отправку сообщения методу get, когда мне нужны одинаковые результаты для обоих. Что-то вроде:

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

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

с отправкой оставили в покое.

person Dashdrum    schedule 17.03.2013

Лучший подход при использовании представлений на основе классов — не писать собственные обработчики методов с нуля; вместо этого используйте один из универсальных классов в качестве основы, а затем измените только те методы, которые обрабатывают то, что вам нужно. Например, если у вас есть форма, которую нужно отправить через 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())
person Berislav Lopac    schedule 14.03.2013
comment
Да спасибо я в курсе. В моем случае загрузка — это не форма, а чистые данные JSON (тип CONtent — это application/json), я написал свой собственный JSONCURDView, мне очень нужно знать, почему django возвращает пустую страницу с учетом dispatch. - person est; 14.03.2013
comment
Как сказал Ахсан, это, вероятно, потому, что вы переопределили отправку, поэтому ваши методы post или get никогда не вызываются. Позвоните super, как он это сделал, чтобы восстановить поведение по умолчанию. - person Berislav Lopac; 14.03.2013
comment
Хм, если я явно вернусь в disptch(), зачем нам снова нужны self.get() или self.post()? Поведение по умолчанию уже изменено. - person est; 15.03.2013
comment
Чтобы ответить на этот вопрос более подробно, мы должны копаться в коде Django, но всегда лучше следовать тому, как разработано приложение, а не искать ярлыки. По моему опыту, взлом непосредственно dispatch может привести к некоторым непредсказуемым побочным эффектам; Я бы порекомендовал вам сначала попробовать исчерпать все стандартные подходы (в данном случае, используя некоторые из многих методов, которые обрабатывают поведение представления на основе классов) и прибегать к низкоуровневым изменениям только в крайнем случае. - person Berislav Lopac; 15.03.2013
comment
Привет, я покопался в исходниках Django и отследил каждый системный вызов и обнаружил, что это ошибка nginx+uWSGi. Смотрите мои ответы ниже. - person est; 18.03.2013

Извините, ребята, это ошибка в uWSGI и nginx...

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

Мне очень жаль тратить ваше время, вводя вас в заблуждение. И все же мне потребовалось некоторое время, чтобы понять, какая часть моего стека пошла не так.

person est    schedule 18.03.2013