Структура проекта пирамиды
Я разрабатываю довольно большой проект в пирамиде. Раньше я использовал django. Мне очень нравится, как он структурирует проект и инкапсулирует функциональность в приложения. Я хотел бы достичь такой же структуры с пирамидой. Я знаю, что пирамида очень гибкая, чтобы получить это, но мне нужна помощь, чтобы достичь такой же структуры с ослабленной связью. Структура проекта должна выглядеть примерно так:
Project/
app1/
models.py
routes.py
views.py
app2/
models.py
routes.py
views.py
Любые предложения?
Ответы
Ответ 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 {}
Я надеюсь, что это поможет кому-то.