首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >仅将Flask日志记录中间件应用于一个视图

仅将Flask日志记录中间件应用于一个视图
EN

Stack Overflow用户
提问于 2017-03-17 18:30:54
回答 1查看 2K关注 0票数 1

我现在有以下中间件:

代码语言:javascript
运行
复制
class LoggingMiddleware(object):
  def __init__(self, app):
    self._app = app

  def __call__(self, environ, resp):
    keys = ['HTTP_ACCEPT', 'HTTP_ACCEPT_ENCODING',
            'HTTP_X_FORWARDED_FOR',  'HTTP_REFERER',
            'HTTP_USER_AGENT', 'PATH_INFO',
            'QUERY_STRING', 'REMOTE_ADDR']
    dumpable = { k:environ.get(k, None) for k in keys }
    print json.dumps(dumpable)      # Not sure how to get this to work with papertrail
    return self._app(environ, resp)

我通过以下方式安装:

代码语言:javascript
运行
复制
app.wsgi_app = LoggingMiddleware(app.wsgi_app)

这将记录我的应用程序处理的每个请求。我只想把这个范围限制在一个视图函数上,

代码语言:javascript
运行
复制
@app.route('/foo/')
def foo

我怎样才能做到呢?

EN

回答 1

Stack Overflow用户

发布于 2017-03-18 04:05:38

如果您不需要未经修改的环境密钥,只需在该特定路由上使用一个装饰器,并将environrequest.environ中删除。

代码语言:javascript
运行
复制
def log_request(route):
    @functools.wraps(route)
    def wrapper(*args, **kwargs):
        keys = ['HTTP_ACCEPT', 'HTTP_ACCEPT_ENCODING',
        'HTTP_X_FORWARDED_FOR',  'HTTP_REFERER',
        'HTTP_USER_AGENT', 'PATH_INFO',
        'QUERY_STRING', 'REMOTE_ADDR']
        dumpable = { k:environ.get(k, None) for k in keys }

        # TODO: Log elsewhere
        print(json.dumps(dumpable))
        return route(*args, **kwargs)

    return wrapper

然后,在日志装饰器中包装您所关心的一条路线:

代码语言:javascript
运行
复制
@app.route('/foo/')
@log_request
def foo():
    return 'hello from /foo/'

或者,如果您必须使用中间件(或者如果您想配置在运行时记录的路由,而不是构建时),您只需查看PATH_INFO,并仅在路径匹配时进行日志记录:

代码语言:javascript
运行
复制
if environ.get('PATH_INFO') in ('/foo/', '/bar'):
    keys = # ... snip ...

return self._app(environ, resp)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42864788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档