3

Pyramid アプリをセットアップして Configurator に設定を追加するとき、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

request をグローバル変数にしたり、何らかの方法で「現在の」リクエストへのポインタをグローバルに格納しようとするのは (NewRequestイベントへのサブスクライブでそれを試みる場合)、あまり良い考えではありません - Pyramid アプリケーションは複数のスレッドを持つことができますそのため、1 つのプロセス内で同時に複数の要求をアクティブにすることができます。そのため、このアプローチは、アプリケーションがシングル スレッド モードで実行され、1 人のユーザーのみがアクセスする開発中は機能しているように見えますが、実稼働サーバーに展開すると、非常に面白い結果が得られます。

Pyramid にはpyramid.threadlocal.get_current_request()、スレッドローカルのリクエスト変数を返す関数がありますが、ドキュメントには次のように記載されています。

この関数は非常に慎重に使用する必要があり、通常は単体テスト コードでのみ使用してください。ほとんどの場合、テスト コンテキストの外で get_current_request を使用するのは間違いです。これを使用すると、簡単にテストしたりスクリプト化したりできないコードを記述できるようになるためです。

これは、アプローチ全体が「ピラミッド型」ではないことを示唆しています(pythonicと同じですが、ピラミッドの場合:)

可能な他の解決策は次のとおりです。

  • リクエストのenvironおよびparams属性をログメッセージに含める必要があるexlog.extra_infoパラメータを見てください
  • 例外ビューを登録すると、例外の完全なカスタム処理が可能になります
  • WebError#error_catcherまたはなどの WSGI ミドルウェアを使用しPaste#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 に答える