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 单身的替代品?_Python_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Python 单身的替代品?

Python 单身的替代品?,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我是Python和应用程序引擎(以及服务器端!)的新手,我正在尝试创建非常简单的CMS。应用程序的每个部署都将有一个且只有一个company对象,从以下对象实例化: class Company(db.Model): name = db.StringPropery() profile = db.TextProperty() addr = db.TextProperty() 我试图提供更新公司简介和其他详细信息的工具 我的第一个想法是建立一个公司实体singleton。但

我是Python和应用程序引擎(以及服务器端!)的新手,我正在尝试创建非常简单的CMS。应用程序的每个部署都将有一个且只有一个company对象,从以下对象实例化:

class Company(db.Model):
    name = db.StringPropery()
    profile = db.TextProperty()
    addr = db.TextProperty() 
我试图提供更新公司简介和其他详细信息的工具

我的第一个想法是建立一个公司实体singleton。但是经过仔细观察(虽然还远远没有完全理解),我得到的印象是,这样做是困难的,也是不可取的

所以我想,也许对于CMS的每一次部署,我都可以一次性运行一个脚本(由一个完全模糊的URL触发),该脚本只是实例化该公司。从那时起,我将使用
theCompany=Company.all()[0]

这样做明智吗

然后我想起那个线程中有人建议只使用一个模块。所以我只是创建了一个Company.py文件,并在其中插入了一些变量。我曾在SDK中尝试过这一点,但似乎效果不错——令我惊讶的是,修改后的变量值在请求之间“幸存”

请原谅我的无知,但是,我假设这些值只保存在内存中,而不是磁盘上——不像数据存储之类的东西?这是一个稳健的解决方案吗?(模块变量是否在我的应用程序脚本的所有调用的范围内?

全局变量是“.”这意味着您的应用程序的每个特定实例将在请求之间记住这些变量的值。但是,当实例关闭时,这些值将丢失。因此,我不认为您真的希望将这些值存储在模块级变量中(除非它们是不需要更新的常量)

我认为你最初的解决方案会很好。您甚至可以使用该工具创建原始实体,这样就不需要一个模糊的页面来实例化唯一的
Company
对象

如果按键检索singleton
Company
实体,还可以使其检索速度加快一点


如果需要频繁检索此实体,则可以使用缓存技术避免数据存储的往返。最快的方法是在从数据存储中检索到
公司
实体后,应用程序缓存该实体。为了防止实体过时,您还可以应用程序缓存上次检索实体的时间,如果该时间超过N秒,则可以从数据存储中重新获取该时间。有关此选项的更多详细信息以及它与其他选项的比较,请查看Nick Johnson的文章。

听起来您正试图提供一种方法,使您的应用程序能够在每个应用程序的基础上进行配置

为什么不使用数据存储来存储具有密钥名称的公司实体?然后您将始终知道如何获取公司实体,并且您将能够编辑公司而无需重新部署

company = Company(key_name='c')
# set stuff on company....
company.put()

# later in code...
company = Company.get_by_key_name('c')
用于存储公司的详细信息,避免重复调用数据存储


除了memcache之外,还可以使用模块变量来缓存值。正如您所看到的,它们是在请求之间进行的。

我认为您所读到的方法是最简单的:

  • 使用模块变量,在
    None
    中初始化
  • 为这些变量提供访问器(get/setter)
  • 访问变量时,如果其值为None,则从数据库中获取该变量。否则,就用它吧

这样,您将拥有模块提供的应用程序范围的变量(不会一次又一次地实例化),它们将被共享,您也不会丢失它们。

因为Dave提到实体可能会被修改,跟踪实体最后一次从数据存储中获取的时间,并在一段时间后重新获取它,可能是值得的。这将确保应用程序缓存的实体副本与规范数据存储值不同步的时间有上限。