2

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

例如,我正在开发一个列出班级所有学生的金字塔网络应用程序。后端数据库只有一张表 - 'student'。现在我开发了一个可选脚本,该脚本还将一个表“老师”添加到数据库中。理想情况下,网络应用程序应该能够在这两种情况下运行。如果教师表丢失,它不会查询它并简单地打印学生详细信息。如果教师表存在,它将打印教师姓名和学生姓名。

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

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

所以我的问题是我应该使用哪些方法?如果要将设置变量传递给视图,该怎么做?有没有处理这个问题的标准方法?

4

1 回答 1

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号也是可行的。请记住: 请求宽恕比许可更容易。所以你可以这样做:(以 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')
于 2012-04-20T05:25:46.690 回答