首页 > 解决方案 > 远程服务的 Django 服务,不返回 PATCH 请求的响应

问题描述

我已经在我的带有 Gunicorn 的 Ubuntu 20.04 服务器上部署了一个带有多个 API 的 Django REST 框架服务,一切正常,但是来自服务器外部的 PATCH 请求没有收到响应,尽管应用程序接收到请求并完全处理它。
我什至用 Django runserver 对其进行了测试,但问题仍然存在,与 Gunicorn 无关。
重现步骤:

  1. 在服务器上,我们创建一个新的 Django 应用程序:
ssh to_my@server
python3 -m pip install django
django-admin mytest
cd mytest
python3 manage.py runserver 0.0.0.0:9999
  1. 在尝试向应用程序发送请求的服务器上:
ssh to_my@server
curl --request GET localhost:9999/ # this works fine and we can see the response
curl --request PATCH localhost:9999/ # this works fine too
  1. 在另一台机器上试试这些:
# on my local machine
curl --request GET IP:9999/ # this works fine
curl --request PATCH IP:9999/ # **** this will get a `curl: (56) Recv failure: Connection reset by peer` after some times

尽管在控制台中您可以看到请求已完全收到并且 Django 没有问题,但响应从未到达:

Invalid HTTP_HOST header: '207.154.246.122:9999'. You may need to add '207.154.246.122' to ALLOWED_HOSTS.
Bad Request: /
[02/Nov/2021 11:18:25] "PATCH / HTTP/1.1" 400 62827

请忽略与我们的问题无关的异常。
请注意,这是一个最小部署,我通过 HTTP 而不是 HTTPS 提供服务,并且端口已经打开,我知道我可以使用 PUT 而不是 PATCH 方法,并且我不使用 NGINX 直接转发它。
我的问题是:是什么导致了这种行为?这是操作系统吗?以及如何解决这个问题并从我的 PATCH 请求中接收响应?

标签: pythondjangolinuxubuntu

解决方案


经过一番调查,我发现我能够将补丁请求发送到服务器并接收来自另一台服务器的响应,这意味着我的客户端网络正在阻止来自服务器的响应,当时我使用的是 Irancell 网络,如果您有类似的问题,这是您的 ISP 的问题,如果有必要,您必须与他们联系,最后与这些技术相关的所有内容都运行良好......
但我的问题已经升级为 ISP 怎么样是否能够决定并阻止仅对 Patch 方法的响应?也许我会在另一个问题中问它并稍后在此处添加链接...


推荐阅读