【问题标题】:Python/Django: The view xxxxx didn't return an HttpResponse object. It returned None insteadPython/Django:视图 xxxxx 没有返回 HttpResponse 对象。它返回 None 而不是
【发布时间】:2015-09-13 20:38:00
【问题描述】:

我有这样的看法:

def do_some_work(request):
    if request.method == "POST":
        data = request.FILES['some_file']

        I do some work in the file

        dates_people= [list of things]
        maestros = {dict of things}
        talks_count= [same here]

        return render(request, 'wappApp/work.html', context={'dates': dates_people, 'maestros': solo_users,'talks': talks_count})

通过点击模板中的按钮调用此视图

<form  action="{% url "do_some_work" %}" method="POST"     enctype="multipart/form-data">
        <div class="form-group">
            <label for="exampleInputFile">File input</label>
            <input type="file" id="exampleInputFile" name="some_file">
        </div>
        <button type="submit" class="btn btn-default">Submit</button>
 </form>

我得到的是,在选择文件并单击提交后,浏览器页面显示:“此网页不可用”,刷新页面后,我得到:

The view App.views.calculation didn't return an HttpResponse object. It returned None instead.

我尝试调试此视图但无法访问它。

这是该视图的网址:

url(r'^work/$', views.calculation, name='do_some_work'),

知道发生了什么吗?提前谢谢你

编辑

如果我的表单具有 POST 方法并且指向我的视图的“操作”,我不知道为什么返回 NONE 对象

谢谢

** 第二次编辑**

我将唯一的答案标记为正确只是因为我意识到我需要处理 Not POST 请求。

我不断得到 none 对象,因为我不知道为什么表单使用 GET 方法

编辑 3

根据@BriceP 的推荐,我将 {% csrf_token %} 标记添加到我的模板中。现在 POST 方法正在工作。

但显然我上传的文件(.txt 文件)并没有像预期的那样运行。

当我到达这一行“lines = data.split”时,我得到了这个错误:

'InMemoryUploadedFile' object has no attribute 'split'

但如果社区对我提出更多问题有疑问,我会写另一个问题。

谢谢

【问题讨论】:

  • 1) do_some_work 在您的网址中查看 - 它来自哪里?应该改为calculation 吗? 2) 渲染快捷键函数需要 template_name 参数。
  • 对不起@chem1st 是的,你是对的,我改变了你提到的但仍然有同样的问题
  • 再一次,您的do_some_work 视图在哪里?你得到一个 HttpResponse 错误,因为刷新后没有通过 post 发送数据。
  • @chem1st 是的,我改了,对不起。我正在做的是发送一个文件,“计算”视图必须 recibe 该文件,但这没有发生。
  • 如果您的请求不是 POST 请求,视图将返回 None。您需要确保视图始终返回 HttpResponse 对象或抛出异常。

标签: python django


【解决方案1】:

你应该在calculation()的最后加上这个:

return HttpResponseNotAllowed(['POST'])

或重定向到表单页面:

return redirect('your-form-view')

然后,如果您调用该页面,您将输入if 并管理您的数据,或者引发您的异常或进行重定向。

如果没有这个,如果您的 if 未验证,默认行为将返回 None,出于某种原因,您似乎正在发生这种情况。

编辑: 此外,您的表单缺少{% csrf_token %}。但我不知道为什么您没有看到 CSRF 验证错误。也许您正在开发没有debug = True?无论如何,一个视图应该总是返回一个 http 响应,或者重定向到另一个页面,所以即使这些都不是你的答案,你应该管理方法是 GET 的情况。

【讨论】:

  • 404 是为此发送的错误状态。应该是405 Method Not Allowed
  • 你说得对,阿马尔。我用 HttpResponseNotAllowed 编辑了我的答案。谢谢!
猜你喜欢
  • 2017-01-25
  • 2018-09-14
  • 1970-01-01
  • 2018-11-13
  • 2020-07-19
  • 2015-06-26
  • 1970-01-01
  • 2017-12-28
相关资源
最近更新 更多