如何在金字塔休息框架中添加您的应用程序特定设置?

How to add your app specific settings in pyramid rest framework?

我是金字塔新手。

问题是我无法弄清楚应用特定设置(键值对)在金字塔中的工作方式。

这是我在各种 google 搜索和其他 Whosebug 答案之后所做的:

def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    if '__file__' in global_config:
        settings.update(
            load_sensitive_settings(global_config['__file__'], global_config))
    config = Configurator(settings=settings)
    config.include('pyramid_chameleon')
    # config.add_static_view('static', 'static', cache_max_age=3600)
    # config.add_route('home', '/')
    config.add_route(
        'tags',
        '/tags', request_method='POST', accept='application/json', )
    config.scan()
    return config.make_wsgi_app()


def load_sensitive_settings(configurationPath, defaultByKey):
    'Load sensitive settings from hidden configuration file'
    # configFolder, configName = os.path.split(configurationPath)
    # sensitivePath = os.path.join(configFolder, '.' + configName)
    sensitivePath = configurationPath
    settings = {}
    configParser = ConfigParser.ConfigParser(defaultByKey)
    if not configParser.read(sensitivePath):
        log.warn('Could not open %s' % sensitivePath)
        return settings
    settings.update(configParser.items('custom'))
    return settings

我有一个文件,我试图在其中获取这样的设置:

from pyramid.threadlocal import get_current_registry
settings = get_current_registry().settings
value = settings['my_key']

但我总是将设置对象设置为 None。

这就是我在 development.ini

中定义自定义设置的方式
[custom]
my_key = ''

这就是我在开发中启动服务器的方式

pserve development.ini

我读到 request.settings 可以给我设置,但是这种方法对我来说不可行,因为我的密钥包含一个 1.5GB 的文件名,并且它必须一直存在于内存中时间。在服务器中加载该文件大约需要 5 分钟,因此无法按需加载文件。

请指教

非常感谢您提前提供的所有帮助。

更新:

感谢大家提供的答案,我终于成功了。

我的主要功能是这样的:

def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    config = Configurator(settings=settings)
    config.include('pyramid_chameleon')
    if '__file__' in global_config:
        init_config(global_config['__file__'])

然后我制作了一个配置文件,这是我的配置文件的样子:

import ConfigParser

settings = dict()

def init_config(filename):
    config = ConfigParser.ConfigParser()
    config.read(filename)
    settings_dict = config.items('custom')
    settings.update(settings_dict)

现在无论我想设置什么地方,我都可以:

from projectname.config import settings
settings.get('my_key')

我把我的应用特定设置 (development/production.py) 像这样

[custom]
my_key = value

此致

最简单的方法是将您的设置放入应用 main 部分,名称以点分隔。示例:

[app:main]
websauna.site_name = Trees
websauna.site_tag_line = Enjoy
websauna.site_url = http://localhost:6543
websauna.site_author = Trees team

那么你可以这样做:

my_settings_value = request.registry.settings.get("websauna.site_name", "Default value)

WSGI 管道不会为您带来其他部分的设置,如果您想访问其他部分(据我所知),您需要使用 ConfigParser 重新解析 INI 文件。

如果您在开发期间需要加载大量数据,只需在设置中存储文件名并在需要访问数据时加载文件,这样就不会减慢 Web 服务器的启动速度。

这是我的工作解决方案:

config.ini

[APP.CONFIG]
url = http://....


[SMTP.CONFIG]
smtp.server = ...
smtp.port = 25
smtp.login = ...
smtp.password = ...
smtp.from = ...


[DB.CONFIG] 
db.database=...
db.host=...
db.port=..
db.user=...
db.password=...

config.py

import configparser


config = configparser.ConfigParser()
config._interpolation = configparser.ExtendedInterpolation()
config.read(encoding='utf-8', filenames=['path to file/config.ini'])

smtp = config['SMTP.CONFIG']
db = config['DB.CONFIG']
mail = config['APP.CONFIG']

以及我如何在APP中使用它

from config import db
host = db['db.host']

如果您像我一样将 PasteDeploy 与 Pyramid 一起使用,the Pyramid docs here 解释如何使用 .ini 配置文件中的 [DEFAULT] 部分来保存您的自定义参数。

您也可以从阅读 the documentation on .ini files 中获益,因为它提供了一些片段,使一切变得更加清晰。