django 中间件记录所有请求及请求执行时间
2015-07-31 10:28
686 查看
class LoggingMiddleware(object): def process_request(self, request): request.start_time = time.time() def process_response(self, request, response): execute_time = time.time() - request.start_time path = request.get_full_path() info_logger.info('request %s execute_time %f' % (path, execute_time)) return response
MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'mobile.middlewares.LoggingMiddleware', )
1 中间件可以保证 process_request 和 process_response 方法不会多线程并发, 所以 2 个方法中的 request 肯定是同一个 request
2 方法中不要引用全局变量或当前类中的变量,否则在多线程并发或协程中会有问题
3 process_request 按顺序从上往下执行, process_response 会反过来从下往上执行
4 如果你的 urlconf 中末尾带反斜线 / , 当链接中不带反斜线时,CommonMiddleware 会把请求重定向到带反斜线的 url
5 这里有一个坑, 当 CommonMiddleware 中请求被从定向时, 后面所有中间件的 process_request 都不会被执行, 但所有中间件的 process_response 还是会反过来执行,
这种情况下上面的 LoggingMiddleware process_response 方法 就会报异常,因为没有 request.start_time
6 解决方法,把两个中间件换一下位置, 但这样会多记录一个不带反斜线的请求(不带反斜线的请求不存在), 还有就是把链接中所有请求都加上反斜线,但由于历史原因
可能有时也加不全。
相关文章推荐
- Hackerrank - [Algo] Matrix Rotation
- POJ 1042 Gone Fishing (DP)
- golang package整理(strconv)
- VIEWGOOD(远古)解决方案---股票财经直播
- POJ1569叉乘判断点在三角形内部
- Algorithms—205.Isomorphic Strings
- #142 (div.2) A. Dragons
- Algorithms—223.Rectangle Area
- Mongoose学习参考文档
- Algorithms—226.Summary Ranges
- Algorithms—228.Summary Ranges
- Algorithms—231.Power of Two
- HDU 1372 Knight Moves ( BFS & DBFS )
- django1.8认证系统(1)
- QWidget的学习博客 good
- django 使用总结
- 抽取Zabbix的图形整合到自己后台 推荐
- .NET破解之google瓦片下载及拼接
- POJ 1753 Flip Game(暴力+DFS)
- Algorithms—86.Partition List