2014-01-27 25 views
2

我正在阅读有关使用YAML将设置存储在GAE应用程序中的内容,我想我想这样做。我正在谈论我自己的常量,如API键和临时变量,而不是像app.yaml这样的标准GAE配置文件。Python和YAML-GAE应用程序设置文件

到目前为止,我为它使用了一个简单的settings.py文件(其中包括用于生产/测试/ etc环境的单独配置),但似乎没有做好足够的工作。

我甚至有一些严重的问题,当一个混帐合并覆盖一些设置(很难控制它)。

最终我想尽可能多地在数据存储中存储数据,但现在我正在寻找想法。

那么有没有人有任何想法或例子,简单的存储和访问,有时受保护,配置数据?

+0

我使用settings.yaml文件进行所有自己的设置。我自己并没有遇到问题。我使用单独的部分进行测试,产品等...因此每个部分都是独立的。这样我就不会交换/移动settings.yaml。 –

+0

我使用appengine_config:lib_config默认和挂钩:https://developers.google.com/appengine/docs/python/tools/appengineconfig#Python_Module_Configuration – voscausa

回答

2

存储的API密钥和配置变量在静态文件是通常总是一个坏主意,有几个原因:

  • 努力更新:你需要以更新部署新的应用程序值
  • 不安全:你可能会提交到版本控制系统并没有回来的路上
  • 不要放大:很多时候你必须为不同的域

那么,为什么不存储直接从所有这些值不同的密钥的安全十分开始在数据存储,尤其是当它实际上是如此容易得多,这里是如何:

所有你必须做的是为您的配置值创建一个新模型,并且只有一条记录。通过使用NDB,您可以开箱即用缓存,并且由于此配置文件的性质,您甚至可以对每个正在运行的实例进行缓存,以避免定期读取数据存储区。

class Config(ndb.Model): 
    analytics_id = ndb.StringProperty(default='') 
    brand_name = ndb.StringProperty(default='my-awesome-app') 
    facebook_app_id = ndb.StringProperty(default='') 
    facebook_app_secret = ndb.StringProperty(default='') 

    @classmethod 
    def get_master_db(cls): 
    return cls.get_or_insert('master') 

我也猜你已经有一个文件,最有可能被称为config.py,你有一些常量像这样的:

PRODUCTION = os.environ.get('SERVER_SOFTWARE', '').startswith('Google App Engine') 
DEVELOPMENT = not PRODUCTION 

如果不创建一个或者你不只是内容添加到该文件还有:

import model # Your module that contains the models 

CONFIG_DB = model.Config.get_master_db() 

终于可以说,无论在您的应用程序(导入后阅读,你可以简单地做你的配置值当然):

config.CONFIG_DB.brand_name 

从现在起,你甚至不必创建任何特殊形式来更新这些值(建议虽然),因为你可以从本地管理控制台或仪表板在生产上。

请记住,如果您要将该记录存储在本地变量中,则必须在更新值后才能重新启动instances以查看更改。


上述所有你可以在行动中看到它,我叫gae-init开源项目之一。

+0

这是一个很好的解决方案,但你如何保护自己不让你的值改变错误? 另外,如果您进行本地更改,是否必须手动复制本地数据库中的更改? – user2091046

+0

@ user2091046错误地更改值?以同样的方式保护你自己,以任何其他方式错误地改变它们......通过限制谁可以将这些值更改为最小值..对于本地值,可以使用默认值或通过提供参数' --storage_path'来避免重置本地数据库.. – Lipis

+0

我需要以这种方式手动输入生产中的配置数据吗?我希望配置数据根据应用程序运行的环境(测试/产品)轻松切换 – user2091046

1

由于其他答案中列出的原因,您不应将配置值存储在源代码中。在我的最新项目,我把配置数据在数据存储中使用这个类:

from google.appengine.ext import ndb 

class Settings(ndb.Model): 
    name = ndb.StringProperty() 
    value = ndb.StringProperty() 

    @staticmethod 
    def get(name): 
    NOT_SET_VALUE = "NOT SET" 
    retval = Settings.query(Settings.name == name).get() 
    if not retval: 
     retval = Settings() 
     retval.name = name 
     retval.value = NOT_SET_VALUE 
     retval.put() 
    if retval.value == NOT_SET_VALUE: 
     raise Exception(('Setting %s not found in the database. A placeholder ' + 
     'record has been created. Go to the Developers Console for your app ' + 
     'in App Engine, look up the Settings record with name=%s and enter ' + 
     'its value in that record\'s value field.') % (name, name)) 
    return retval.value 

你的应用程序将这样做是为了得到一个值:

AMAZON_KEY = Settings.get('AMAZON_KEY') 

如果在该键的值数据存储,你会得到它。如果没有,则会创建占位符记录并引发异常。该例外会提醒您转到Developers Console并更新占位符记录。

我发现这需要猜测出设置配置值。如果您不确定要设置什么配置值,只需运行代码,它会告诉您!