Да, можно делать как угодно. Zope3 никогда ни в чем не ограничивает. Поясню конкретнее.
Для подобных задач, как коннект к РБД, перекодировки, формирование random и т.д есть два подхода:
1) Просто написать модуль с нужными функциями - классами и положить его в проект, вызывая обычным импортом. Мы для подобных мелких задач держим например файл utils.py прямо в корне проекта и этот файл путешествует из проекта в проект, иногда в него что-нибудь полезное добавляется :) (всякие парсеры, собственные валидаторы, функции для работы с кодировками, полезности для json и прочяя лабудень).
2) Для таких вещей, как, например, работа с РБД лучше возпользоваться преимуществами Zope (такими как возможность сохранять состояние объектов в ZODB и компонентный подход). Поясню.
Нужно иметь конфиг в котором прописаны адрес:порт сервера БД,адреса-пароли VPN и какие-то другие настройки.
Держать этот конфиг в файле может быть неудобно. Тогда лучше создать персистентный объект, который будет уже “утилитой” и лежать он будет в локальном сайт-менеджере. (Т.е. он не доступен в “общем дереве” объектов, а в ZMI виден через ++ect++site). И там, соответственно, через автоматически сгенерированную (или собственную) форму и настраивается. Т.е. - это уже не класс, а именно экземпляр класса, единственный. Добавлять руками его туда не нужно, это можно делать автоматом:
from zope import component, event
from zope.lifecycleevent import ObjectCreatedEvent
from myproject.mypackage.mytool import MyTool
from myproject.mypackage.interfaces import IMyTool
TOOL_CONTAINER = 'default'
def createUtility(site, id, factory, ifaces):
sm = site.getSiteManager()
container = sm[TOOL_CONTAINER]
if id not in container:
if callable(factory):
utility = factory()
else:
utility = component.createObject(factory)
container[id] = utility
event.notify(ObjectCreatedEvent(utility))
for iface, name in in ifaces:
sm.registerUtility(utility, iface, name)
return container[id]
def createMyTool():
return MyTool()
def installMyTool(e):
site = e.site
sm = site.getSiteManager()
tool = sm.queryUtility(IMyTool, default=None)
if not tool:
createUtility(site, 'my_tool', createMyTool, (IMyTool, ))
Это примерный код, он может быть разный в зависимости от того, как сайт-менеджеры используются.
Тогда из любого места в любой момент эту утилиту можно вызвать так (обычно где-то в адаптерах вида, pagelet'ах и т.д):
from zope import component
mytool = component.getUtility(IMyTool)