簡體   English   中英

Python Django Errno 54 '連接重置由對等'

[英]Python Django Errno 54 'Connection reset by peer'

在調試這個時遇到一些麻煩。 當我第一次啟動我的應用程序時,我總是收到這個錯誤,然后間歇性地出現。 有人可以通過拋出一些調試技術來幫助我嗎? 我試過使用代理檢查器 - 無濟於事,我沒有看到任何有用的東西。 我已經嘗試了有關在我的 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

即使此連接重置,該應用程序似乎也能正常運行,但它讓我在嘗試調試時發瘋。

FFS……太蠢了。 我注意到它總是在找不到圖標后重置,所以我添加了一個...盡管我從未明確加載過一個,但 django 似乎嘗試從項目的根目錄加載一個默認的...這不會發生對於從事該項目的任何其他開發人員。 奇怪的。 (為了完整性)如果其他人偶然發現了這一點,我會使用favicon io制作一個簡單的文本。 然后我將它加載到我的 html 中,如下所示:

{% load static %}
<!DOCTYPE html>
<html lang="en">

<head>
  <link rel="shortcut icon" href="{% static 'images/favicon.ico' %}" />
...

確保在設置中正確設置靜態路徑。

如果圖標是 .png 格式而不是 .ico 格式,則會看到相同的行為。

此外,與在其他站點上看到的建議相反,將 Python 降級到 v3.6 並不能解決問題。 錯誤 w 的屏幕截圖。 png 圖標

似乎是 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

我遇到了同樣的問題ConnectionResetError: [Errno 54] Connection reset by peer

在我的情況下,問題是嘗試通過開發服務器提供靜態文件, debug settings to False ,開發服務器只能在設置文件中的debug設置為True時提供靜態文件。

在我的設置文件中,我替換

DEBUG = False

DEBUG = True

之后,我重新啟動我的開發服務器,它對我有用!

當我從開發切換到生產時,我也遇到了這個問題。

在我執行 collectstatic 后,它又正常工作了,我的猜測是它缺少用於生產的靜態目錄路徑

在切換到生產環境之前執行此操作

python manage.py collectstatic

我在我的項目中遇到了同樣的問題。 也許這篇文章可以幫助某人。 在我的情況下,問題是我使用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()
})

目前的答案都不適合我。 這就是我在 MacOS 上為 Django 3 開發期間使錯誤消失的方式(在其他版本上未經測試)。

在您的項目應用程序之一中創建自定義 runserver 管理命令,該命令僅在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)

並將您的應用程序添加到django.contrib.staticfiles上方的INSTALLED_APPS

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM