[英]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.