Сервер - статьи

       

ПУБЛИКАЦИЯ ОБЪЕКТОВ


Zope публикует Питоновские объекты (экземпляры классов). Для этого в Zope есть компонент ZPublisher - брокер объектных запросов. Получив запрос (от ZServer'а, который в свою очередь получает запрос из внешнего мира по одному из поддерживаемых протоколов), он:

  • находит в иерархии объектов объект, к которому происходит обращение
  • преобразует входные данные в соответствующие типы данных Питона (берутся данные из форм или запроса GET, куки; все упаковывается в общее пространство имен)
  • проверяет аутентификацию и авторизацию
  • вызывает найденный объект с параметрами, буферизует ответ (включая код ответа, куки и прочие заголовки ответа HTTP) и возвращает клиенту ответ

Без помощи со стороны программы ZPublisher, конечно, не может осуществить подходящие преобразования типов, поэтому автор может указать, в каком виде он хочет получить данные. Вот пример формы для заполнения, с указаниями, зашитыми в имена полей: <FORM name="formA" action="myObject" method="POST"> <input type="text" name="age:int" size="2"> <input type="checkbox" name="category:int:list">K1 <input type="checkbox" name="category:int:list">K2 <input type="submit" name="manage_setAge:method" value="Установить"> <input type="submit" name="manage_delete:method" value="Удалить"> </FORM>

После заполнения формы в браузере и нажатия одной из кнопок ZPublisher преобразует введенные данные. Переменная age преобразуется в целое, checkbox'ы - в список целых, и вызовется один из методов объекта myObject в зависимости от нажатой кнопки.

Проверка, естественно, осуществляется на стороне сервера, в Zope. Если переменная age не преобразовывается в целое, возникнет ошибка. Ее может обработать публикуемый объект, а нет - Zope выдаст пользователю HTML с текстом об ошибке. Для проверки на стороне клиента можно использовать JavaScript.
Искривленные имена слегка мешают доступу из JS, но это не смертельно: element = document.forms["formA"].elements["age:int"] Как именно вызовется метод, зависит от его (метода) сигнатуры (в Питоне вся информация о коде доступна во время выполнения). Например, если myObject - экземпляр вот такого класса: class AgeManager: def view(self, age=None): if age is None: age = self.age return "Возраст: <b>%d</b>" % age def manage_setAge(self, age): self.age = age def manage_delete(self, category): for c in category: self.delete(c) # self.delete не показан то метод manage_setAge вызовется с целым age, или manage_delete - со списком нажатых checkbox'ов. Остальные переменные формы можно извлечь из общего пространства имен, доступного через self. Публикация через метод GET и того проще: на запрос http://www.my.server/root/subobject/sub2/myObject/view?age:int=12 ZPublisher обходит иерархию объектов (траверс с учетом механизма acquisition, о чем позже) и публикует myObject - у объекта вызывается метод view с целочисленным параметром.

Содержание раздела