读取存储在.ini文件中的信息

时间:2014-04-09 12:37:49

标签: python-2.7 pyramid

我正在用Python编写金字塔应用程序,我有几个脚本都需要相同的信息,这些脚本位于development.ini

如何从development.ini获取信息并将其分配给另一个脚本中的变量?这样我就可以接受这个

# development.ini

[app:main]
some.url = some_url

[other_thing]
info.partA = some_info
info.partB = some_other_info

并将其转换为此

# some_script.py

url = some_url
infoA = some_info
infoB = some_other_info

This page's解决方案使用def main(global_config, **settings):,但这对我来说毫无意义。 Thisthis页面使用ConfigParser.ConfigParser(),但我也没有这样做。

我对此很新,所以请你尽可能明确地说明一下吗?

4 个答案:

答案 0 :(得分:3)

好问题。 Pyramid可以使用PasteDeploy配置文件进行应用程序配置。因此它为此提供pyramid.paster。考虑您希望在第一次运行Web应用程序之前设置数据库表,或者拥有每天运行的维护脚本。您希望两个脚本也从development.ini / production.ini获取连接字符串。这被认为是很好的做法。

这是您已经知道的常见yourwebapp.__init__.py。通过运行bin\pserve development.ini

将PasteDeploy配置传递给main()函数
from pyramid.config import Configurator

from sqlalchemy import engine_from_config

from .models import DBSession, Base

def main(global_config, **settings):
    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)
    Base.metadata.bind = engine

    config = Configurator(settings=settings,
                          root_factory='tutorial.models.Root')
    config.include('pyramid_chameleon')
    config.add_route('wiki_view', '/')
    config.add_route('wikipage_add', '/add')
    config.add_route('wikipage_view', '/{uid}')
    config.add_route('wikipage_edit', '/{uid}/edit')
    config.add_static_view('deform_static', 'deform:static/')
    config.scan('.views')
    return config.make_wsgi_app()

要在另一个脚本中使用您的应用程序配置,请说some_script.py以及使用pyramid.paster中的方法来读取设置和从设置初始化日志记录。

from sqlalchemy import engine_from_config

from pyramid.paster import (
    get_appsettings,
    setup_logging,
    )

from .models import (
    DBSession,
    Base,
    )

def do_your_stuff(settings)
    "your custom script logic that extracts a certain settings and does something"




def main(argv=sys.argv):
    config_uri = argv[1]
    setup_logging(config_uri)
    settings = get_appsettings(config_uri)
    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)
    Base.metadata.create_all(engine)
    do_your_stuff(settings)

连接您在setup.py中为命令行脚本添加入口点所需的所有内容。仔细阅读console_script部分。您可以为脚本定义名称并指向some_script.py的“main”函数。这需要您为每个应用程序和脚本进行自定义。

from setuptools import setup

requires = [
    'pyramid',
    'pyramid_chameleon',
    'deform',
    'sqlalchemy',
    'pyramid_tm',
    'zope.sqlalchemy'
]

setup(name='tutorial',
      install_requires=requires,
      entry_points="""\
      [paste.app_factory]
      main = tutorial:main
      [console_scripts]
      initialize_db = yourwebapp.some_script:main
      """,
)

因为你更改了setup.py,你需要运行以下命令来创建你可以在'bin'文件夹中找到的控制台脚本(你调用pserve的文件夹)。我理所当然地认为这是运行virtualenv。

$ $VENV/bin/python setup.py develop

之后,您可以使用配置文件

运行脚本
$ $VENV/bin/initialize_db development.ini

在生产中使用另一个配置文件。那就是美丽。

$ $VENV/bin/initialize_db production.ini

多个第三方库提供由paster配置文件驱动的特殊辅助函数(工厂)。例如sqlalchemy,pyramid.zodbconn通常有类似*_from_config(settings)等名称的方法。

参考

我试着让你缩短一点。在其他金字塔应用中注意PasteDeploy主题和pyramid.paster。

答案 1 :(得分:1)

  

这个页面的解决方案使用def main(global_config,** settings):,但这对我来说毫无意义

来自http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/startup.html

  

请注意,作为**设置传递给Configurator构造函数的值的增强版本将在Pyramid视图可调用代码中以request.registry.settings的形式提供。您可以稍后从视图代码创建要访问的对象,并将它们放入作为设置传递给配置程序的字典中。然后它们将出现在应用程序运行时的request.registry.settings字典中。

使用[app:main]文件中ini中设置的含义变量可通过request.registry.settings词典在应用中访问。

http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/environment.html#adding-a-custom-setting

答案 2 :(得分:0)

import ConfigParser
config = ConfigParser.ConfigParser()
config.read("development.ini")

dConfig = config.__dict__['_sections'].copy()

url = dConfig['app:main']['some.url']
infoA = dConfig['other_thing']['info.partA']
infoB = dConfig['other_thing']['info.partB']

现在等于

url = some_url
infoA = some_info
infoB = some_other_info

如果thing位于development.iniproduction.ini以及[app:main],则:

info = self.request.registry.settings [“info”]

答案 3 :(得分:0)

您可以使用«get_settings()»

有一个例子" mongo_uri"在设置中

settings / development.ini:

[app:main]
use = egg:gps_tracker
mongo_uri = mongodb://localhost:27017/gps

<强> db.py:

from urllib.parse import urlparse
import pymongo

def includeme(config):
    settings = config.get_settings()
    mongo_db_url = urlparse(settings['mongo_uri'])
    settings['mongo_db_url'] = mongo_db_url
    settings['mongo_db_name'] = mongo_db_url.path[1:]
    settings['mongo_hostname'] = mongo_db_url.hostname
    settings['mongo_port'] = int(mongo_db_url.port or 27017)

    connection = pymongo.MongoClient(host=mongo_db_url.hostname,
                                     port=mongo_db_url.port)
    config.registry.mongo_connection = connection

view in context