5.2.1. Компоненты и окружение

Для обеспечения модульности в NGW используются разделение на компоненты. Один python-пакет может содержать один или несколько компонентов. Каждый компонент является наследником класса Component, а для загрузки соответствующих модулей используются точки входа (entry points) setuptools.

def pkginfo():
    return dict(components=dict(
        somecomp='somepackage.somecomp'))

setup(
    name = 'somepackage',
    entry_points = {'nextgisweb.packages':
        'somepackage = somepackage:somemod:pkginfo'}
)

У каждого компонента есть идентификатор (somecomp в примере выше). Так же этот идентификатор указываетс в атрибуте класса identity. Этот идентификатор должен быть уникален в рамках всех пакетов NGW.

Для объединения компонентов в единое целое используется объект-окружение, экземпляр класса Env, который создается на этапе инициализации. Инициализация происходит следующим образом:

  1. Создаются экземпляры компонентов
  2. Для каждого компонента вызывается initialize()
  3. Для каждого компонента вызывается configure()

5.2.1.1. Зависимости между компонентами

Вызовы методов initialize() и configure() осуществляются с учетом зависимостей, которые могут быть указаны при помощи декоратора require().

nextgisweb.component.require(*deps)[source]

Decorator for dependencies between components methods. When applied dependencies are written to private attributes of decorated method. These private methods are used in chain().

Parameters:deps – One or many component identifiers which decorated method execution depends on.

Таким образом, если необходимо вызывать initialize() компонента B после A, то выглядеть это будет следующим образом:

from nextgisweb.component import Component, require

class A(Component):
    identity = 'A'

    def initialize(self):
        pass

class B(Component):
    identity = 'B'

    @require('A')
    def initialize(self):
        pass

5.2.1.2. Глобальный объект окружение

class nextgisweb.env.env[source]

Proxy-class for global environment access. Use it only where it is impossible to get access to current environment by other means. However in any case, simultaneous work with multiple environments is currently not supported an will hardly ever be needed. To get original object for which messages are proxied one can use constructor env().

5.2.1.3. Класс Component

class nextgisweb.component.Component(env, settings)[source]
identity = None

Component identifier that should be redefined in a child class. Must be syntactically correct python id as it is used as attribute name in some cases.

initialize()[source]

First initialization stage.

configure()[source]

Second initialization stage.

env

Environment this component belongs too. Set on class exemplar creation and not changed afterwards. This attribute should be used instead of global environment env.

amd_base

Список вспомогательных AMD модулей, предоставляемых компонентом, которые будут использованы в базовом шаблоне страницы. Могут быть использованы для изменения её внешнего вида.

5.2.1.4. Класс Env

class nextgisweb.env.Env(cfg)[source]
chain(meth)[source]

Building a sequence of method calls with dependencies. core component dependency gets added automatically for all components, so that it is returned first.

Parameters:meth – Name of the method to build sequence for.
metadata()[source]

Returns object sa.MetaData that combines metadata of all components from this environment