Google App Engine:根据用户角色使用不同的处理程序

时间:2013-12-18 22:41:27

标签: google-app-engine python-2.7 app-engine-ndb webapp2

我的webapp有两个用户'角色':' Designer '和' Programmer '。

应用程序的首页由以下人员处理:

class Front(BaseHandler):
    def get(self):
        role = self.get_user_role() #somehow gets the current user role.
        if role == 'Designer':
            #redirect to DesignerFront(BaseHandler)
        elif role == 'Programmer':
            #redirect to ProgrammerFront(BaseHandler)

class DesignerFront(BaseHandler):
    # do something

class ProgrammerFront(BaseHandler):
    # do something

我目前有一个处理两个角色查询的处理程序,我认为这可能会造成不必要的代价。

是否可以将流程转发到不同的处理程序,如上例所示?另外,这是推荐的吗?也许有一种更好的方法可以做到这一点,我不知道。

我将不胜感激任何帮助。谢谢。

2 个答案:

答案 0 :(得分:0)

您可以将HTTP 307重定向返回到DesignerFront或ProgrammerFront网址。

这是可以接受的。您通常不希望经常重定向,因为它会降低性能(用户必须请求Front页面,重定向,然后转到相应的页面)。如果用户在访问您的网站时只遇到过这种情况,那就没那么重要了。

答案 1 :(得分:0)

继续发表评论。您可以直接调用处理程序,在许多情况下,这将优先于重定向。

最大的原因是简化您的安全模型。如果您根据用户角色重定向,则必须在特定于用户的处理程序中再次执行安全检查,因为任何人都可以猜测处理程序URL。通过直接调用处理程序,您已经执行了检查,只需在一个位置执行和维护它。

您可以执行以下操作

class Front(BaseHandler):
    def get(self):
        role = self.get_user_role() #somehow gets the current user role.

        if role == 'Designer':

            dh = DesignerFront(self.request,self.response)
            dh.get()

        elif role == 'Programmer':

            #redirect to ProgrammerFront(BaseHandler)

我没有对我的任何项目使用webapp(2),我发现这些路由不适合开放式URL方案以及其他一些URL映射工具/库(至少对我的项目而言)。

在我们较大的项目中,用户视图由许多依赖于上下文(他们在哪里),他们的角色(他们是谁)等的部分组成......所以顶级URL只提供容器视图,并且然后我们基于(request.type,context,user,view)相应的组件进行查找以填充页面的各个部分,因此顶级视图定义了调用上下文和所有权限,然后查找/获取各种找到的组件。 (我不会在这里详细介绍,因为它可能会分散您的注意力并引入更多不熟悉的框架)。