金字塔:根据设置修改网站内容

时间:2012-04-20 05:07:00

标签: python pyramid

是否可以根据development.ini或production.ini中的特定用户定义设置更改视图/模板的内容。

作为一个例子,我说我正在开发一个列出班级所有学生的金字塔网络应用程序。后端数据库只有一个表 - “学生”。现在我开发了一个可选脚本,它还为数据库添加了一个表'teacher'。理想情况下,web-app应该能够针对这两种情况运行。如果缺少教师表,则不会查询它并只打印学生详细信息。如果教师表存在,它将打印教师的姓名以及学生的姓名。

在我看来,这可以通过以下方式之一完成 -

  1. 仅为教师+学生和学生保留单独的路线(网址) 页面。问题是你无法阻止人们 当你只有学生信息时呼叫前者。这将导致 到不必要的错误页面
  2. 在.ini文件中使用设置teacher_enabled = true / false。可以通过设置['teacher_enabled']在__ init __.py文件中访问该设置。只配置一条路线(比如'home','/'),但根据seeting变量是真还是假将其映射到不同的视图。这不允许使用@view_config装饰器,两种情况下的模板都必须分开
  3. 再次使用设置变量,以某种方式将其传递给视图。仅在视图中进行相关查询。例如。 - 如果teacher_enabled为True,则查询教师表,否则仅查询学生表。将此变量也传递给模板,然后决定是否要显示某些细节(例如教师姓名)。
  4. 所以我的问题是我应该使用哪种方法?如果要将设置变量传递给视图,该怎么做?是否有一种处理这个问题的标准方法?

1 个答案:

答案 0 :(得分:5)

  

为教师+学生和学生页面保留单独的路线(URL)。问题是当你只有学生信息时,你无法阻止人们实际呼叫前者。

啊,但你可以!将它与数字2结合起来:在.ini文件中添加一个teacher_enabled = true / false设置,然后你可以使用类似的代码:

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')