2015-12-29 4 views
2

Я новичок в пирамиде.Как добавить настройки вашего приложения в рамки для сохранения пирамиды?

Проблема: я не могу понять, как конкретные настройки приложения (пары ключевых значений) работают в пирамиде.

Это то, что я сделал после того, как различные поиски Google и других StackOverflow ответов:

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 = '' 

Это, как я начинаю свой сервер в develpoment

pserve development.ini 

Я прочитал, что request.settings может дать мне , но этот подход для меня невозможен, так как мой ключ содержит имя файла размером 1,5 ГБ, и он должен присутствовать в памяти все время. Загрузка этого файла на сервер занимает около 5 минут, поэтому он не может загружать файл по требованию.

Прошу совета.

Большое спасибо за помощь.

Update:

Спасибо всем ответы, я, наконец, сделал его работу.

Это как моя основная функция выглядит следующим образом:

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') 

И я установил свои настройки для приложения (разработка/продуктi on.py) нравится эта

[custom] 
my_key = value 

С уважением

HM

ответ

1

Вот мой рабочий раствор:

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'] 
+0

Спасибо. Создание файла настроек python из файла настроек (* .ini), предоставленного во время выполнения, является единственным возможным решением. –

2

Самый простой способ ставит свои настройки в приложение основной раздел с точкой разделенных имен.Пример:

[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 трубопровод не принесет вам настройку из других разделов, и вы должны повторной обработки файла INI с ConfigParser, если вы хотите получить доступ к другим разделам (насколько я знаю).

Если вам нужно загрузить большое количество данных во время разработки, просто сохраните имя файла в настройках и загрузите файл, когда вам нужно получить доступ к данным, чтобы вы не замедляли запуск веб-сервера.

+0

Спасибо за помощь. Я не хочу следовать запросу request.registry.settings.get для доступа к настройкам, поскольку я храню путь к файлу в настройках, которые я всегда хочу в памяти. request.registry.settings.get ограничивает доступ к настройкам только в представлении. Есть ли другой путь? Как и в django, я могу получить доступ к настройкам с помощью настроек импорта django.conf в любом месте, не обязательно в представлении, то же самое, что я ищу в пирамиде. Мне нужно загрузить это (GoogleNews-vectors-negative300.bin.gz) [https://code.google.com/p/word2vec/] –

+0

Поскольку этот файл большой, я хочу всегда иметь его в памяти вместо загружая его по каждому запросу. Какие-либо предложения? –

+0

"request.registry.settings.get ограничивает доступ к настройкам только в представлении" <- это неверно. –

0

Если, как я, вы используете PasteDeploy с Пирамидой, the Pyramid docs here объяснить, как вы можете использовать [DEFAULT] раздел в файле конфигурации .ini для хранения пользовательских параметров.

Вам также может быть полезно прочитать the documentation on .ini files, так как он дает некоторые фрагменты, которые делают его намного понятнее.