Отговори (5)
Вашият сървърен процес е получил SIGPIPE
запис в сокет. Това обикновено се случва, когато пишете в сокет, който е напълно затворен от другата (клиентска) страна. Това може да се случи, когато клиентска програма не изчака получаването на всички данни от сървъра и просто затвори сокет (използвайки функцията close
).
В C програма обикновено бихте опитали да зададете да игнорирате SIGPIPE
сигнал или да зададете фиктивен манипулатор на сигнала за него. В този случай ще бъде върната проста грешка при запис в затворен сокет. Във вашия случай Python изглежда хвърля изключение, което може да се третира като преждевременно прекъсване на връзката на клиента.
Грешката с прекъсната тръба обикновено възниква, ако вашата заявка е блокирана или отнема твърде много време и след изчакване от страна на заявката, тя ще затвори връзката и след това, когато страната на отговора (сървърът) се опита да пише в сокета, ще хвърли грешка при счупване на тръбата.
Зависи от това как сте го тествали и вероятно от разликите в изпълнението на TCP стека на персоналния компютър и сървъра.
Например, ако вашият sendall
винаги завършва незабавно (или много бързо) на персоналния компютър, връзката може просто никога да не се е прекъсвала по време на изпращане. Това е много вероятно, ако вашият браузър работи на същата машина (тъй като няма реално забавяне на мрежата).
Като цяло, просто трябва да се справите със случая, когато клиент прекъсва връзката, преди да сте приключили, като обработвате изключението.
Не забравяйте, че TCP комуникациите са асинхронни, но това е много по-очевидно при физически отдалечени връзки, отколкото при локални, така че условия като това могат да бъдат трудни за възпроизвеждане на локална работна станция. По-конкретно, loopback връзките на една машина често са почти синхронни.
try ... except
- person Useless; 08.08.2012
Това може да се дължи на факта, че използвате два метода за вмъкване на данни в базата данни и това води до забавяне на сайта.
def add_subscriber(request, email=None):
if request.method == 'POST':
email = request.POST['email_field']
e = Subscriber.objects.create(email=email).save() <====
return HttpResponseRedirect('/')
else:
return HttpResponseRedirect('/')
В горната функция грешката е там, където сочи стрелката. Правилното изпълнение е по-долу:
def add_subscriber(request, email=None):
if request.method == 'POST':
email = request.POST['email_field']
e = Subscriber.objects.create(email=email)
return HttpResponseRedirect('/')
else:
return HttpResponseRedirect('/')
Ако това е уеб приложение или услуга на Python като Flask или FastAPI, тази грешка може да възникне, ако производственият сървър е конфигуриран да изчаква заявка, която отнема твърде много време. Има подходящи параметри в Gunicorn и Uvicorn като GRACEFUL_TIMEOUT и TIMEOUT, които трябва да бъдат конфигурирани според нуждите на вашето приложение. Може също така да искате да проверите праговете за изчакване на обратния прокси или шлюз.