2010-11-17 77 views
4

我是一个Python & App Engine(和服务器端!)的新手,我试图创建非常简单的CMS。每个应用程序的部署将有一个 - 和只有一个-company对象,从以类似实例:单身人士的替代方案?

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

我试图提供设施更新公司资料及其他细节。

我的第一个想法是有一个公司实体单身人士。但看过(虽然远没有完全掌握)this thread我觉得这样做很困难而且不明智。

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

这是明智的吗?

然后我想起那个线程中的某个人建议使用一个模块。所以我刚刚创建了一个Company.py文件,并在其中添加了一些变量。我已经在SDK中尝试了这一点,它似乎工作 - 对我的惊喜,修改后的变量值在请求之间“存活下来”。

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

回答

2

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

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

如果您通过键检索单实例,则还可以使单实例Company实体的检索速度更快一些。

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

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,在请求之间。

0

我想你读到的方法是最简单的:

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

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

+0

由于Dave提到实体可能会被修改,所以追踪实体最后一次从数据存储区获取并在经过一段时间后重新获取实体可能是值得的。这将确保实体的应用程序缓存副本可能与规范数据存储区值不同步的时间有一定上限。 – 2010-11-17 20:12:45