17

私はピラミッドでかなり大きなプロジェクトを開発しています。以前はdjangoを使用していました。プロジェクトを構成し、機能をアプリにカプセル化する方法がとても気に入っています。ピラミッドで同じ構造を実現したいと思います。ピラミッドがこれを実現するのに非常に柔軟であることは知っていますが、疎結合で同じ構造を実現するには助けが必要です。プロジェクト構造は次のようになります。

  Project/
         app1/
             models.py
             routes.py
             views.py
         app2/
             models.py
             routes.py
             views.py

助言がありますか?

4

2 に答える 2

28

Pyramidはそもそもパッケージ構造について何も想定していないため、アプリを分割する方法は、構成がかなり似ていることになります。ただし、アプリをいくつかの個別のパッケージに分割している場合は、(オプションで)config.include()ディレクティブを利用して各パッケージをメイン構成に含めることができます。

例えば:

# myapp/__init__.py (main config)
def main(global_config, **settings):
    config = Configurator(...)
    # basic setup of your app
    config.include('pyramid_tm')
    config.include('pyramid_jinja2')

    # add config for each of your subapps
    config.include('project.app1')
    config.include('project.app2')

    # make wsgi app
    return config.make_wsgi_app()

# myapp/app1/__init__.py (app1's config)
def includeme(config):
    config.add_route(...)
    config.scan()

# myapp/app2/__init__.py (app2's config)
def includeme(config):
    config.add_route(...)
    config.scan()

次に、各サブアプリで、ビュー/モデルなどを定義できます。

一般に、異なるアプリがすべて同じエンジンを使用している可能性があるため、共通のセットアップでSQLAlchemy(または他のDB)セッションを作成することをお勧めします。

于 2011-05-16T07:18:18.397 に答える
2

含めるパッケージのinit .py を含むincludeme としてインポートされるグローバル appIncluder 関数を実装しました。

includeme (ApplicationIncluder) は構成オブジェクトを受け取るため、config.package とその変数/メソッド/クラス (同じinit .py およびサブモジュールに存在) を簡単に使用できます。

このアイデアをどうもありがとう!

コード:

プロジェクト: 'foo' アプリは foo.foo.apps ディレクトリにデプロイされます

構造:

foo
|-foo
  |- __init__.py
  |- appincluder.py
  |-apps
    |-test
      |- __init__.py
      |- views.py
      |- templates
         |- test.jinja2

foo/foo/ init.py :

config.include('foo.apps.test')

foo/foo/appincluder.py

def appIncluder(config):
    app    = config.package
    prefix = app.prefix
    routes = app.routes

    for route,url in routes.items():
        config.add_route(route,prefix + url)

    config.scan(app)

    log.info('app: %s included' % app.__name__)

foo/foo/apps/test / init.py

from foo.appincluder import appIncluder as includeme

prefix = '/test'

routes = {
    'test': '/home'
}

foo/foo/apps/test/views.py

from pyramid.view import view_config


@view_config(route_name='test', renderer='templates/test.jinja2')
def test(request):
    return {}

誰かの役に立てば幸いです。

于 2013-03-16T18:55:48.320 に答える