我在GAE上有一个应用程序,用于检查管理员在调用任何网页之前是否已登录。我已经尝试了各种方法来管理登录过程。
Q1 - 我在第二个例子中的装饰师做错了什么?
Q2 - 是否通常会对帖子功能进行检查?
在每个get函数中使用if语句之前。问题是我会在每个函数中反复重复这个if语句。
class IncomePage(webapp2.RequestHandler):
def get(self):
if users.is_current_user_admin():
self.response.write('My Webpage')
else:
self.response.write('Please Login')
然后我试着让装饰师为我做这件事。它没有用,所以我做错了什么。
def check(func):
if users.is_current_user_admin():
return func
else:
response.write('Please Login') ### Doesn't work
class IncomePage(webapp2.RequestHandler):
@check
def get(self):
self.response.write('My Webpage')
答案 0 :(得分:5)
那不是装饰者。装饰器需要返回一个代替实际函数调用的包装器函数,它是需要进行测试然后调用原始函数的包装器。
def check(func):
def wrapper(*args, **kwargs):
if users.is_current_user_admin():
return func(*args, **kwargs)
else:
response.write('Please Login')
return wrapper
答案 1 :(得分:4)
如果处理程序的所有用户都必须登录并且为admin
,那么您可以在app.yaml中而不是在代码中指定限制。
看起来像
- url: /admin/.*
script: somefile.application
login: admin
请务必完整阅读文档,而不仅仅是浏览。很明显,你有一些额外的选择
auth_fail_action
描述登录时存在且用户不存在时采取的操作 登录。有两个可能的值:
重定向(默认值)。用户被重定向到Google登录 page,如果使用OpenID身份验证,则为/ _ah / login_required。该 登录后,用户将被重定向回应用程序URL 创建一个帐户。未经授权。该请求被拒绝 HTTP状态代码为401,并显示错误消息。
在文档的下方,您将看到示例。
答案 2 :(得分:1)
作为您自己的装饰者的替代品或通过app.yaml保护。
webapp2(您正在使用)具有处理程序,以便处理程序执行您需要的操作
请参阅https://webapp-improved.appspot.com/api/webapp2_extras/appengine/users.html