Подтвердить что ты не робот

Структура проекта пирамиды

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

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

Любые предложения?

4b9b3361

Ответ 1

Поскольку 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 config)
def includeme(config):
    config.add_route(...)
    config.scan()

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

В каждом из ваших субпапсов вы можете определить виды/модели/и т.д.

В общем, возможно, вы захотите создать свой SQLAlchemy (или другой DB) сеанс в общей настройке, так как, вероятно, ваши разные приложения используют один и тот же движок.

Ответ 2

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

includeme (ApplicationIncluder) получает объект конфигурации, поэтому он легко может использовать config.package и его переменные/методы/классы (присутствующие в том же init.py и подмодулях.

Большое спасибо за эту идею!

Код:

project: '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 {}

Я надеюсь, что это поможет кому-то.