复合应用路线问题

时间:2014-07-14 06:19:09

标签: python pyramid wsgi paster

在我的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_method和身份验证策略 - 一个用于一般用户,另一个用于管理员。

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

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

用于管理门户登录,另一个用于:

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

用于一般网站登录。据说,我会看到两个不同的模板,每个视图一个,我会为管理员和一般用户设置一个单独的请求对象 - 管理员为self.request.admin,用户为self.request.user

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

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

1 个答案:

答案 0 :(得分:1)

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

这将两个应用程序之间的两组路由分开,然后我能够使我的两个授权策略与我的config.add_request_method一起生效 - 一个检查admin表和另一个检查user表 - 在每个相应的初始化方法中。

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

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

到目前为止,这个实现非常好。希望这可以帮助某人。