我有两个班级MainHandler
和ControlPanel
。 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)
答案 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
功能。这是我们检查用户是否已登录的方式,根据某些条件返回True
或False
。在我们的示例中,我们会检查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
功能显然不会用于实际身份验证,并且不适用于此目的。
您可能需要查看以下内容以获取更多建议或说明。