【问题标题】:Accessing Request from __init__.py in Pyramid从 Pyramid 中的 __init__.py 访问请求
【发布时间】:2012-07-09 15:47:04
【问题描述】:

在设置 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)

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

【问题讨论】:

  • 从您的代码中,我无法理解您期望如何生成异常电子邮件。如果您计划在引发异常时发送电子邮件,您应该查看自定义异常视图。 docs.pylonsproject.org/projects/pyramid/en/latest/narr/… 这是一个视图,因此您当时将拥有当前请求,您可能希望将电子邮件发送到那里,然后生成错误响应。
  • 也许你可以创建一个事件订阅者来监听NewRequestkemeneur.com/clients/pylons/docs/pyramid/narr/…
  • @TomWillis 我正在使用 pyramid_exclog (docs.pylonsproject.org/projects/pyramid_exclog/en/latest) 来处理日志记录,因此通过将 SMTPHandler 添加到日志处理程序中,这是一种将所有日志记录代码放在一个地方的便捷方式。生成异常电子邮件,工作正常,这不是我遇到的问题:)
  • 下面@Sergey 的要点是关于创建一个监听NewRequest 的事件订阅者。对于生产来说,这可能不是一个好主意。

标签: python logging request pyramid


【解决方案1】:

尝试将请求设置为全局变量,或者以某种方式在全局存储指向“当前”请求的指针(如果这是您要尝试订阅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))
    

【讨论】:

  • 感谢@Sergey 的精彩回答! exclog.extra_info 确实为我提供了更多信息,但它并没有深入研究上下文对象或从用户对象中给我提供信息,例如。我想发送的异常信息隐藏在那里。但是通过您可能的解决方案,我认为我剩下的唯一可行的方法是注册自定义异常视图并在那里处理它。
  • 如果我错了,请纠正我,但从我可以收集的内容来看,pyramid 只允许为 pyramid.exceptions 中的异常自定义异常视图(请参阅:docs.pylonsproject.org/projects/pyramid/en/1.0-branch/api/…)。所以这基本上意味着我不能使用自定义异常视图来让这个例子工作。
  • 看看docs.pylonsproject.org/projects/pyramid/en/latest/narr/… - 该示例显示了将自定义视图注册到直接从Exception子类化的异常
猜你喜欢
  • 2020-08-16
  • 2013-07-14
  • 1970-01-01
  • 2019-05-29
  • 2011-12-27
  • 1970-01-01
  • 2013-08-18
  • 2017-03-12
  • 2014-03-01
相关资源
最近更新 更多