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

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

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

nextgisweb.component.require(*deps)[исходный код]

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

Параметры:deps – Один или несколько идентификаторов компонентов, от которых зависит выполнение декорируемого метода.

Таким образом, если необходимо вызывать 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

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

class nextgisweb.env.env[исходный код]

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

Класс Component

class nextgisweb.component.Component(env, settings)[исходный код]
identity = None

Идентификатор компонента, который должен быть переопределен в дочернем классе. Должен быть синтаксически корректным идентификатором python, поскольку в ряде случаев используется как имя атрибута.

initialize()[исходный код]

Первая стадия инициализации.

configure()[исходный код]

Вторая стадия инициализации.

env

Окружение к которому относится этот компонент. Устанавливается при создании экземпляра класса компонента и в дальнейшем не меняется. По этот атрбут следует использовать вместо глобального окружения env.

Класс Env

class nextgisweb.env.Env(cfg)[исходный код]
chain(meth)[исходный код]

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

Параметры:meth – Name of the method to build sequence for.
metadata()[исходный код]

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