Найти - Пользователи
Полная версия: Zope3: анонимный доступ к сайту
Начало » Zope/Plone/Bluebream » Zope3: анонимный доступ к сайту
1 2 3
vak
Создал dtml документ все прекрасно работает, но только для авторизованного пользователя. Читал, что получилось найти, пробовал “поиграть” с правами для конкретного документа - не получается получить доступ анонимному пользователю. Подскажите где прописать чтобы заработало?

И еще, как в Zope3 выполнить внешнюю функцию? Т.е. лежит в файле и вызывается по мере необходимости. ,Посмотрел в доступной документации - не дошло как это можно сделать.
astoon
vak
Создал dtml документ все прекрасно работает, но только для авторизованного пользователя. Читал, что получилось найти, пробовал “поиграть” с правами для конкретного документа - не получается получить доступ анонимному пользователю. Подскажите где прописать чтобы заработало?
DTMLPage это персистентный объект класса zope.app.dtmlpage.dtmlpage.DTMLPage, и я, чесно говоря, не представляю, зачем он включен по умолчанию в tar-дистрибутив Zope3. И в buildout-проектах (а лучше перейти на buidlout, чтобы получить все преимущества) пакет zope.app.dtmlpage никогда не включаю, и навряд ли им кто-то сейчас пользуется.
Теперь посмотрите этот созданный объект в “Introspector” : Permissions: zope.ManageContent (read), n/a (write).
Также там обратите внимание на права доступа к аттрибуту source. Эти права заданы в zcml-файле в пакете zope.app.dtmlpage.

Т.е. надо делать свой интерфейс, декларировать ему нужные виды/права, и рeгистрировать в ручную или автоматически (подпиской на события “создание DTMLPage”) как утилиту, предоставляющую данный интерфейс.

Но лучше - не заморачиваться, так как смысла нет. Много другого интересного есть для отнятия времени.
(http://wiki.zope.org/zope3/Zope3PackageGuide). В Zope3 много разных путей/идеологий для создания приложений, но zope.app.dtmlpage не вписывается ни в один из них.
Русскую книжку ни в коем случае не надо читать.

vak
И еще, как в Zope3 выполнить внешнюю функцию?
Так же, как в любой Python-программе.
vak
Спасибо, по первому вопросу понятно, что нужно делать по другому. Будем двигаться в правильном направлении. По второму вопросу не совсем ясно… например часто возникающая для меня задача: Отправлять запросы к базе, в которой данные хранятся в cp1251. Т.е. перед отправкой запроса нужно изменить кодировку с utf-8 на cp1251, а при получении результата сделать обратное преобразование. Естественно что, на мой взгляд, эти преобразования кодировки (или что то подобное) разумно организовать в виде функций, которые вызываются по мере необходимости. Но вот где в Zope3 (в Zope2 для меня было более понятно) хранить эти функции и как вызывать … подскажите, помогите с простыми вопросами плиз, - со сложными можно уже будет разобраться зная ответы на простые.
tretiy3
Храниь можешь где угодно.
В контент объекте, в “виде” объекта, адаптером можешь оформить или утилитой. Как тебе удобней.
Это все - обычные классы.
astoon
Да, можно делать как угодно. 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)
vak
Спасибо, осмысливаю…
astoon
Да, забыл добавить.
Есть разные подходы: держать все приложение в отдельном фолдере (в нем будет 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")
это вид, который при вызове просто вызывает все эти события посредством подписчика (event) и делает редирект обратно.
Его можно посадить в zmi-меню того фолдера, где держите Local Site Manager.
vak
Все… запутался…
Нужна помощь:
Взял пример из книги Zope3 (перевод Уральского вуза). Попробовал создать свой интерфейс по аналогии… и никак… то нужного пакета не оказывается, на базе которого создается свой класс… то ошибки не понятные… одним словом “веселуха”.
Нужен нормально работающий _не большой_ пример, на основании которого можно было бы разобраться что и как и сделать уже свой интерфейс. Подскажите плиз где можно взять.
tretiy3
vak
Все… запутался…
Нужна помощь:
Взял пример из книги Zope3 (перевод Уральского вуза). Попробовал создать свой интерфейс по аналогии… и никак… то нужного пакета не оказывается, на базе которого создается свой класс… то ошибки не понятные… одним словом “веселуха”.
Нужен нормально работающий _не большой_ пример, на основании которого можно было бы разобраться что и как и сделать уже свой интерфейс. Подскажите плиз где можно взять.
Книжка та - зло. Нужно читать либо zope3book либо web component development with zope3.

Пример напишем тебе легко. Там выше их тебе уже написали кучку. Сформулируй, только, по конкретней, что нужно-то? Напиши что ты уже сделал. От чего плясать?

Пока очень странные ощущения от твоих вопросов. Как будто ты сделал страницу в zmi, а теперь хочешь прикрутить к ней маленько функциональности. В zope3 так не делают.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB