在我的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/...
的路由不会使用/
路由“重新映射”,并且我在两个不同的路由前缀下有两个单独的应用程序?
答案 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
的隐式“路由前缀”进行映射。
到目前为止,这个实现非常好。希望这可以帮助某人。