如何在Django中按请求进行“Lazy-write”登录?

时间:2011-03-16 19:54:18

标签: django

使用Django,我需要做一些涉及数据库写入的每请求日志记录。

我理解Django的process_request()process_response()中间件钩子,但据我所知,这些钩子处于关键路径(按设计)以呈现网页响应。

我不希望我的请求后数据库写操作阻止页面的响应时间。

Django有一个简单的设计模式,可以让我做一个“懒惰的日志写入”,我可以使用请求挂钩在请求处理期间收集信息,但是不会发生任何后续操作和实际的日志写操作直到将响应写入用户?

我目前正在使用WSGI,但更喜欢最通用的解决方案。

1 个答案:

答案 0 :(得分:5)

Django实现了一个request_finished - 在响应处理完成后触发的信号,但不好的是,它不允许你访问当前的request对象对于日志记录来说并不是很有用...最后一个挂钩到django的响应处理的地方很可能是HttpResponse class itself。你可以,例如。将数据临时存储在request.session中,并使用close()方法将其写入数据库。

但我想还有其他一些你应该考虑的选择:你可以使用类似Celery的东西来异步处理日志记录任务。此外,还有非{s}数据库,如MongoDB,可为您提供方便,高效的日志记录功能,例如。 you dont have to wait until the changes are really committed数据库可以为您带来巨大的性能优势。