我正在金字塔中开发一个相当大的项目。我之前用过django。我非常喜欢它构建项目的方式,并将功能封装到应用程序中。我想用金字塔实现相同的结构。我知道金字塔非常灵活,但是我需要一些帮助来实现松散耦合的相同结构。项目结构应该类似于:
Project/
app1/
models.py
routes.py
views.py
app2/
models.py
routes.py
views.py
有什么建议吗?
答案 0 :(得分: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()
在每个子应用程序中,您可以定义views / models / etc.
通常,您可能希望在常用设置中创建SQLAlchemy(或其他数据库)会话,因为您的不同应用程序可能都使用相同的引擎。
答案 1 :(得分:2)
我已经实现了一个全局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
富/富/的初始化强>的.py:
config.include('foo.apps.test')
富/富/ 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__)
富/富/应用/测试/的初始化强>的.py
from foo.appincluder import appIncluder as includeme
prefix = '/test'
routes = {
'test': '/home'
}
富/富/应用/测试/ views.py
from pyramid.view import view_config
@view_config(route_name='test', renderer='templates/test.jinja2')
def test(request):
return {}
我希望它有所帮助。