我有一个python脚本,作为肚子的memcached python包装器的附加包装器。我有这样的事情:
class CacheIt(object):
def __init__(self, host=<hostname>, port=11211, **kwargs):
...
我希望能够从我的ini文件中检索memcached主机名,但我不想指定哪个文件,因为它可能来自development.ini或production.ini或test.ini。我需要将当前ini文件的“查找”设置为动态,这意味着应用程序应该知道当前的ini文件是什么,从而从设置中检索主机名。
我不能使用线程本地get_current_request来反过来检索设置文件,因为在应用程序启动时返回值为None(我将我的类的实例附加到NewRequest事件)。
这:
from paste.deploy.loadwsgi import appconfig
config = appconfig('config:development.ini', 'myapp', relative_to='.')
但是,在我使用它之前,我需要首先了解路径。这意味着如果我使用它,我需要在每次部署时将development.ini的值更改为production.ini,如果我测试则需要将test.ini的值更改为test.ini。当然必须有更好的方法来做到这一点。
答案 0 :(得分:0)
不是最好的方式,但这是一个想法。你必须在某处保存配置文件的路径。
您甚至可以在配置文件中保存配置文件的路径......
类似的东西:
config_file=%(here)s/development.ini
当加载此文件时,config.registry.settings
会有一个条目。从那里你有两个选择。您可以像pid
一样使用pid
编写一个文件,但使用当前的设置文件。或者,您可以创建api调用以从实时应用程序中查询设置。说实话,我会把它写在一个文件中。从应用程序查询设置似乎不太好。
然后你必须打开该文件并读取file.ini的路径,然后将其作为配置文件加载。
或者你可以尝试类似的东西:
ps -ax | egrep "`cat pyramid.pid`.*[s]tart" | cut -d" " -f14
从python运行时你可以省略“cut”并自己从python中删除它来获取config ini文件。
换句话说,您将获得用于pyramid.pid中包含的pid的命令行,此文件仅在守护进程模式下创建。当你有命令行时,你可以得到配置文件...缺点是它只适用于pserve或任何实际保存PID并使用config作为参数的东西。如果您正在使用uWSGI等,可能无法做到这样的事情。
答案 1 :(得分:0)
在您的活动中(NewRequest
),您可以检索注册表,从而检索其中的所有设置。
event.request.registry
将包含完整的注册表。
我的另一个建议是,您创建了一个类的实例,并在完成其余配置后在main()
中进行所有配置。这就是SQLAlchemy设置的工作原理。举一个简单的例子,看看CouchDB and Pyramid集成。 Pyramid and .ini configuration中提供了相同的答案。如果您想在配置完成后但在提出任何请求之前设置内存缓存,也可以附加到ApplicationCreated
事件。