php - Google App Engine 的简单用户管理示例?

标签 php python google-app-engine

我是 Google App Engine 的新手。在阅读本教程时,我发现我们在 php-mysql 中所做的一些事情在 GAE 中不可用。例如,在 dataStore 中,自动增量功能不可用。我也对 GAE 中的 session 管理感到困惑。总之,我很困惑,无法想象整个事情。

请告诉我一个简单的用户管理系统,包括用户注册、用户登录、用户注销、 session (创建、管理、销毁)与数据存储。另外请告诉我在哪里可以获得简单但有效的示例。

提前致谢。

最佳答案

我倾向于使用自己的用户和 session 管理

对于我的 web 处理程序,我将附加一个名为 session 的装饰器和一个名为 authorize 的装饰器。 session 装饰器将为每个请求附加一个 session ,而 authorize 装饰器将确保用户被授权。

(请注意,授权装饰器特定于我如何开发我的应用程序 - 用户名是大多数请求中的第一个参数)。

例如,一个 web 处理程序可能看起来像:

class UserProfile(webapp.RequestHandler):
  @session
  @authorize
  def get(self, user):
     # Do some funky stuff
     # The session is attached to the self object.
     someObjectAttachedToSession = self.SessionObj.SomeStuff
     self.response.out.write("hello %s" % user)

在上面的代码中,session 装饰器根据请求中存在的 cookie 附加了一些我需要的 session 内容。 authorize header 将确保用户只有在 session 正确的情况下才能访问该页面。

装饰器代码如下:

import functools
from model import Session
import logging

def authorize(redirectTo = "/"):
    def factory(method):
        'Ensures that when an auth cookie is presented to the request that is is valid'
        @functools.wraps(method)
        def wrapper(self, *args, **kwargs):

            #Get the session parameters
            auth_id = self.request.cookies.get('auth_id', '')
            session_id = self.request.cookies.get('session_id', '')

            #Check the db for the session
            session = Session.GetSession(session_id, auth_id)           

            if session is None:
                self.redirect(redirectTo)
                return
            else:
                if session.settings is None:
                    self.redirect(redirectTo)
                    return

                username = session.settings.key().name()

                if len(args) > 0:               
                    if username != args[0]:
                        # The user is allowed to view this page.
                        self.redirect(redirectTo)
                        return

            result = method(self, *args, **kwargs)

            return result
        return wrapper
    return factory

def session(method):
    'Ensures that the sessions object (if it exists) is attached to the request.'
    @functools.wraps(method)
    def wrapper(self, *args, **kwargs):

        #Get the session parameters
        auth_id = self.request.cookies.get('auth_id', '')
        session_id = self.request.cookies.get('session_id', '')

        #Check the db for the session
        session = Session.GetSession(session_id, auth_id)           

        if session is None:
            session = Session()
            session.session_id = Session.MakeId()
            session.auth_token = Session.MakeId()
            session.put()

        # Attach the session to the method
        self.SessionObj = session           

        #Call the handler.          
        result = method(self, *args, **kwargs)

        self.response.headers.add_header('Set-Cookie', 'auth_id=%s; path=/; HttpOnly' % str(session.auth_token))
        self.response.headers.add_header('Set-Cookie', 'session_id=%s; path=/; HttpOnly' % str(session.session_id))

        return result
    return wrapper

def redirect(method, redirect = "/user/"):
    'When a known user is logged in redirect them to their home page'
    @functools.wraps(method)
    def wrapper(self, *args, **kwargs):
        try:    
            if self.SessionObj is not None:
                if self.SessionObj.settings is not None:
                    # Check that the session is correct
                    username = self.SessionObj.settings.key().name()

                    self.redirect(redirect + username)
                    return
        except:
            pass
        return method(self, *args, **kwargs)
    return wrapper

关于php - Google App Engine 的简单用户管理示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1030293/

相关文章:

php - Codeigniter 中多语言管理员的 linux 权限问题

php - 在 CakePHP 2.x 分页中按计算的 MySQL 字段排序

python - 模块命名与库相同

python - 保存数据的最佳方法

php - 如何使用 php 访问谷歌云数据存储?

PHP is_file() 无法正常工作

php - 在 ListView 中显示微调器中所选项目的数据(android、mysql、php)

python - 如何在 Tensorflow 训练期间打印梯度?

python - Python GAE datastoreAttributeError : 'NoneType' object has no attribute

java - 交易中如何做柜台? (分片计数器)