2012-04-20 18 views
2

development.iniまたはproduction.iniの特定のユーザー定義設定に基づいて、ビュー/テンプレートの内容を変更することは可能ですか?ピラミッド:設定に基づいてサイトコンテンツを変更する

例として、クラスのすべての学生をリストするpyramid web-appを開発しています。バックエンドデータベースには1つのテーブル、「student」しかありません。今度は、オプションのスクリプトを開発して、データベースにテーブル '先生'を追加します。理想的には、web-appは両方の場合に実行できるはずです。教師用テーブルがない場合は、それを照会せず単に学生の詳細を印刷します。教師用テーブルがある場合は、教師の名前と生徒の名前が印刷されます。私の心に、これは、次のいずれかの方法で行うことができる

-

  1. は教師+生徒や学生だけ ページ用に別のルート(URL)を保管してください。問題は、実際には学生の情報しか持っていないときに元の人に電話するのをやめることができないということです。これにより、 に不要なエラーページが表示されます。
  2. .iniファイルにteacher_enabled = true/false設定を使用します。この設定は、__ init __.pyファイルで設定['teacher_enabled']を使ってアクセスできます。単一のルート(say'home '、'/')を設定するだけですが、seeting変数がtrue/falseであるかどうかに基づいて異なるビューにマップします。これは@view_configデコレータの使用を許さず、両方の場合のテンプレートは別々にする必要があります
  3. もう一度設定変数を使用して、何とかビューに渡します。ビュー内で関連するクエリのみを作成します。例えば。 - teacher_enabledがTrueの場合は、教師テーブルを照会します。それ以外の場合は、学生テーブルのみを照会します。この変数をテンプレートにも渡します。詳細が表示されるかどうかが教師名などで決まります。

私はこれらのアプローチのどちらを使用すべきですか?設定変数がビューに渡される場合、どのようにそれを行うことができますか?そして、この問題に対処する標準的な方法はありますか?

答えて

5

教師+生徒と生徒専用ページの別々のルート(URL)を保存します。問題は、あなたが学生情報しか持っていないときに人々が実際に元の人に電話するのを止めることができないことです。

ああ、できます!あなたの.iniファイルにteacher_enabled =真/偽の設定を追加し、あなたがこれに似たいくつかのコードを使用することができます:番号2とそれを組み合わせる

from pyramid.threadlocal import get_current_registry 
from pyramid.httpexceptions import HTTPFound 

#Define some awesome student views here 
@view_config(name='student') 
def student(request): 
    return HTTPFound('Foo!') 

if get_current_registry().settings['teacher_enabled']: 

    #Some awesome student and teacher views here 
    @view_config(name='student_and_teacher') 
    def student_and_teacher(request): 
     return HTTPFound('Bar!') 

ナンバー3も実現可能です。覚えておいてください:It's easier to ask for forgiveness than permission。だからあなたはこのようなことをすることができます:(SQLAlchemyを例として)

from your_models.teacher import Teacher 
from sqlalchemy.exc import NoSuchTableError 

try: 
    teacher = session.query(Teacher).filter(Teacher.id==42).first() 
except NoSuchTableError: 
    teacher = Teacher('Unknown') 
+0

ありがとう!!だから、あなたはget_current_registry()を通して設定変数を使うことができます。もう一つのこと - 両方のケースのモデルも異なるので、後で(やったように)教師のモデル定義を保持し、例外を処理することをお勧めします。また、models.pyも、変数をtrue/falseそれだけでモデルを定義しますか? – RedBaron

+1

あなたはそれを保つかもしれませんが、それは害を及ぼさず、存在しないモデルに起因するエラーを処理することからあなたを救います。また、ピラミッドのドキュメントでは、get_current_registry()を使用しないようにアドバイスしています。できるだけ使用しないでください。 (request.registryは利用可能な場合は良い選択肢です) –

+0

もう一度ありがとうございます。はいrequest.registryが利用可能です(少なくともビューで)。私は、アプローチ2がビュー機能とテンプレートを分離した状態に保つのに最も良いと思います。これはコーディングの量を増加させるが、オプション3は不必要なコード合併症を招く。私がどのモードにいるのかを覚えていて、テンプレートも複雑です – RedBaron

関連する問題