3

私が構築している (pyplay と呼ばれる) ピラミッド アプリでは、development.ini にあるアプリケーション設定を取得する必要があります。問題は、その設定を取得しようとしている場所がリクエスト変数にアクセスできないことです (たとえば、モジュール ファイルの最上位)。

したがって、ドキュメントでこの例を見た後: http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/configuration/django_settings.html最初は非常に単純でハードコーディングされたものを機能させるためだけに始めました。私の development.ini には [app:main] というセクションがあるので、試した簡単な例は次のとおりです。

from paste.deploy.loadwsgi import appconfig
config = appconfig('config:development.ini', 'main', relative_to='.')

しかし、アプリケーションは起動を拒否し、次のエラーを表示します:

ImportError: <module 'pyplay' from '/home/pish/projects/pyplay/__init__.pyc'> has no 'main' attribute

したがって、「main」の代わりに「pyplay」を配置する必要があるのではないかと考えて、先に進みましたが、代わりに次のエラーが発生しました。

LookupError: No section 'pyplay' (prefixed by 'app' or 'application' or 'composite' or 'composit' or 'pipeline' or 'filter-app') found in config ./development.ini

この時点で、私は少し立ち往生しており、何が間違っているのかわかりません。誰かが私にこれを行う方法を教えてもらえますか?

前もって感謝します!

編集:以下は私の development.ini ファイルの内容です (pish.theparam は私が取得しようとしている設定であることに注意してください):

###
# app configuration
# http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/environment.html
###

[app:main]
use = egg:pyplay

pyramid.reload_templates = true
pyramid.debug_authorization = false
pyramid.debug_notfound = false
pyramid.debug_routematch = false
pyramid.default_locale_name = en_US.utf8
pyramid.includes =
    pyramid_debugtoolbar
    pyramid_tm

sqlalchemy.url = mysql://user:passwd@localhost/pyplay?charset=utf8

# By default, the toolbar only appears for clients from IP addresses
# '127.0.0.1' and '::1'.
debugtoolbar.hosts = 127.0.0.1 ::1

pish.theparam = somevalue

###
# wsgi server configuration
###

[server:main]
use = egg:waitress#main
host = 0.0.0.0
port = 6543

###
# logging configuration
# http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/logging.html
###

[loggers]
keys = root, pyplay, sqlalchemy

[handlers]
keys = console

[formatters]
keys = generic

[logger_root]
level = INFO
handlers = console

[logger_pyplay]
level = DEBUG
handlers =
qualname = pyplay

[logger_sqlalchemy]
level = INFO
handlers =
qualname = sqlalchemy.engine
# "level = INFO" logs SQL queries.
# "level = DEBUG" logs SQL queries and results.
# "level = WARN" logs neither.  (Recommended for production systems.)

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s
4

3 に答える 3

3

ピラミッドでそれを行うのが難しい理由は、モジュール レベルの設定を持つことは常に悪い考えだからです。これは、モジュールがプロセスごとに 1 つの方法でしか使用できないことを意味します (異なるコード パスでは、異なる方法でライブラリを使用することはできません)。:-)

リクエスト オブジェクトにアクセスできないことを回避するためのハックは、少なくともグローバルを関数呼び出しの背後に隠して、グローバルがスレッドごと (基本的にはリクエストごと) に異なるようにすることです。

def get_my_param(registry=None):
    if registry is None:
        registry = pyramid.threadlocals.get_current_registry()
    return registry.settings['pyplay.theparam']
于 2013-10-14T17:00:53.177 に答える
1

ステップ1:ファイル xyz_file にシングルトンクラスを作成します

class Singleton:
def __init__(self, klass):
    self.klass = klass
    self.instance = None
def __call__(self, *args, **kwds):
    if self.instance == None:
        self.instance = self.klass(*args, **kwds)
    return self.instance

@Singleton
class ApplicationSettings(object):
   def __init__(self, app_settings=None):
       if app_settings is not None :
           self._settings = app_settings
   def get_appsettings_object(self):
       return self

   def get_application_configuration(self):
       return self._settings

ステップ 2: "__ init__.py" で

def main(global_config, **settings):
  ....
  .......
  app_settings = ApplicationSettings(settings)

ステップ 3: コードのどの部分にもアクセスできるはずです。

  from xyz_file import ApplicationSettings
  app_settings = ApplicationSettings().get_application_configuration()
于 2015-09-23T15:31:47.767 に答える