【问题标题】:Pyramid: modifying site content based on settingsPyramid:根据设置修改网站内容
【发布时间】:2012-04-20 05:07:00
【问题描述】:

是否可以根据 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,则查询teacher 表,否则仅查询student 表。将此变量也传递给模板,然后决定是否显示一些详细信息(例如教师姓名)。

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

【问题讨论】:

    标签: python pyramid


    【解决方案1】:

    为教师+学生和仅限学生的页面保留单独的路由 (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')
    

    【讨论】:

    • 谢谢!!因此,您可以通过 get_current_registry() 使用设置变量。还有一件事-由于两种情况下的模型也会有所不同,因此建议保留教师模型定义并稍后处理异常(就像您所做的那样?)或者在models.py中我还应该查看设置变量是否为真/假然后才定义模型?
    • 您最好保留它,它不会造成任何伤害,并且可以避免您处理因模型不存在而导致的任何错误。此外,金字塔文档建议不要使用 get_current_registry(),因此您应该尽可能少地使用它。 (如果可用,request.registry 是一个不错的选择)
    • 再次感谢。是的 request.registry 可用(至少在视图中)。我猜方法 2 听起来最好将视图功能和模板分开。虽然这会增加编码量,但选项 3 会导致不必要的编码复杂化。记住我处于哪种模式并且使模板复杂化
    猜你喜欢
    • 2021-08-01
    • 2021-06-17
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 2010-09-28
    相关资源
    最近更新 更多