如何在CKAN中制作自定义中间件
How to make customized middleware in CKAN
我遇到了一个场景,我必须覆盖 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" class。但是,如示例所示,实际的中间件 Mail
是从另一个 class 导入的。我想覆盖 TrackingMiddleware
尤其是 __call__(self, environ, start_response)
方法,在配置阶段调用 make_pylons_stack
时传入 environ
和 start_response
。如果我想覆盖 TrackingMiddleware
我应该在 ckanext-myext/
下创建另一个 config/middleware/myTrackingMiddleware.py
然后在 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
,但我没有收到 myTrackingMiddleware
中对 '/_tracking'
的任何请求。
我已经实施了一套流程,并且对我自己有效。基本上,我将所做的保留为我在自己的问题中提到的内容。然后,如果您的中间件与 CKAN 默认中间件有一些冲突,您可能必须完全禁用默认中间件。我在这里与 CKAN 的一些主要贡献者进行了讨论:https://github.com/ckan/ckan/issues/4451。在 dev.ini
中禁用 CKAN ckan.tracking_enabled
后,我可以灵活地从 environ
获取值并使用我的自定义逻辑处理跟踪。
我遇到了一个场景,我必须覆盖 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" class。但是,如示例所示,实际的中间件 Mail
是从另一个 class 导入的。我想覆盖 TrackingMiddleware
尤其是 __call__(self, environ, start_response)
方法,在配置阶段调用 make_pylons_stack
时传入 environ
和 start_response
。如果我想覆盖 TrackingMiddleware
我应该在 ckanext-myext/
下创建另一个 config/middleware/myTrackingMiddleware.py
然后在 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
,但我没有收到 myTrackingMiddleware
中对 '/_tracking'
的任何请求。
我已经实施了一套流程,并且对我自己有效。基本上,我将所做的保留为我在自己的问题中提到的内容。然后,如果您的中间件与 CKAN 默认中间件有一些冲突,您可能必须完全禁用默认中间件。我在这里与 CKAN 的一些主要贡献者进行了讨论:https://github.com/ckan/ckan/issues/4451。在 dev.ini
中禁用 CKAN ckan.tracking_enabled
后,我可以灵活地从 environ
获取值并使用我的自定义逻辑处理跟踪。