класс 'psycopg2.InterfaceError': соединение уже закрыто - PullRequest
2 голосов
/ 24 февраля 2012

Я натягиваю волосы и собираюсь сделать что-нибудь грязное.

Я использую nginx + django + postgresql.Половину времени, когда я пытаюсь протестировать свой сайт и открыть страницу, я получаю следующее:

<class 'psycopg2.InterfaceError'>   Python 2.7.2: /home/webapp/newavenue/bin/python
Fri Feb 24 08:28:58 2012
A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.

 /home/webapp/newavenue/lib/python2.7/site-packages/flup/server/fcgi_base.py in run(self=<flup.server.fcgi_base.Request object>)
    572             
    573         try:
=>  574             protocolStatus, appStatus = self.server.handler(self)
    575         except:
    576             traceback.print_exc(file=self.stderr)
protocolStatus undefined, appStatus undefined, self = <flup.server.fcgi_base.Request object>, self.server = <flup.server.fcgi_fork.WSGIServer object>, self.server.handler = <bound method WSGIServer.handler of <flup.server.fcgi_fork.WSGIServer object>>
 /home/webapp/newavenue/lib/python2.7/site-packages/flup/server/fcgi_base.py in handler(self=<flup.server.fcgi_fork.WSGIServer object>, req=<flup.server.fcgi_base.Request object>)
   1157         try:
   1158             try:
=> 1159                 result = self.application(environ, start_response)
   1160                 try:
   1161                     for data in result:
result = None, self = <flup.server.fcgi_fork.WSGIServer object>, self.application = <django.core.handlers.wsgi.WSGIHandler object>, environ = {'CONTENT_LENGTH': '', 'CONTENT_TYPE': '', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'HTTP_ACCEPT_ENCODING': 'gzip,deflate,sdch', 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_COOKIE': 'csrftoken=8a0176b368b17af00a8563b5f95b134b; sess...e5bdd0d0a4e3092e7a9abd0029c02; django_language=en', 'HTTP_HOST': 'newavedev.zapto.org', ...}, start_response = <function start_response>
 /home/webapp/newavenue/lib/python2.7/site-packages/django/core/handlers/wsgi.py in __call__(self=<django.core.handlers.wsgi.WSGIHandler object>, environ={'CONTENT_LENGTH': '', 'CONTENT_TYPE': '', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'HTTP_ACCEPT_ENCODING': 'gzip,deflate,sdch', 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8', 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_COOKIE': 'csrftoken=8a0176b368b17af00a8563b5f95b134b; sess...e5bdd0d0a4e3092e7a9abd0029c02; django_language=en', 'HTTP_HOST': 'newavedev.zapto.org', ...}, start_response=<function start_response>)
    272                 response = self.get_response(request)
    273         finally:
=>  274             signals.request_finished.send(sender=self.__class__)
    275 
    276         try:
global signals = <module 'django.core.signals' from '/home/webapp...python2.7/site-packages/django/core/signals.pyc'>, signals.request_finished = <django.dispatch.dispatcher.Signal object>, signals.request_finished.send = <bound method Signal.send of <django.dispatch.dispatcher.Signal object>>, sender undefined, self = <django.core.handlers.wsgi.WSGIHandler object>, self.__class__ = <class 'django.core.handlers.wsgi.WSGIHandler'>
 /home/webapp/newavenue/lib/python2.7/site-packages/django/dispatch/dispatcher.py in send(self=<django.dispatch.dispatcher.Signal object>, sender=<class 'django.core.handlers.wsgi.WSGIHandler'>, **named={})
    170 
    171         for receiver in self._live_receivers(_make_id(sender)):
=>  172             response = receiver(signal=self, sender=sender, **named)
    173             responses.append((receiver, response))
    174         return responses
response undefined, receiver = <function close_connection>, signal undefined, self = <django.dispatch.dispatcher.Signal object>, sender = <class 'django.core.handlers.wsgi.WSGIHandler'>, named = {}
 /home/webapp/newavenue/lib/python2.7/site-packages/django/db/__init__.py in close_connection(**kwargs={'sender': <class 'django.core.handlers.wsgi.WSGIHandler'>, 'signal': <django.dispatch.dispatcher.Signal object>})
     83 def close_connection(**kwargs):
     84     for conn in connections.all():
=>   85         conn.close()
     86 signals.request_finished.connect(close_connection)
     87 
conn = <django.db.backends.postgresql_psycopg2.base.DatabaseWrapper object>, conn.close = <bound method DatabaseWrapper.close of <django.d...postgresql_psycopg2.base.DatabaseWrapper object>>
 /home/webapp/newavenue/lib/python2.7/site-packages/django/db/backends/__init__.py in close(self=<django.db.backends.postgresql_psycopg2.base.DatabaseWrapper object>)
    242     def close(self):
    243         if self.connection is not None:
=>  244             self.connection.close()
    245             self.connection = None
    246 
self = <django.db.backends.postgresql_psycopg2.base.DatabaseWrapper object>, self.connection = <connection object at 0x1d37130; dsn: 'dbname=ne...er=postgres host=localhost port=5432', closed: 2>, self.connection.close = <built-in method close of psycopg2._psycopg.connection object>
<class 'psycopg2.InterfaceError'>: connection already closed 
      args = ('connection already closed',) 
      cursor = None 
      message = 'connection already closed' 
      pgcode = None 
      pgerror = None

На сервере запускается следующее для генерации предыдущего отчета о трассировке:

python manage.py runfcgi host=127.0.0.1 port=8000 debug=False

Могу ли я просто обойти это, добавив что-то вроде: "try: self.connection.close (), кроме: pass" вокруг этой оскорбительной строки?Возможно, это сработает, но я думаю, что это звучит грязно (возиться с ядром), и я хотел бы попытаться найти альтернативное решение.

Редактировать: Учитывая подход этого парня тоже: комментировать его: http://osdir.com/ml/DjangoUsers/2009-04/msg01647.html

1 Ответ

2 голосов
/ 25 февраля 2012

Я думаю, я обошёл проблему. На самом деле это не решение для настройки flup-psycopg2, а альтернатива. Я переключился с использования fcgi на gunicorn, а также обернул строку self.connection.close () строкой «try: self.connection.close (), кроме: pass». Это также решило проблему 502 Bad Gateway, которую я имел с nginx.

Кроме того, кажется, что мой сайт работает немного быстрее, что всегда является приятным побочным эффектом.

...