Просмотр app.views.model не вернул объект HttpResponse

#python #django

#python #django

Вопрос:

Это мой views.py досье. я нахожусь на пути к созданию XML-файла, данных, которые я получаю от mysql. В первый раз он работает, но я вношу некоторые изменения, после чего не могу вспомнить, что я сделал, теперь он не работает…

в views.py

 def MessageHeaderModel2(request):
    if request.method == "POST":
            form = MessageHeaderForm(request.POST)
                    if form.is_valid():
                            DDEX_Party_Id = request.POST.get('DDEX_Party_Id',None)
                            data = serializers.serialize("xml", MessageHeaderModel2.objects.all())
                            with open("file.xml", "w") as out:
                            xml_serializer.serialize(MessageHeaderModel2.obj    ects.all(), stream=out)
 

Ошибка, которую я получаю, такова

 >Exception Type:ValueError
Exception Value:The view app.views.MessageHeaderModel2 didn't return an HttpResponse object.
 

Ответ №1:

Как указано в ошибке, ваше представление не отправляет никакого ответа клиенту.

Добавьте в конце вашего представления строку типа :

 return render(request, 'template.html')
 

Или любой другой ответ, который вам нужен

Комментарии:

1. должен ли я предоставить return render (запрос,’file.xml ‘)..?

Ответ №2:

На самом деле вы не возвращаете HttpResponse объект!

Представления Django должны возвращать экземпляр HttpResponse so в конце вашего представления:

 from django.http import HttpResponse

def view(request):
    ...
    return HttpResponse("the page content")
 

Вы также можете вернуть другие подклассы HttpResponse , список см. В документации.

Вы также можете использовать некоторые функции быстрого доступа для отображения страницы с использованием системы шаблонов django, опять же, документация здесь полезна, но кратко:

 from django.shortcuts import render_to_response

def view(request):
    ...
    return render_to_response('my_template.html',
                              my_data_dictionary,
                              context_instance=RequestContext(request))
 

Полный пример с использованием вашего кода из приведенного выше:

 def view(request):
    if request.method == "POST":
        form = MessageHeaderForm(request.POST)
        if form.is_valid():
            DDEX_Party_Id = request.POST.get('DDEX_Party_Id',None)
            data = serializers.serialize("xml", MessageHeaderModel2.objects.all())
            with open("file.xml", "w") as out:
                out.write(data)
            return HttpResponse(data)
        else:
            # return error response?
    return HttpResponseNotAllowed(['POST'])
 

Комментарии:

1. я дал как return HttpResponse(«file.xml «) .. Тогда также не работает та же ошибка

2. Вы должны возвращать HttpResponse по всем путям кода. Я предполагаю, что вы возвращаете его только тогда, когда request.method == "POST" ? Если страница предназначена только для приема запросов POST, вы можете return HttpResponseNotAllowed(['POST']) после вашего if блока.

3. Если вы хотите вернуть содержимое вашего сгенерированного XML, то вы вообще не хотите сохранять его в файл.

4. Вы хотите сохранить его, а также вернуть в браузер?

5. Смотрите мое редактирование, но я, с какой стати вы хотите это сделать?

Ответ №3:

Вы ничего не возвращаете, поэтому у вас такая ошибка…

Вы также можете, например, вернуть значение успеха или перенаправить на другое представление..