单身的替代品?

时间:2010-11-17 19:37:19

标签: python google-app-engine google-cloud-datastore

我是Python& App Engine(和服务器端!)新手,我正在尝试创建非常简单的CMS。应用程序的每个部署都有一个 - 只有一个--company对象,实例化为:

class Company(db.Model):
    name = db.StringPropery()
    profile = db.TextProperty()
    addr = db.TextProperty() 

我正在尝试提供更新公司资料和其他详细信息的工具。

我的第一个想法是拥有一个公司实体单身人士。但是看过(虽然远没有完全掌握)this thread我得到的印象是,做这件事很难,也是不可取的。

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

获取此实例

这是可取的吗?

然后我记得那个帖子中有人建议只使用一个模块。所以我刚刚创建了一个Company.py文件并在其中插入了一些变量。我已经在SDK中尝试了这一点,它似乎工作 - 令我惊讶的是,修改后的变量值在请求之间“幸存”。

请原谅我的无知但是,我认为这些值只存储在内存而不是磁盘上 - 不像数据存储区吗?这是一个强大的解决方案? (并且模块变量是否适用于我的应用程序脚本的所有调用?)

3 个答案:

答案 0 :(得分:2)

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

我认为您的原始解决方案可以正常运行。您甚至可以使用remote API工具创建原始实体,这样您就不需要一个模糊的页面来实例化唯一的Company对象。

如果您通过密钥检索单个Company实体,也可以更快地检索它。

如果您需要经常检索此实体,则可以使用缓存技术避免往返数据存储区。从数据存储区中检索后,最快的是对Company实体进行应用缓存。为了防止实体过时,您还可以应用缓存上次检索实体的时间,如果该时间超过N秒,则可以从数据存储区重新获取它。有关此选项的更多详细信息以及它与替代方案的比较,请查看Nick Johnson的文章Storage options on App Engine

答案 1 :(得分:2)

听起来您正试图为应用程序提供一种基于每个应用程序进行配置的方法。

为什么不使用数据存储区来存储带有key_name的公司实体?然后,您将始终知道如何获取公司实体,并且您将能够在不重新部署的情况下编辑公司。

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

# later in code...
company = Company.get_by_key_name('c')

使用memcache存储公司的详细信息,避免重复的数据存储区调用。

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

答案 2 :(得分:0)

我认为您阅读的方法最简单:

  • 使用在None中初始化的模块变量。
  • 为这些变量提供访问者(获取/设置者)。
  • 访问变量时,如果其值为None,则从数据库中获取它。否则,只需使用它。

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