2012-04-20 41 views
2

是否可以根據development.ini或production.ini中的特定用戶定義設置來更改視圖/模板的內容。金字塔:根據設置修改網站內容

作爲一個例子說,我正在開發一個金字塔web應用程序,其中列出了該班的所有學生。後端數據庫只有一個表 - 「學生」。現在我開發了一個可選腳本,該腳本還向數據庫添加了一個表「老師」。理想情況下,網絡應用程序應該能夠運行這兩種情況。如果教師表丟失了,它將不會查詢它並簡單地打印學生的詳細信息。如果教師表存在,它將打印教師姓名以及學生姓名。

在我看來,這可以通過以下方式之一完成 -

  1. 保持獨立的路由(URL)的教師+學生與學生只有 頁。問題是,當你只有學生信息時,你不能阻止實際撥打 的人撥打前者。這會導致 到不必要的錯誤頁面
  2. 在.ini文件中使用設置teacher_enabled = true/false。該設置可以通過設置['teacher_enabled']在__ init __.py文件中進行訪問。根據seeting變量是真/假來配置一條路線(如'home','/'),但將其映射到不同的視圖。這將不允許使用@view_config裝飾器和模板,這兩種情況將不得不分開
  3. 再次使用設置變量,以某種方式將其傳遞給視圖。只在視圖中進行相關查詢。例如。 - 如果teacher_enabled爲True,則查詢教師表,否則僅查詢學生表。將此變量也傳遞給模板,並決定是否顯示一些細節(例如教師姓名)。

所以我的問題是我應該使用哪種方法?如果設置變量要傳遞給視圖,那怎麼做?有沒有解決這個問題的標準方法?

回答

5

爲教師+學生和學生只保留單獨的路線(URL)。問題是,當你只有學生信息時,你不能阻止人們真正打電話給前者。

啊,但你可以!與2號結合起來:一個teacher_enabled =真/假設置添加到您的.ini文件,然後你可以使用類似這樣的代碼:

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 2012-04-20 05:34:02

+1

您可以保留它,它不會造成任何傷害,並且可以讓您免於處理源自不存在的模型的任何錯誤。此外,金字塔文檔建議不要使用get_current_registry(),所以您應該儘可能少地使用它。 (request.registry是一個很好的選擇,如果可用) – 2012-04-20 05:41:25

+0

再次感謝。是request.registry可用(至少在視圖中)。我想方法2聽起來最好的保留視圖函數和模板是分開的。雖然這會增加編碼量,但選項3會導致不必要的編碼複雜化。記住我處於哪種模式,並且使模板複雜化 – RedBaron 2012-04-20 05:50:42