Как сделать персонализированное промежуточное ПО в CKAN - PullRequest
0 голосов
/ 08 сентября 2018

Я встречал сценарий, в котором мне нужно переопределить общее промежуточное ПО в CKAN. А в CKAN по умолчанию plugins/interface.py:

class IMiddleware(Interface):
    u'''Hook into CKAN middleware stack
    Note that methods on this interface will be called two times,
    one for the Pylons stack and one for the Flask stack (eventually
    there will be only the Flask stack).
    '''
    def make_middleware(self, app, config):
        u'''Return an app configured with this middleware
        When called on the Flask stack, this method will get the actual Flask
        app so plugins wanting to install Flask extensions can do it like
        this::
            import ckan.plugins as p
            from flask_mail import Mail
            class MyPlugin(p.SingletonPlugin):
                p.implements(p.I18nMiddleware)
                def make_middleware(app, config):
                    mail = Mail(app)
                    return app
        '''
        return app

Это показывает, что я должен определить класс "MyMiddleWare" под плагином, который я хочу реализовать в расширении. Однако, как показано в примере, фактическое промежуточное программное обеспечение Mail импортируется из другого класса. Я хочу переопределить TrackingMiddleware, особенно метод __call__(self, environ, start_response), в который environ и start_response передаются, когда make_pylons_stack вызываются на этапе настройки. Если я хочу переопределить TrackingMiddleware Должен ли я создать еще один config/middleware/myTrackingMiddleware.py в ckanext-myext/, а затем в plugin.py я реализую следующее?:

from myTrackingMiddleware import MyTrackingMiddleware

class MyPlugin(plugins.SingletonPlugin):
    plugins.implements(plugins.IMiddleware, inherit=True)

    def make_middleware(self, app, config):
        tracking = MytrackingMiddleware(app, config)
        return app

Обновление:

Я пытался создать myTrackingMiddleware в иерархии и импортировал его в plugin.py, но я не получил ни одного запроса к '/_tracking' в myTrackingMiddleware.

1 Ответ

0 голосов
/ 12 сентября 2018

Я реализовал набор процессов, и он работает для меня. По сути, я сохранил то, что сделал, то, что упомянул в своем собственном вопросе. Затем, если ваше промежуточное программное обеспечение конфликтует со стандартным ПО CKAN по умолчанию, вам, вероятно, придется полностью отключить стандартное ПО. Я обсуждал это с некоторыми основными участниками CKAN: https://github.com/ckan/ckan/issues/4451. После того, как я отключил CKAN ckan.tracking_enabled в dev.ini, у меня есть возможность получать значения из environ и обрабатывать отслеживание с помощью моей настраиваемой логики.

...