如何在 Python 金字塔中设置'catch all'视图来记录静态文件的传入请求?



出于调试目的,我试图查看从我的html文件中请求了哪些静态文件(css、js、jpg等)。我在这里阅读了文档:在这里输入链接描述我已经设置了我的配置,如下所示:

config.add_route('catchall_static', 'static/*subpath')

我的观点是:

@view_config(route_name='catchall_static')
path_info = request._headers.environ['PATH_INFO']
log.debug('path info = {0} {1}'.format(path_info, query_string))
return request.response

有了这个代码,有几件事正在发生。

1) 尽管静态文件通过视图,但它们并没有真正加载到浏览器中2) 当静态文件通过视图时,我的代码至少可以用于日志记录,但50%的时间我会收到这个错误:

追溯:path_info=请求_headers.environ['PATH_INFO']AttributeError:"NoneType"对象没有属性"environ">

错误似乎集中在html文件(如css文件)中的eariler上,而html文件底部的.js文件有时也能正常工作。

所以基本上我不知道我是接近还是完全朝着错误的方向去解决这个问题。有人知道做这件事的正确方法吗?

你确定这个路由成功地为任何请求提供了服务器吗?实现您目标的可能性有:WSGI中间件、Pyramid Tween或自定义事件订阅者。

自定义订阅者可能是最容易的。该订阅者在创建响应之前被调用,因此它不知道响应代码、内容等。要实现这一点,您可以添加一个请求完成回调,也可以使用其他方法之一。

from pyramid.events import NewRequest
from pyramid.events import subscriber
@subscriber(NewRequest)
def static_logger(event):
logger = logging.getLogger('static')
request = event.request
if request.path_info.startswith('/static'):
logger.info('static request: {} {}'.format(request.path_info,
request.query_string))

并在development.ini中激活记录器:

[loggers]
keys = root, static

[logger_static]
level = DEBUG
handlers = console
qualname = static

最新更新