私の仮定では、正しいリクエスト オブジェクトは保証された結果ではありませんが、なぜそれが不適切なのかを正確に知りたいと思います。推奨される方法は、リクエスト オブジェクトをビュー関数からパイプラインに渡すことです。
2 に答える
リクエストオブジェクトがビューに到達した後、Web固有ではないコードに「そのまま」渡さないことをお勧めします。データベースなどを処理するコードは、ピラミッドのリクエストの概念と組み合わせてはなりません。このパターンは、グローバルリクエストオブジェクトを回避するため、Pyramidで簡単に実行できます。
リクエストオブジェクトには、ビューが呼び出される理由に関するすべてが含まれ、そのオブジェクトに必要以上のコードを結合すると、パイプラインのさらに下に、おそらく「多すぎる」関数を記述させることになります。
Michael Merickel の言っていることに同意しますが、移植された多くのレガシー Pylons アプリがあり、多くのさまざまなコードで要求オブジェクトにアクセスする必要がありました。
これを実現するために、'Web 指向' の実質的にすべての関数は、最初の引数として要求を想定しています。事実上すべてと言いますが、そうでない人もいます。そうしたくないからではなく、まだこのパラダイムに移植していないからです。Web に結合されておらず、別の方法で名前が付けられ、構築されているモジュールがいくつかあります。[私のプロジェクトの非ピラミッドベースのアプリで使用されるテキスト処理などのようなもの] しかし、リクエストに作用または相互作用する可能性のあるものはすべて、現在私が現在あるかどうかにかかわらず、最初の引数としてリクエストを持っていますそれが必要です。
私のコードが標準ではない理由は、Michael のような人々の話を聞かず、まだ get_current_request を使用していたからです... 問題に遭遇し始め、彼らが私に警告したことを理解するまで - だから私はできる限り少しずつ修正します。
get_current_request() を使用しないように私が懸念した 2 つの主な要因は次のとおりです。
リクエストを渡したいとき:単体テスト。私はグローバル
g
とc
オブジェクトを持っていた Pylons から来ました。私は彼らの便利さが本当に気に入りました。それから単体テストを書こうとしましたが、まったくの悪夢でした。そこに要求オブジェクトを詰め込むためにコードを常に書き直す必要がありました。リクエストを送信したいとき: すべてが Web に結合されているわけではありません。特定のプロジェクトでは、Twisted フレームワークを介して定期的な作業を実行するデーモンがいくつかあります。同じデータを大量に処理し、いくつかのタスクを共有します。また、移行スクリプト、crontab などもあります。これらの中で Pyramid とのやり取りが必要な場合は、重複するプロジェクトで同じ機能を維持する必要があります。
そのため、私のアプローチは、ピラミッドに密接に結合され、要求オブジェクトを必要とする lib の 1 つのセクションと、ピラミッドに完全に依存しない lib の別のセクションを作成することでした。
私のピラミッド リクエスト オブジェクトには、ヘッダー、セッション、データベース接続など、多くの便利なものが含まれています。「リクエスト」指向のデータを格納するのに非常に便利な場所です。ピラミッド以外のシステムで使用される可能性が高いタスクがある場合は常に、次のように実装します。
- 実際の関数は lib.universal にあり、「dbSession」のような引数が必要です
- 必要に応じて、 lib.pyramid にあるラッパー関数も作成し、ユニバーサルをラップするだけです-「リクエスト」から関連するものを渡します
彼は単純でばかげた例です:
lib.ユニバーサル
from ... import model
def get_user_by_id( dbSession , id , permissionsObject ):
if not validate_permissions( permissionsObject ):
raise ValueError('Not allowed')
return dbSession.query( model.User ).filter( id=id ).first()
lib.pyramid
from .. import universal
def get_user_by_id( request , id ):
return universal.get_user_by_id( request.dbSession , id , request.permissionsObject )