3

在设置 Pyramid 应用程序并向配置器添加设置时,我在理解如何从请求中访问信息时遇到问题,例如 request.session 等。我对使用 Pyramid 完全陌生,我已经到处搜索了有关此信息的信息,但一无所获。

我想要做的是在生产中发送异常电子邮件时访问请求对象中的信息。我无法访问请求对象,因为__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

4

1 回答 1

5

尝试将请求设置为全局变量,或者以某种方式全局存储指向“当前”请求的指针(如果这是您要尝试订阅NewRequest事件的方法)并不是一个非常好的主意 - Pyramid 应用程序可以有多个线程执行,因此多个请求可以同时在单个进程中处于活动状态。因此,当应用程序以单线程模式运行并且只有一个用户可以访问它时,这种方法在开发过程中可能看起来很有效,但在部署到生产服务器时会产生非常有趣的结果。

Pyramid 具有pyramid.threadlocal.get_current_request()返回线程本地请求变量的函数,但是,文档指出:

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

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

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

  • 查看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))
    
于 2012-07-09T21:18:57.267 回答