Форум сайта python.su
Создал dtml документ все прекрасно работает, но только для авторизованного пользователя. Читал, что получилось найти, пробовал “поиграть” с правами для конкретного документа - не получается получить доступ анонимному пользователю. Подскажите где прописать чтобы заработало?
И еще, как в Zope3 выполнить внешнюю функцию? Т.е. лежит в файле и вызывается по мере необходимости. ,Посмотрел в доступной документации - не дошло как это можно сделать.
Офлайн
vakDTMLPage это персистентный объект класса zope.app.dtmlpage.dtmlpage.DTMLPage, и я, чесно говоря, не представляю, зачем он включен по умолчанию в tar-дистрибутив Zope3. И в buildout-проектах (а лучше перейти на buidlout, чтобы получить все преимущества) пакет zope.app.dtmlpage никогда не включаю, и навряд ли им кто-то сейчас пользуется.
Создал dtml документ все прекрасно работает, но только для авторизованного пользователя. Читал, что получилось найти, пробовал “поиграть” с правами для конкретного документа - не получается получить доступ анонимному пользователю. Подскажите где прописать чтобы заработало?
vakТак же, как в любой Python-программе.
И еще, как в Zope3 выполнить внешнюю функцию?
Офлайн
Спасибо, по первому вопросу понятно, что нужно делать по другому. Будем двигаться в правильном направлении. По второму вопросу не совсем ясно… например часто возникающая для меня задача: Отправлять запросы к базе, в которой данные хранятся в cp1251. Т.е. перед отправкой запроса нужно изменить кодировку с utf-8 на cp1251, а при получении результата сделать обратное преобразование. Естественно что, на мой взгляд, эти преобразования кодировки (или что то подобное) разумно организовать в виде функций, которые вызываются по мере необходимости. Но вот где в Zope3 (в Zope2 для меня было более понятно) хранить эти функции и как вызывать … подскажите, помогите с простыми вопросами плиз, - со сложными можно уже будет разобраться зная ответы на простые.
Отредактировано (Март 17, 2008 03:40:03)
Офлайн
Храниь можешь где угодно.
В контент объекте, в “виде” объекта, адаптером можешь оформить или утилитой. Как тебе удобней.
Это все - обычные классы.
Офлайн
Да, можно делать как угодно. 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, ))
from zope import component
mytool = component.getUtility(IMyTool)
Отредактировано (Март 17, 2008 17:40:14)
Офлайн
Спасибо, осмысливаю…
Офлайн
Да, забыл добавить.
Есть разные подходы: держать все приложение в отдельном фолдере (в нем будет Local Site Manager, также добавляемый автоматом подпиской на это событие) и добавлять его через ZMI (а фронтэнд-сервер вешать на него, типа 127.0.0.1:port/++skin++MySkin/myapp) или пользоваться умалчальным Local Site Manager в root folder.
events, описанные в предыдущем коде, можно вызывать так (первый раз при установке приложения, ну и может в ходе тестирования):
from zope.publisher.browser import BrowserView
from zope.app.component.hooks import getSite
from zope.app import zapi
from zope import event
from myproject.site.events import SiteUpgradedEvent
class UpgradeSite(BrowserView):
def __call__(self):
site = getSite()
event.notify(SiteUpgradedEvent(site))
self.request.response.redirect(
zapi.absoluteURL(site, self.request) + "/contents.html")
Офлайн
Все… запутался…
Нужна помощь:
Взял пример из книги Zope3 (перевод Уральского вуза). Попробовал создать свой интерфейс по аналогии… и никак… то нужного пакета не оказывается, на базе которого создается свой класс… то ошибки не понятные… одним словом “веселуха”.
Нужен нормально работающий _не большой_ пример, на основании которого можно было бы разобраться что и как и сделать уже свой интерфейс. Подскажите плиз где можно взять.
Офлайн
vakКнижка та - зло. Нужно читать либо zope3book либо web component development with zope3.
Все… запутался…
Нужна помощь:
Взял пример из книги Zope3 (перевод Уральского вуза). Попробовал создать свой интерфейс по аналогии… и никак… то нужного пакета не оказывается, на базе которого создается свой класс… то ошибки не понятные… одним словом “веселуха”.
Нужен нормально работающий _не большой_ пример, на основании которого можно было бы разобраться что и как и сделать уже свой интерфейс. Подскажите плиз где можно взять.
Офлайн
Офлайн