是否可以在Google App引擎中的运行时更改URL处理程序?

时间:2016-03-12 07:46:41

标签: google-app-engine

我有两个班级MainHandlerControlPanel。 MainHandler类显示主页并对用户进行身份验证。它负责处理URL /。用户成功通过身份验证后,我希望将处理程序更改为ControlPanel,以便URL保持不变,但会呈现不同的视图。这可以在Google App Engine中使用吗?

以下是我尝试过的代码(失败了):

class MainHandler(webapp2.RequestHandler):
    def get(self):
        # Show Home page

    def post(self):
        # Get user Credentials
        status=authenticate(self.request.get('username'),self.request.get('password'))
        if(status):
            global handler
            handler = ControlPanel
            self.get()
        else:
            self.get()



class ControlPanel(webapp2.RequestHandler):
    def get(self):
        self.response.write("Welcome!!")

handler = MainHandler

app = webapp2.WSGIApplication([
    ('/', handler),
], debug=True)

1 个答案:

答案 0 :(得分:1)

最简单的方法之一是使用Python Decorator

说明这种方法的玩具程序

这是一个玩具程序,我已经滥用查询字符串"登录"目的。

行为

  • 访问http://localhost:8080/?allow会显示Control Panel, 和
  • 访问http://localhost:8080/会显示PLEASE LOG IN 用户。

概要

我们的玩具程序由三个简单部分组成:

  • require login装饰者。我们将这个装饰器用于需要我们的用户通过在定义上方添加@require_login来登录的请求。如果用户已通过身份验证(根据user_is_authenticated),那么我们将允许请求正常完成。如果没有,我们会将PLEASE LOG IN返回给用户。
  • ControlPanel课程。这是需要身份验证的页面。我们需要通过添加@require_login装饰器进行身份验证,并在用户登录时向其显示字符串control panel
  • user_is_authenticated功能。这是我们检查用户是否已登录的方式,根据某些条件返回TrueFalse。在我们的示例中,我们会检查the query string是否为allow

实施

import webapp2

def user_is_authenticated(request):

    return request.query_string == "allow"

def require_login(original):

    def check(self, *args, **kwargs):
        if not user_is_authenticated(self.request):
            # show homepage and authenticate
            self.response.write('PLEASE LOG IN')
        else:
            # authenticated, let them see the requested page
            return original(self, *args, **kwargs)

    return check

class ControlPanel(webapp2.RequestHandler):

    @require_login
    def get(self):
        self.response.write('control panel')

        return

app = webapp2.WSGIApplication([
    ('/', ControlPanel)
], debug=True)

注意

check有一百万种方法可以表现,而且没有一种方法可以普遍正确。而不只是写一个不同的页面。您可能希望重定向到登录页面,返回403 HTTP响应,或显示该页面的其他版本。

此外,我们的user_is_authenticated功能显然不会用于实际身份验证,并且不适用于此目的。

资源

您可能需要查看以下内容以获取更多建议或说明。