Posible solución: http://groups.google.com/group/django-users/browse_thread/thread/2c7421cdb9b99e48
Hasta hace poco tenía curiosidad para probar esto en Django 1.1.1. ¿Esta excepción se lanzará de nuevo ... sorpresa, allí estaba de nuevo. Me tomó un poco de tiempo para depurar esto, sugerencia útil fue que solo se muestra cuando (pre) bifurcación. Así que para aquellos que conseguir al azar esas excepciones, puedo decir ... fijar su código :) Ok .. en serio, no siempre son algunas maneras de hacer esto, por lo que vamos a me explico abetos, donde es un problema primera . Si accede a la base de datos , cualquiera de sus módulos importará como, por ej. leyendo la configuración de la base de datos , entonces obtendrá este error. Cuando se inicia la aplicación fastcgi-prefork , primero importa todos los módulos, y solo después de esto se abren los elementos secundarios. Si ha establecido la conexión db durante la importación, todos los procesos secundarios tendrán una copia exacta de ese objeto . Esta conexión está siendo cerrada al final de la fase de solicitud (señal de petición finalizada). Por lo tanto, el primer hijo que será llamado para procesar su solicitud , cerrará esta conexión . Pero, ¿qué pasará con el resto de los procesos secundarios? Ellos creerán que tienen abierto y supuestamente trabajando conexión al db, por lo que cualquier operación db causará una excepción . ¿Por qué esto no se muestra en el modelo de ejecución roscado ? Supongo porque los hilos están utilizando el mismo objeto y saben cuando cualquier otro hilo es conexión de cierre. ¿Cómo arreglar esto? La mejor manera es corregir su código ... pero esto puede ser difícil a veces. Otra opción, en mi opinión bastante limpio, es escribir en algún lugar de su aplicación pequeño trozo de código:
from django.db import connection
from django.core import signals
def close_connection(**kwargs):
connection.close()
signals.request_started.connect(close_connection)
No pensamiento ideales, que conecta dos veces a la base de datos es una solución temporal en el mejor.
Posible solución: utilizar la agrupación de conexiones (pgpool, pgbouncer), por lo que han agrupado las conexiones de base de datos y estable, y entregado rápido a sus demonios fcgi.
El problema es que esto desencadena otro error, psycopg2 levantando una InterfaceError porque está tratando de desconectar dos veces (pgbouncer ya se maneja esto).
Ahora el culpable es señal de Django request_finished activación connection.close(), y en su defecto ruidoso incluso si ya se ha desconectado. No creo que este comportamiento sea deseado, ya que si la solicitud ya ha finalizado, ya no nos importa la conexión de DB. Un parche para corregir esto debería ser simple.
El rastreo relevante:
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/core/handlers/wsgi.py in __call__(self=<django.core.handlers.wsgi.WSGIHandler object at 0x24fb210>, environ={'AUTH_TYPE': 'Basic', 'DOCUMENT_ROOT': '/storage/test', 'GATEWAY_INTERFACE': 'CGI/1.1', 'HTTPS': 'off', 'HTTP_ACCEPT': 'application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 'HTTP_AUTHORIZATION': 'Basic dGVzdGU6c3VjZXNzbw==', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_COOKIE': '__utma=175602209.1371964931.1269354495.126938948...none); sessionid=a1990f0d8d32c78a285489586c510e8c', 'HTTP_HOST': 'www.rede-colibri.com', ...}, start_response=<function start_response at 0x24f87d0>)
246 response = self.apply_response_fixes(request, response)
247 finally:
248 signals.request_finished.send(sender=self.__class__)
249
250 try:
global signals = <module 'django.core.signals' from '/usr/local/l.../Django-1.1.1-py2.6.egg/django/core/signals.pyc'>, signals.request_finished = <django.dispatch.dispatcher.Signal object at 0x1975710>, signals.request_finished.send = <bound method Signal.send of <django.dispatch.dispatcher.Signal object at 0x1975710>>, sender undefined, self = <django.core.handlers.wsgi.WSGIHandler object at 0x24fb210>, self.__class__ = <class 'django.core.handlers.wsgi.WSGIHandler'>
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/dispatch/dispatcher.py in send(self=<django.dispatch.dispatcher.Signal object at 0x1975710>, sender=<class 'django.core.handlers.wsgi.WSGIHandler'>, **named={})
164
165 for receiver in self._live_receivers(_make_id(sender)):
166 response = receiver(signal=self, sender=sender, **named)
167 responses.append((receiver, response))
168 return responses
response undefined, receiver = <function close_connection at 0x197b050>, signal undefined, self = <django.dispatch.dispatcher.Signal object at 0x1975710>, sender = <class 'django.core.handlers.wsgi.WSGIHandler'>, named = {}
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/db/__init__.py in close_connection(**kwargs={'sender': <class 'django.core.handlers.wsgi.WSGIHandler'>, 'signal': <django.dispatch.dispatcher.Signal object at 0x1975710>})
63 # when a Django request is finished.
64 def close_connection(**kwargs):
65 connection.close()
66 signals.request_finished.connect(close_connection)
67
global connection = <django.db.backends.postgresql_psycopg2.base.DatabaseWrapper object at 0x17b14c8>, connection.close = <bound method DatabaseWrapper.close of <django.d...ycopg2.base.DatabaseWrapper object at 0x17b14c8>>
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/db/backends/__init__.py in close(self=<django.db.backends.postgresql_psycopg2.base.DatabaseWrapper object at 0x17b14c8>)
74 def close(self):
75 if self.connection is not None:
76 self.connection.close()
77 self.connection = None
78
self = <django.db.backends.postgresql_psycopg2.base.DatabaseWrapper object at 0x17b14c8>, self.connection = <connection object at 0x1f80870; dsn: 'dbname=co...st=127.0.0.1 port=6432 user=postgres', closed: 2>, self.connection.close = <built-in method close of psycopg2._psycopg.connection object at 0x1f80870>
manejo de aquí podría añadir más indulgencia Excepción:
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2 .6.egg/django/db/__ init__.py
63 # when a Django request is finished.
64 def close_connection(**kwargs):
65 connection.close()
66 signals.request_finished.connect(close_connection)
O podría ser manejado mejor en psycopg2, por lo que no se generan errores fatales si todo lo que estamos tratando de hacer es DISCONN ect y ya está:
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/db/backends/__init__.py
74 def close(self):
75 if self.connection is not None:
76 self.connection.close()
77 self.connection = None
Aparte de eso, no tengo muchas ideas.
Esto no resuelve el problema en sí. Solo lo esquiva. : P Puede que no sea una opción para algunas personas. – pkoch