Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Plone 3.1.2 - TypeError в методе ATDocument.getText()

Автор вопроса: Jan SiekierskiОтветов: 2

Моя задача - выгрузить контент с веб-сайта Plone 3.1.2 и загрузить информацию о контенте в базу данных SQL + файловую систему.

Я воссоздал веб-сайт, получил доступ к ZODB и воссоздал структуру объектов и папок. Я также могу читать свойства папок, файлов и документов. Я не могу заставить работать метод .getText() ATDocument. Трассировка выглядит так:

Traceback (последний последний вызов):

  File "C:\Users\jan\Eclipse_workspace\Plone\start.py", line 133, in ?
    main()
  File "C:\Users\jan\Eclipse_workspace\Plone\start.py", line 118, in main
    print dokument.getText()
  File "e:\Program Files\Plone 3\Data\Products\Archetypes\ClassGen.py", line 54, in generatedAccessor
  File "e:\Program Files\Plone 3\Data\Products\Archetypes\BaseObject.py", line 828, in Schema
TypeError: ('Could not adapt', <ATDocument at /*object_path*>, <InterfaceClass Products.Archetypes.interfaces._schema.ISchema>)

Подозреваю, что есть проблема с подключением объекта к интерфейсу ISchema, но я никогда раньше не работал с Plone и не знаю его объектной модели.

Любые предложения, что может быть не так или отсутствует, как я могу это исправить и/или что делать дальше? Я подозреваю, что мне нужно как-то связать класс интерфейса ISchema с этим объектом, но понятия не имею, с чего начать. Какие-либо предложения?

Я буду благодарен за любую помощь, так как я застрял на 2 дня и не продвигаюсь вперед.

Я ничего не знаю о формате ZCML или о том, как его редактировать. Поскольку после >>> print dokument.getText() в режиме отладки скрипт переходит к методу makeMethod() в классе Generator, я предполагаю, что скрипт не выполняет .getText(), а вместо этого пытается создать этот метод.

Поскольку inspect.getmembers(dokument) возвращает метод getText(), я действительно запутался. Знаете ли вы, какой файл ZCML может быть связан с классом ATDocument? Или где можно поискать любую информацию по этому вопросу?

Мой файл start.py не делает ничего, кроме следующего импорта:

from ZODB.FileStorage import FileStorage
from ZODB.DB import DB
from OFS.Application import Application
from BTrees import OOBTree
from Products.CMFPlone.Portal import PloneSite

затем он получает доступ к объекту документа и пытается выполнить .getText()

Редактировать 213-03-26 15:27 (GMT):

О файлах .zcml На сайте, который я получил, было 3 папки: Products (извлеченные в \Plone 3\Data), lib и package-includes.

Внутри библиотеки есть папка python, содержащая 3 подпапки: "common", "abc" и "def" (имена изменены, чтобы не раскрывать информацию о клиенте). Каждая из этих подпапок содержит файл configure.zcml, одна из них также содержит файл override.zcml.

В папке package-include есть 4 файла по 1 строке каждый. Они содержат следующие строки:

<include package="abc" file="configure.zcml" />
<include package="def" file="overrides.zcml" />
<include package="common" file="configure.zcml" />
<include package="def" file="configure.zcml" />

Эти файлы zcml в данный момент не копируются. Где я могу скопировать их, чтобы импортировать?

  • Судя по вашей трассировке, вы монтировали вещи в своей собственной установке, не используя леса Zope? Я бы сказал, что вы не загрузили регистрации ZCML, которых много, но трудно сказать, не видя вашего start.py кода. Martijn Pieters 26.03.2013
  • спасибо за ваш вклад @Martijn. Я все еще не могу заставить его работать, и я ничего не знаю о формате ZCML или о том, как его редактировать. Jan Siekierski 26.03.2013
  • Формат ZCML - это просто XML, который определяет конфигурацию сервера, включая регистрацию компонентов и адаптеров. Вам не нужно его редактировать, просто загрузите его. Это может быть сложно, и мне интересно, что вы делаете, не используя уже существующую инфраструктуру Zope. Поэтому моя просьба предоставить вам start.py источник, чтобы мы могли помочь вам сделать это правильно. Martijn Pieters 26.03.2013
  • @Martijn Я пытался ввести немного более длинный комментарий, но оказалось, что я не могу, поэтому я отредактировал свой исходный пост. Jan Siekierski 26.03.2013
  • Это то, что я хотел, чтобы вы сделали в первую очередь! Всегда можно отредактировать свой вопрос, добавив детали, запрошенные в комментариях. Martijn Pieters 26.03.2013
  • Как вы установили программное обеспечение Plone для импорта сюда? Возможно есть раскачка, можно ли вообще запустить сам сайт? Martijn Pieters 26.03.2013

pythontypeerrorplonezope

Ответы

Ответ 1 · рейтинг 1 · Martijn Pieters

Вам не хватает регистрации компонентов, обычно регистрируемой при загрузке файлов ZCML на сайт.

Вместо этого вы хотите иметь возможность запускать bin/instance run yourscript.py, что оставляет весь утомительный сайт и загрузку ZCML в Zope.

После того, как он будет надежно работать, вы сможете получить доступ к сайту в сценарии, который настраивает локальный менеджер компонентов и менеджер безопасности:

from zope.app.component.hooks import setSite
from Testing.makerequest import makerequest
from AccessControl.SecurityManagement import newSecurityManager

site_id = 'Plone'     # adjust to match your Plone site object id.
admin_user = 'admin'  # usually 'admin', probably won't need adjusting
app = makerequest(app)
site = app[site_id]
setSite(site)
user = app.acl_users.getUser(admin_user).__of__(site.acl_users)
newSecurityManager(None, user)

# `site` is your Plone site, now correctly set up

Сохраните этот скрипт где-нибудь и запустите его с помощью:

bin/instance run path/to/yourscript.py

Ответ 2 · toutpt

То, как вы начинаете свою задачу, не является хорошим. Вы пытаетесь использовать API без настройки фреймворка. Это возможно, но вы должны очень хорошо знать структуру (загрузить постоянный менеджер сайтов, ...)

Вы должны добавить "представление в браузере" и вызвать его для экспорта своего контента.

Вы можете сделать это:

  • создайте свой собственный аддон и установите его
  • изменить установленный аддон (в конце концов, это временная работа)

Вы найдете документацию по браузеру и plone по адресу http://developer.plone.org.

Извините, но если вам нужно разрабатывать для Plone, вам нужно немного прочитать обо всем этом.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы