将基于 zcml 的 Python 脚本转换为 zope/plone 中的独立脚本

53 阅读2分钟

有一段 Python 代码在 zope 3 zcml 环境中运行良好,但需要将其转换为一个独立脚本,以便能够通过类似 tal:content='context/get_tags' 的方式访问。现有的代码如下:

huake_00066_.jpg

class TagListView(BrowserView):

    def getCategories(self):
        categories = set()
        for cat in self.portal_catalog.uniqueValuesFor('Subject'):
            categories.add(cat.lower())
        for cat in self.__mapping:
            categories.add(cat.lower())
        return tuple(sorted(categories))

    def getSynonyms(self, category):
        r = self.__mapping.get(category)
        if r is None:
            return ()
        return r[0]

    def __init__(self, context, request):
        self.context = context
        self.request = request
        self.tool = self.context.portal_categories

    def entries(self):
        taglist = '(['
        for category in self.tool.getCategories():
            taglist = taglist + ''' + category + '','
            for synonym in self.tool.getSynonyms(category):
                if len(synonym) > 0:
                    taglist = taglist + ''' + synonym + '','
        taglist = taglist + '])'
        return taglist

这段代码虽然能够在 zope 3 zcml 环境中正常运行,但还需要进行必要的转换才能作为独立脚本运行。

2、解决方案

要将这段代码转换为独立脚本,可以参考以下步骤:

  1. 首先,需要将 BrowserView 类更改为一个普通类,并删除 contextrequest 参数。
  2. 其次,需要将所有依赖于 zope 环境的代码都替换为独立实现,例如使用一个简单的字典来代替 self.portal_catalog
  3. 最后,需要将脚本保存为一个可执行文件,并确保脚本具有可执行权限。

以下是一个示例代码,展示了如何将上述代码转换为独立脚本:

class TagListView:

    def __init__(self):
        self.categories = ['category1', 'category2', 'category3']
        self.synonyms = {
            'category1': ['synonym1', 'synonym2'],
            'category2': ['synonym3', 'synonym4'],
            'category3': ['synonym5', 'synonym6'],
        }

    def getCategories(self):
        return tuple(sorted(self.categories))

    def getSynonyms(self, category):
        return self.synonyms.get(category, ())

    def entries(self):
        taglist = '(['
        for category in self.getCategories():
            taglist += ''' + category + '','
            for synonym in self.getSynonyms(category):
                if len(synonym) > 0:
                    taglist += ''' + synonym + '','
        taglist += '])'
        return taglist


if __name__ == '__main__':
    view = TagListView()
    print(view.entries())

这个脚本可以作为一个独立程序运行,并且不需要依赖任何外部的库或环境。

代码示例

# Assume you have saved the above code as `tag_list.py`.

# To run the script, open a terminal window and navigate to the directory where the script is saved.

# Then, type the following command:

python tag_list.py

# This will print the output of the `entries()` method, which is a list of categories and synonyms in JSON format.