如何在金字塔休息框架中添加您的应用程序特定设置?
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 中获益,因为它提供了一些片段,使一切变得更加清晰。
我是金字塔新手。
问题是我无法弄清楚应用特定设置(键值对)在金字塔中的工作方式。
这是我在各种 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 中获益,因为它提供了一些片段,使一切变得更加清晰。