2012-07-09 64 views
3

在建立金字塔的应用程序,并添加设置的配置,我在了解如何从请求访问信息,像的request.session和这些问题。我在使用金字塔时是全新的,我已经在整个地方搜索了这方面的信息,但什么都没找到。访问从__init__.py请求金字塔

我想做什么就生产发出异常电子邮件时,在请求对象的访问信息。我无法访问请求对象,因为在创建应用程序时,它在__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 protected]', ['[email protected]'], 'Error') 
gm.setLevel(logging.ERROR) 
logger.addHandler(gm) 

这工作得很好,但我想包括约发出异常电子邮件时登录的用户,存储在会话信息。如何从__init__.py访问该信息?

+0

从你的代码我不明白你会如何期望异常电子邮件生成。如果您计划在发生异常时发送电子邮件,则应查看自定义异常视图。 http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/views.html?awesome#custom-exception-views它是一个视图,所以你当时会有当前的请求,你可能想要在那里发送电子邮件,然后生成错误响应。 – 2012-07-09 16:04:37

+1

也许你可以创建一个监听NewRequest http://www.kemeneur的事件订阅者。COM /客户/挂架/文档/金字塔/ NARR/events.html#事件章? – dm03514 2012-07-09 16:05:34

+0

@TomWillis我正在使用pyramid_exclog(http://docs.pylonsproject.org/projects/pyramid_exclog/en/latest/)来处理日志记录,所以通过在日志处理程序中添加一个SMTPHandler,这是一种方便的方式日志代码在一个地方。异常电子邮件生成,工作正常,这不是我遇到的问题:) – 2012-07-09 16:35:31

回答

5

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

金字塔具有pyramid.threadlocal.get_current_request()函数返回线程局部请求变量,但是,该文档指出:

该函数应当非常谨慎使用,通常只在单元 测试代码。它几乎总是通常是一个错误的使用 get_current_request测试环境之外,因为它的使用使得 可以写,可以很容易地没有试验或 脚本代码。

这表明整个方法不是“金字塔型”(与Python的,但对于金字塔:)

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

  • 看看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)) 
    
+0

感谢您的好评@Sergey! exclog.extra_info确实给了我更多的信息,但它并没有深入到上下文对象中,或者将信息从用户对象中提取出来,例如。我想发送的例外信息隐藏在那里。 但通过您的可能解决方案,我认为我唯一能做的就是注册自定义异常视图并在那里处理它。 – 2012-07-09 22:53:06

+0

纠正我,如果我错了,但从我可以收集的金字塔只允许在pyramid.exceptions中例外自定义异常视图(请参阅:http://docs.pylonsproject.org/projects/pyramid/en/1.0-branch/ API/exceptions.html)。所以这基本上意味着我不能使用自定义异常视图来为这个例子工作。 – 2012-07-20 13:13:46

+0

查看http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/views.html?awesome#custom-exception-views - 该示例显示了将自定义视图注册为直接发生的异常从“Exception”分类 – Sergey 2012-07-21 19:52:16