Структура проекта Пирамида - PullRequest
17 голосов
/ 16 мая 2011

Я разрабатываю довольно большой проект в пирамиде.Я использовал Django раньше.Мне очень нравится, как он структурирует проект и инкапсулирует функциональность в приложения.Я хотел бы достичь такой же структуры с пирамидой.Я знаю, что пирамида очень гибкая, чтобы получить это, но мне нужна помощь, чтобы создать ту же структуру со слабой связьюСтруктура проекта должна выглядеть примерно так:

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

Есть предложения?

Ответы [ 2 ]

28 голосов
/ 16 мая 2011

Поскольку 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 (или другую БД) в общей настройке, так как все ваши приложения используют один и тот же механизм.

2 голосов
/ 16 марта 2013

Я реализовал глобальную функцию appIncluder, которая импортируется как includeme с init .py включаемого пакета.

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 / приложения / тест / INIT .py

from foo.appincluder import appIncluder as includeme

prefix = '/test'

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

Foo / Foo / приложения / тест / views.py

from pyramid.view import view_config


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

Надеюсь, это кому-нибудь поможет.

...