用Google App Engine进行用户处理

标签:Google App Engine, Python

Google App Engine一个很方便的地方就是用户可以直接使用Google账号登录,省去了注册账号的麻烦。
所以不会用Users类可不行,于是继续翻译。

首先把文档列出来吧:
官方入门指南的Using the Users Service(英文)
上文的同人汉化版(目前需通过代理访问)
Google Accounts API文档(英文)
我主要说的就是第3个文档。

先给出一个比较全的例子:
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class MainPage(webapp.RequestHandler):
  def get(self):
    user = users.get_current_user()
    if user:
      greeting = ("Welcome, %s %s! (<a href=\"%s\">sign out</a>)" %
                  (users.is_current_user_admin() and "admin" or "user",
		  user.nickname(), users.create_logout_url("/")))
    else:
      greeting = ("<a href=\"%s\">Sign in or register</a>." %
                  users.create_login_url("/"))

    self.response.out.write("<html><body>%s</body></html>" % greeting)

application = webapp.WSGIApplication([('/', MainPage)], debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()
查阅google.appengine.api.users的函数文档,可以得知这些函数的用法:
users.get_current_user方法将返回当前提出该请求的用户(即访问该页面的浏览者)。如果用户已登录,将返回一个User类的对象;否则返回None。
users.create_login_url将生成一个登录用的url。参数为函数返回后重定向到的页面,可以是完整路径,也可以是相对路径。
users.create_logout_url将生成一个退出登录用的url。参数同上。
users.is_current_user_admin判断当前用户是不是该应用程序的管理员,是则返回True。

所以这段代码将检查用户是否登录。
如果未登录,则生成登录链接。
如果已登录,则显示欢迎语句,并给出退出链接。生成欢迎语句时,会根据是否为管理员,而显示不同内容。

此外,在app.yaml里配置login: admin,可以很方便的使其需要登录为管理员才可使用。你也可以参考详细的配置文档

接着再来说说Users类
这个类可以直接传email来构造一个对象,也可以用create_login_url来生成。
前者并不验证email,可以保存在数据库里,但并不表示其为一个有效的Google账号(a valid Google account),也不会匹配任何真正的用户(a real user)。
后者则可以生成真实的Google用户。

如果是在本地的dev_appserver上运行,create_login_url生成的url是不进行验证的。且勾上Sign in as Administrator后,即可登录为管理员。

另外,Users类的对象还可保存在数据库中,这里有示例代码,我就不再copy了。
从数据库中取出的用户可以更改属性,包括email,所以不推荐将email作为主键,不然无法自动更新(主键是不能update的)。

最后,据我本地实验,登录信息应该是按session处理的,关闭浏览器后,就不再保存登录信息了。也不知道有什么办法可以弄成cookie之类的,以长期保持登录状态。(因为create_login_url是不从cookie读取数据的。)

0条评论 你不来一发么↓

    想说点什么呢?