Структура пирамидального проекта

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

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

какие предложения?

2 ответов


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

в каждом вашем subapps, вы можете затем определить вид/моделей/и т. д.

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


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

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

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

код:

проект: 'foo' приложения для развертывания foo.foo.каталог приложений

структура:

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 {}

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