2012-04-20 72 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