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

Red*_*ron 2 python pyramid

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

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

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

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

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

The*_*uhn 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!')
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)