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

Mag*_*nus 3 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)
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我希望在发送存储在会话中的异常电子邮件时包含有关登录用户的信息.我如何从中获取该信息__init__.py

Ser*_*gey 5

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

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

应该非常谨慎地使用此功能,通常仅在单元测试代码中使用.在测试上下文之外使用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))
    
    Run Code Online (Sandbox Code Playgroud)