2012-07-09 87 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