【问题标题】:Composite app route issue复合应用程序路由问题
【发布时间】:2014-07-14 06:19:09
【问题描述】:

在我的 Pyramid 应用程序中,我设置了一个复合应用程序,我的主应用程序位于 /,我的管理门户位于 /admin

[composite:main]
use = egg:paste#urlmap
/ = mainapp
/admin = adminapp

[app:mainapp]
use = egg:myApp#main

[app:adminapp]
use = egg:myApp#admin

我还在我的 __init__.py 方法中添加了两个单独的初始化方法,以便我可以有两个单独的 add_request_methods 和身份验证策略 - 一个用于一般用户,另一个用于管理员。

为了测试这一点,我添加了两条路线,一条为:

config.add_route('admin_login_handler', '/admin/login/')

用于admin门户登录,其他为:

config.add_route('login_handler', '/login/')

用于一般网站登录。假设,我会看到两个不同的模板,每个视图一个,并且我会为管理员和普通用户提供一个单独的请求对象——self.request.admin 用于管理员,self.request.user 用于用户。

但是,当我转到/admin/login/ 时,会显示/login/ 模板。基本上,我的主应用程序的路由现在位于//admin 下,并且我的管理路由被忽略了。这不是我想要的。但是,在查看/admin 路由时,我确实得到了我想要的self.request.admin 对象,并且在我的/ 路由上得到了我的self.request.user 对象,无论显示的模板/视图如何。

我该如何解决这个问题,以便/admin/... 的路由不会与我的/ 路由“重新映射”,并且我在两个不同的路由前缀下有两个单独的应用程序?

【问题讨论】:

    标签: python pyramid wsgi paster


    【解决方案1】:

    为了解决这个问题,我将config.scan(ignore="myApp.views.main") 添加到我的__init__.admin_app 方法中,同样,将config.scan(ignore="myApp.views.admin") 添加到我的__init__.main_app 方法中。请注意将视图分成两个文件,以使其明确且易于处理。

    这将两个应用程序之间的两组路由分开,然后我能够让我的两个授权策略以及我的config.add_request_methods 生效——一个检查admin 表,另一个检查user table -- 在各自的初始化方法中。

    config.add_request_method(AuthHelper.get_user, 'user', reify=True)  # Global user object
    

    config.add_request_method(AuthHelper.get_admin, 'admin', reify=True) # Global admin object
    

    根据我的.ini 文件,我的管理路由使用/admin 的隐式“路由前缀”进行映射。

    到目前为止,这个实现很好。希望这可以在某个时候对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-15
      • 2017-10-05
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 2014-11-25
      • 2019-01-26
      • 2012-09-22
      相关资源
      最近更新 更多