django - did you forget to register or load this tag
Ejecutar código en Django después de que la respuesta ha sido enviada al cliente (2)
El método que estoy utilizando en este momento usa una subclase de HttpResponse:
from django.template import loader
from django.http import HttpResponse
# use custom response class to override HttpResponse.close()
class LogSuccessResponse(HttpResponse):
def close(self):
super(LogSuccessResponse, self).close()
# do whatever you want, this is the last codepoint in request handling
if self.status_code == 200:
print(''HttpResponse successful: %s'' % self.status_code)
# this would be the view definition
def logging_view(request):
response = LogSuccessResponse(''Hello World'', mimetype=''text/plain'')
return response
Al leer el código de Django estoy muy convencido de que HttpResponse.close () es el último punto para inyectar código en el manejo de las solicitudes. No estoy seguro de si realmente hay casos de error que se manejan mejor con este método en comparación con los mencionados anteriormente, por lo que estoy dejando la pregunta abierta por el momento.
Las razones por las que prefiero este enfoque para los otros mencionados en la respuesta de lazerscience son que se puede configurar solo en la vista y no requiere que se instale el middleware. Usar la señal request_finished, por otro lado, no me permitiría acceder al objeto de respuesta.
En mi aplicación Django quiero hacer un seguimiento de si una respuesta ha sido enviada al cliente con éxito. Soy muy consciente de que no hay una forma "estanca" en un protocolo sin conexión como HTTP para asegurar que el cliente haya recibido (y mostrado) una respuesta, por lo que esta no será una funcionalidad de misión crítica, pero aún así quiero hacer esto en el último tiempo posible. La respuesta no será HTML, por lo que no es posible ninguna devolución de llamada del cliente (usando etiquetas Javascript o IMG, etc.).
El "último" gancho que puedo encontrar sería agregar un middleware personalizado que implementa process_response en la primera posición de la lista de middleware, pero a mi entender esto se ejecuta antes de que la respuesta real se construya y se envíe al cliente. ¿Hay ganchos / eventos en Django para ejecutar el código después de que la respuesta se haya enviado con éxito?
Supongo que cuando hablamos de middleware está pensando en el método de process_request
del middleware, pero también hay un método process_response
que se llama cuando se devuelve el objeto HttpResponse
. Supongo que será el último momento en el que puedes encontrar un gancho que puedes usar.
Además, también hay una señal request_finished
siendo disparada.