Как внедрить типы для автономного zodbbrowser?

Я использую автономный zodbbrowser 0.11.1 с базой данных ZODB3. Я могу нормально получить доступ к базе данных, но когда я вставляю объекты неизвестного типа в ZODB, браузер отображает только:

Attributes
data: {u'account-1': <persistent broken __main__.Account instance '\x00\x00\x00\x00\x00\x00\x00\x01'>,
u'account-2': <persistent broken __main__.Account instance '\x00\x00\x00\x00\x00\x00\x00\x01'>
} 

Вместо этого я хотел бы увидеть отформатированную распечатку из __repr__ (или __str__). Краткое руководство пользователя по pypi на странице Help! Везде сломанные объекты рекомендует убедиться, что объекты вашего приложения можно импортировать из пути Python. Но я не знаю как.

Как мне сделать класс Account (из учебника):

class Account(Persistent):
    def __init__(self):
        ...

известный zodbbrowser в автономном режиме, чтобы постоянный сломанный тип был заменен представлением __str__ экземпляра объекта?


person baloan    schedule 19.12.2014    source источник


Ответы (1)


Чтобы ответить на вопрос в целом:

  • Самый простой способ — pip install zodbbrowser войти в ту же виртуальную среду, которую вы использовали для своего приложения ZODB, которое создало рассматриваемую базу данных. Это предполагает, что вы используете virtualenv.

  • Второй самый простой способ — добавить zodbbrowser в список яиц в buildout.cfg в сборке, которую вы использовали для своего приложения ZODB, которое создало рассматриваемую базу данных. Это предполагает, что вы используете zc.buildout.

  • Наконец, вы можете попытаться установить PYTHONPATH так, чтобы модуль, который вы использовали для создания постоянных объектов, был импортируемым.

Ничто из вышеперечисленного не поможет в вашем конкретном случае, потому что сохраняемые объекты относятся к модулю с именем __main__. Это плохая идея! В каждом вызове Python есть только один __main__, и это зависит от сценария, который вы запускаете. Если этот скрипт — zodbbrowser, то он не может быть и вашим приложением.

Для достижения наилучших результатов не определяйте никаких подклассов Persistent в вашем основном скрипте. Всегда определяйте их в отдельном модуле и импортируйте.

Однако, если у вас уже есть такая база данных и вам нужно получить доступ к объектам для криминалистических целей или чего-то еще, есть возможный обходной путь:

  • напишите новый скрипт, скажем, myzodbbrowser.py, который выглядит примерно так:

    from myapp import Account  # replace myapp with the script name of your app
    import zodbbrowser.standalone
    zodbbrowser.standalone.main()
    
  • запустите его с Python из вашей виртуальной среды или сборки, где вы установили zodbbrowser.

person Marius Gedminas    schedule 22.12.2014