AJAX POST - 我需要发送回复吗?

AJAX POST - do I need to send a response?

我编写了一个 AJAX 函数,它向我的服务器发送 POST 请求(运行 Django 1.9)。

请求应该在服务器上触发一个进程——不需要客户端做任何事情。因此,我没有在我的视图的 post 方法中添加 return

但是,在我的服务器的输出中,我发现了一些关于此的错误消息:

Internal Server Error: <url>
Traceback (most recent call last):  
  File "/.../python3.5/site-packages/django/core/handlers/base.py", line 158, in get_response  
    % (callback.__module__, view_name))  
ValueError: The view <view> didn't return an HttpResponse object. It returned None instead.  
ERROR:django.request:Internal Server Error: <url>  
Traceback (most recent call last):  
  File "/.../python3.5/site-packages/django/core/handlers/base.py", line 158, in get_response  
    % (callback.__module__, view_name))  
ValueError: The view <view> didn't return an HttpResponse object. It returned None instead.  
[01/Feb/2016 00:30:28] "POST <url> HTTP/1.1" 500 14165

因此我添加了

return HttpResponse('')

方法。

但是,这对我来说似乎有点过时了。

您所做的是在向服务器发送请求后处理客户端 "not needing anything" 的正确方法。

但是,您通常希望为客户提供某种成功 message/action,无论多么简单,只是为了使它对用户友好。当用户按下按钮并且看起来没有任何反应时,这可能会让用户感到困惑。同样,当出现问题时,他们应该收到一条错误消息,这样他们就可以比什么都没有发生时更快地判断出问题(并因此告诉您)。

没有必要对任何请求发送任何响应。您可以关闭连接,但是...

  • django 将抛出一个错误,表明您没有发送任何响应(即使是空响应)
  • HTTP 服务器(nginx、apache 或其他服务器)期望您发送任何内容(这是 django 发送错误响应的原因之一)
  • 您的 JavaScript 会将请求视为失败请求

您可以发送的最小回复是:

HTTP/1.1 204 No content

注意上面一个后面应该有一个空行(但是markdown不会让我在代码块的末尾输入空行)。您可以使用以下方式在 django 中发送:

return HttpResponse(status=204)

但 django 会抛出一些 headers。你可以摆脱它们,但这毫无意义...