我在GAE上有一个应用程序,可以在调用任何网页之前检查管理员是否已登录。 我尝试了各种方法来管理登录过程。
问题 1-示例2中的装饰器我在做什么?
问题2-通常也可以对发布功能进行检查吗?
在每个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')
那不是装饰。 装饰器需要返回一个包装器函数,该包装器函数将代替实际函数,而包装器则需要进行测试然后调用原始包装器。
def check(func):
def wrapper(*args, **kwargs):
if users.is_current_user_admin():
return func(*args, **kwargs)
else:
response.write('Please Login')
return wrapper
如果处理程序的所有用户都必须登录且均为admin
,则可以在app.yaml中而不是在代码中指定限制。
看起来像
- url: /admin/.*
script: somefile.application
login: admin
确保完全阅读文档,而不仅仅是阅读。 很明显,您还有一些其他选择
auth_fail_action
描述存在登录且用户未登录时采取的操作。有两个可能的值:
重定向(默认)。 用户将被重定向到Google登录页面,如果使用OpenID身份验证,则需要/ _ah / login_required。 登录或创建帐户后,用户将被重定向回应用程序URL。 未经授权。 该请求被拒绝,HTTP状态码为401和错误消息。
在文档的更下方,您将看到示例。
替代您自己的装饰器或通过app.yaml进行保护。
webapp2(您正在使用)具有用于处理程序的装饰器,以执行您需要的操作
请参阅https://webapp-improved.appspot.com/api/webapp2_extras/appengine/users.html