17

我正在金字塔中开发一个相当大的项目。我以前用过django。我真的很喜欢它构建项目并将功能封装到应用程序中的方式。我想用金字塔实现相同的结构。我知道金字塔非常灵活,但我需要一些帮助来实现松耦合的相同结构。项目结构应类似于:

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

有什么建议么?

4

2 回答 2

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()

然后,在您的每个子应用程序中,您可以定义视图/模型/等。

通常,您可能希望在通用设置中创建 SQLAlchemy(或其他 DB)会话,因为您的不同应用程序可能都使用相同的引擎。

于 2011-05-16T07:18:18.397 回答
2

我已经实现了一个全局 appIncluder 函数,该函数作为 includeme 与要包含的包的init .py 一起导入。

includeme (ApplicationIncluder) 接收配置对象,因此很容易使用 config.package 及其变量/方法/类(存在于相同的init .py 和子模块中。

非常感谢这个想法!

编码:

项目:要部署在 foo.foo.apps 目录中的“foo”应用程序

结构:

foo
|-foo
  |- __init__.py
  |- appincluder.py
  |-apps
    |-test
      |- __init__.py
      |- views.py
      |- templates
         |- test.jinja2

富/富/初始化.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 {}

我希望它可以帮助某人。

于 2013-03-16T18:55:48.320 回答