如何为独立zodbbrowser注入类型?

时间:2014-12-19 21:15:42

标签: python zodb

我使用独立的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上的简短用户指南!到处都是破碎的对象建议确保您的应用程序对象可以从Python路径导入。但我不知道如何。

如何制作帐户类(来自教程):

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

以独立模式知道zodbbrowser,以便用对象实例的__str__表示替换持久性破坏类型?

1 个答案:

答案 0 :(得分:1)

一般回答这个问题:

  • 最简单的方法是将pip install zodbbrowser放入您用于创建相关数据库的ZODB应用程序的相同virtualenv中。这假设你使用virtualenv。

  • 第二种最简单的方法是将zodbbrowser添加到用于创建相关数据库的ZODB应用程序的buildout中buildout.cfg的鸡蛋列表中。这假设您使用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()
    
  • 使用你的virtualenv或buildout中的Python运行它,你安装了zodbbrowser。