从金字塔中的__init__.py访问请求

时间:2012-07-09 15:47:04

标签: python logging request pyramid

在设置Pyramid应用程序并向Configurator添加设置时,我遇到了解如何从请求中访问信息的问题,例如request.session等。我对使用金字塔非常陌生,我在各处搜索了相关信息,但一无所获。

我想要做的是在生产时发送异常电子邮件时访问请求对象中的信息。我无法访问请求对象,因为在创建应用程序时它在__init__.py文件中不是全局的。这就是我现在所拥有的:

import logging
import logging.handlers
from logging import Formatter

config.include('pyramid_exclog')
logger = logging.getLogger()

gm = logging.handlers.SMTPHandler(('localhost', 25), 'email@email.com', ['email@email.com'], 'Error')
gm.setLevel(logging.ERROR)
logger.addHandler(gm)

这很好用,但我希望在发送存储在会话中的异常电子邮件时包含有关登录用户的信息。如何从__init__.py访问该信息?

1 个答案:

答案 0 :(得分:5)

尝试将请求设置为全局变量,或以某种方式存储指向全局“当前”请求的指针(如果这是您将尝试订阅NewRequest事件的话)并不是一个非常好的主意 - Pyramid应用程序可以有多个执行线程,因此可以在一个进程中同时激活多个请求。因此,当应用程序在单线程模式下运行并且只有一个用户访问它时,该方法似乎可以在开发期间工作,但在部署到生产服务器时会产生非常有趣的结果。

Pyramid有pyramid.threadlocal.get_current_request()函数,它返回线程本地请求变量,但是,文档声明:

  

这项功能应该非常谨慎地使用,通常只在单位使用   测试代码。使用它几乎总是一个错误   get_current_request在测试上下文之外,因为它的用法使   有可能编写既不容易测试也不容易测试的代码   脚本。

这表明整个方法不是“金字塔”(与pythonic相同,但对于金字塔:)

可能的其他解决方案包括:

  • 查看exlog.extra_info参数,该参数应包含请求的environ和params属性到日志消息中
  • 注册异常视图将允许完全自定义处理异常
  • 使用WSGI中间件(例如WebError#error_catcherPaste#error_catcher)在发生异常时发送电子邮件
  • 如果您不仅要记录异常,而且还要记录其他非致命信息,那么编写包装函数就足够了:

    if int(request.POST['donation_amount']) >= 1000000:
       send_email("Wake up, we're rich!", authenticated_userid(request))