2

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

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

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

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

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

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

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

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

4

1 回答 1

1

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

这将两个应用程序之间的两组路由分开,然后我能够让我的两个授权策略生效,以及我config.add_request_method的 s - 一个检查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

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

于 2014-07-14T18:14:48.140 回答