Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python cookies与数据存储_Python_Google App Engine_Session Cookies_App Engine Ndb - Fatal编程技术网

Python cookies与数据存储

Python cookies与数据存储,python,google-app-engine,session-cookies,app-engine-ndb,Python,Google App Engine,Session Cookies,App Engine Ndb,在寻找一种在我的应用程序中进行会话的好且高效的方法时,我发现了 GAEB令人惊讶,但对于我的需求来说非常广泛:我不需要联邦成员登录,也不需要默认的用户结构,但我喜欢它的设计结构以及它们解决一些问题(路由、表单等)的方式 GAES非常简单,但对于治疗会话来说非常强大。我最喜欢的是它将所有内容存储在cookie中的方式,在本例中,它将完整的用户实体存储在cookie中,因此在下一页调用中,不会执行其他数据存储命中操作:用户数据总是从cookie中读取(很明显,这需要在用户更新某些内容时更新数据,这是

在寻找一种在我的应用程序中进行会话的好且高效的方法时,我发现了

GAEB令人惊讶,但对于我的需求来说非常广泛:我不需要联邦成员登录,也不需要默认的用户结构,但我喜欢它的设计结构以及它们解决一些问题(路由、表单等)的方式

GAES非常简单,但对于治疗会话来说非常强大。我最喜欢的是它将所有内容存储在cookie中的方式,在本例中,它将完整的用户实体存储在cookie中,因此在下一页调用中,不会执行其他数据存储命中操作:用户数据总是从cookie中读取(很明显,这需要在用户更新某些内容时更新数据,这是不常见的)

另一方面,GAEB只存储用户ID,然后在每次页面调用中检索用户名和用户电子邮件。这是它使用的BaseHandler代码的一部分(GAEB使用NDB模型):

电子邮件也是如此,在render_template函数中,它执行以下操作:

def render_template(self, filename, **kwargs):
    .... some code.....

    # set or overwrite special vars for jinja templates
    kwargs.update({
        'app_name': self.app.config.get('app_name'),
        'user_id': self.user_id,
        'username': self.username,
        'email': self.email,
        ... more vars ...
    })
    kwargs.update(self.auth_config)
似乎从数据存储中读取了2次(一次用于用户名,一次用于电子邮件),因为此函数生成
models.User.get\u by\u**字段**(long(self.User\u id))

我唯一不知道确切的含义是@webapp2.cached_属性,这可能意味着所有这些数据存储读取都是从缓存中完成的,实际上不会命中数据存储


有人能告诉我什么是更好的解决方案,以保存点击到数据库?似乎最好将所有用户数据都放在一个cookie中(显然是安全的),并且不要在每次页面调用时都点击数据存储,但可能我错了(我对GAE比较在行),所有对数据存储的读取都被缓存,然后是免费的。

在cookie中保存会话数据是非常不鼓励的:

  • 它必须随每个请求一起传输(移动连接速度慢)
  • 可以传输到GAE的HTTP头大小是有限的(64Kb,如果我没记错的话)——这是可以存储的数据上限
  • 即使您对会话进行加密和签名,您仍然容易受到回复攻击(您无法安全地执行注销)
我不知道您提到的实现,但我们的CMS中有一个会话实现,请参阅。 一般的想法是生成一个随机字符串(用作会话标识符)。 在会话加载时,执行数据存储“按键获取”(这是缓存的,因此,如果该对象仍在memcache中,它将根本不会命中数据存储)

并且,仅当存储在会话内的数据被改变或者会话未被修改时,才执行保存 已在过去5分钟内更新。
然后,您可以将用户对象的值复制到会话中,并且不会有额外的数据存储请求。

感谢您的回复,我将分析您的代码。我只看到一件很快的事情:为什么不使用NDB而不是DB。更好的是,它自动缓存实体(或者应该这样做),所以对数据库的访问更少。顺便说一句,我拒绝在cookie中存储完整的实体,我发现了更多的复杂性,比如同一用户在不同设备上的两个会话……您的代码似乎很好,但我认为现在我根本不会使用会话,因为我只需要知道用户ID和他想要使用的语言,因此,将其存储在安全cookie上可以解决我的需要(我只是在每次调用时检索它,检索的数据非常少,大约20字节)。我们使用ndb不仅仅是为了能够独立于数据存储项的总体缓存时间来指定memcache项的生存期。Cookie语言提示:搜索引擎蜘蛛(如google蜘蛛)不接受Cookie。如果你想让他们用不同的语言索引你的网站,你需要一种不同的方法:)嗯,非常好的cookies提示,我不知道。蜘蛛会接受会话吗?。好的,NDB解释一下,看起来你考虑了很多。我会重新考虑我的策略。您的代码(对我来说,用于我的项目)的唯一问题是,要杀死旧会话,您需要使用一个任务,该任务需要taks.py文件,该文件使用更多导入。。。还有更多包含大量代码的文件。我必须寻找另一种方法来执行周期性TAK。谢谢。如果你将会话id插入到你网站上的所有URL中(而不是存储在cookie中),它可能会起作用,但是不能保证爬行器会及时跟踪链接。他们可能现在索引您的起始页,并在以后的任何时间检查这些链接(该会话可能同时过期)。我们的解决方案是在会话之外处理语言,并在每个url中插入两个字母的语言代码(德语为“/”变成“/de/”,英语为“/en/”等等)。这对蜘蛛很有效。Appengine提供了一个cron api。您可以使用它从数据存储中删除过期的会话。
def render_template(self, filename, **kwargs):
    .... some code.....

    # set or overwrite special vars for jinja templates
    kwargs.update({
        'app_name': self.app.config.get('app_name'),
        'user_id': self.user_id,
        'username': self.username,
        'email': self.email,
        ... more vars ...
    })
    kwargs.update(self.auth_config)