【问题标题】:Python Django Errno 54 'Connection reset by peer'Python Django Errno 54 '连接由对等方重置'
【发布时间】:2019-12-07 05:13:50
【问题描述】:

在调试时遇到了一些麻烦。当我第一次启动我的应用程序时,我总是收到此错误,然后间歇性地出现此错误。有人可以通过抛出一些调试技术来帮助我吗?我试过使用代理检查员 - 无济于事,我没有看到任何有用的东西。我已经尝试过在我的 django 设置中设置我的 SITE_URL 的建议。我尝试过使用和不使用 http:// 使用和不使用端口...这是无用的错误:

Exception happened during processing of request from ('127.0.0.1', 57917)
Traceback (most recent call last):
  File "/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socketserver.py", line 650, in process_request_thread
    self.finish_request(request, client_address)
  File "/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socketserver.py", line 360, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socketserver.py", line 720, in __init__
    self.handle()
  File "/Users/ryan/.local/share/virtualenvs/portal-2PUjdB8V/lib/python3.7/site-packages/django/core/servers/basehttp.py", line 171, in handle
    self.handle_one_request()
  File "/Users/ryan/.local/share/virtualenvs/portal-2PUjdB8V/lib/python3.7/site-packages/django/core/servers/basehttp.py", line 179, in handle_one_request
    self.raw_requestline = self.rfile.readline(65537)
  File "/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socket.py", line 589, in readinto
    return self._sock.recv_into(b)
ConnectionResetError: [Errno 54] Connection reset by peer

即使重置此连接,该应用程序似乎也能正常运行,但它让我疯狂地尝试调试。

【问题讨论】:

    标签: python django sockets


    【解决方案1】:

    如果网站图标是 .png 格式而不是 .ico 格式,则会看到相同的行为。

    此外,与在其他网站上看到的建议相反,将 Python 降级到 v3.6 并不能解决问题。 screenshot of error w. png favicon

    似乎是 Django 问题,它可能会在未来的 Django 版本中永久修复。

    https://bugs.python.org/issue27682#msg348302 之后,我做了如下所示的更改:

    然后我用 ConnectionAbortedError 替换了 BrokenPipeError。这似乎可以处理异常。

    Django 3 更新:我在 basehttp.py (rev.1.2.1) 中进行了以下更改,以消除所有令人讨厌的损坏管道错误消息:

    Line 55: - return issubclass(exc_type, BrokenPipeError)
    Line 55: + return issubclass(exc_type, (BrokenPipeError, ConnectionAbortedError, ConnectionResetError))
    
    Line 71: - logger.info("- Broken pipe from %s\n", client_address)
    Line 71: + pass
    

    【讨论】:

    • 我发现有必要修改返回以消除 Mac 上的此错误:return issubclass(exc_type, (BrokenPipeError, ConnectionResetError))
    • 即使文件名不区分大小写或文件丢失。我们会得到这个错误。我正在使用 python 3.6 和 django 2.2。
    【解决方案2】:

    当前的答案都不适合我。这就是我在 MacOS 上为 Django 3 开发过程中使错误消失的方式(在其他版本上未经测试)。

    在您的一个项目应用程序中创建自定义运行服务器管理命令,该命令仅在 DEBUG==True 和您在 Mac 上时有所不同。特别关注Command.get_handler

    #myapp/management/commands/runserver.py
    
    
    import platform
    
    import django.core.servers.basehttp
    from django.conf import settings
    from django.contrib.staticfiles.management.commands.runserver import Command as RunserverCommand
    from django.core.servers.basehttp import ServerHandler
    
    
    def handle_one_request(self):
        """
        Exact copy of django.core.servers.WSGIRequestHandler.handle_one_request except it
        Completely ignores "ConnectionResetError: [Errno 54] Connection reset by peer"
        Which seems to be only noise on MacOS.
        """
        try:
            self.raw_requestline = self.rfile.readline(65537)
        except ConnectionResetError:
            return
        if len(self.raw_requestline) > 65536:
            self.requestline = ""
            self.request_version = ""
            self.command = ""
            self.send_error(414)
            return
    
        if not self.parse_request():  # An error code has been sent, just exit
            return
    
        handler = ServerHandler(self.rfile, self.wfile, self.get_stderr(), self.get_environ())
        handler.request_handler = self  # backpointer for logging & connection closing
        handler.run(self.server.get_app())
    
    
    class Command(RunserverCommand):
        def get_handler(self, *args, **options):
            if settings.DEBUG and platform.platform().upper().startswith("DARWIN"):
                # patch the offending code
                django.core.servers.basehttp.WSGIRequestHandler.handle_one_request.__code__ = handle_one_request.__code__
    
            return super().get_handler(*args, **options)
    
    

    并将您的应用添加到INSTALLED_APPS 上方的django.contrib.staticfiles

    INSTALLED_APPS = [
      . . .
      "myapp",
      "django.contrib.staticfiles",
      . . .
    ]
    

    【讨论】:

      【解决方案3】:

      我在我的项目中遇到了同样的问题。也许这篇文章可以帮助某人。 就我而言,问题是我从带有onclick 的按钮调用函数,如下所示:

      <a class="btn btn-warning"  onclick="submitData();">Caption</a>
      

      我把它改成了更好的方法:

      <button class="btn btn-warning" id="button-action">Caption</button>
      

      然后处理点击:

      document.getElementById('button-action').addEventListener('click', function(e){
          submitData()
      })
      

      【讨论】:

        【解决方案4】:

        当我从开发切换到生产时,我也遇到了这个问题。

        在我做 collectstatic 后它再次正常工作,我猜它缺少用于生产的静态目录路径

        在切换到生产环境之前执行此操作

        python manage.py collectstatic

        【讨论】:

          【解决方案5】:

          我遇到了同样的问题ConnectionResetError: [Errno 54] Connection reset by peer

          在我的情况下,问题是尝试使用 debug settings to False 通过开发服务器提供静态文件,只有在设置文件中将 debug 设置为 True 时,开发服务器才能提供静态文件。

          在我的设置文件中我替换

          DEBUG = False
          

          DEBUG = True
          

          之后,我重新启动了我的开发服务器,它对我有用!

          【讨论】:

            【解决方案6】:

            FFS...太愚蠢了。我注意到它在找不到 favicon 后总是在重置,所以我添加了一个...即使我从未明确加载过一个,django 似乎尝试从项目的根目录加载一个默认的...这不会发生对于任何其他从事该项目的开发人员。诡异的。 (为了完整性)如果其他人偶然发现这一点,我使用favicon io 制作了一个简单的文本。然后我像这样将它加载到我的html中:

            {% load static %}
            <!DOCTYPE html>
            <html lang="en">
            
            <head>
              <link rel="shortcut icon" href="{% static 'images/favicon.ico' %}" />
            ...
            

            请务必在设置中正确设置静态路径。

            【讨论】:

            • 是不是每个网页都需要包含这个?如果是这样,真的很可笑。而且我会寻求一种方法来禁用这种对 favicon.ico 的主动搜索。
            • 即使文件名不区分大小写或文件丢失。我们会得到这个错误。我正在使用 python 3.6 和 django 2.2。
            猜你喜欢
            • 1970-01-01
            • 2020-07-10
            • 1970-01-01
            • 2016-10-07
            • 2017-04-12
            • 1970-01-01
            • 2014-01-01
            • 2016-10-10
            • 1970-01-01
            相关资源
            最近更新 更多