5

我正在构建一个相当大的项目,基本上包括以下内容:

服务器 1:基于冰的服务。Glacier2 用于会话处理。防火墙允许访问 Glacier2。

服务器 2:通过 Glacier2 提供 Ice 服务的 Web 界面(读取、公开)。通过 Glacier 2 提供 Ice 服务的管理界面。

我关心的一点是网络界面。我想使用 Django,因为它既是用 python 编写的,又具有非常有用的自动管理面板生成器。

Web 界面不访问任何数据库。它通过 Glacier2 路由器连接到服务器 #1 上的 Ice 服务,并使用这些服务公开的 API 来操作数据。

您可能知道,Django 中的管理员生成依赖于 Django 的 ORM 的使用;我没有使用它,因为我没有要访问的数据库。

所以我需要生成管理面板,但是,我需要拦截任何“db-access”调用并将它们转换为 Ice 服务调用,而不是像 ORM 通常那样进行标准数据访问,然后获取服务的输出(如果有),将其转换为 ORM 通常返回的任何内容并将控制权返回给 Django。

任何人都知道我怎么能做到这一点?我需要子类化什么?有什么具体的想法吗?

谢谢你的时间。

4

4 回答 4

7

我认为可能有比编写自定义 ORMS 更简单的方法来获得所需的管理集成。我在一个允许通过其控制面板 API 管理 Webfaction 电子邮件帐户的应用程序中使用它。

在此处查看models.py、admin.py 和 urls.py:django-webfaction

要在管理索引页面上创建条目,请使用 managed=False 的虚拟模型

向管理员注册该模型。

然后,您可以拦截管理 url 并将它们定向到您自己的视图。

如果管理员提供的添加/编辑/删除操作对您的应用程序有意义,则这是有意义的。否则,您最好覆盖管理索引或更改列表模板以包含您自己的自定义操作

于 2009-11-28T21:11:35.773 回答
3

contrib.admin 的真正威力是django Forms。本质上,管理工具基本上是自动生成一个表单来匹配一个带有一点 urls.py 路由的模型。最后,除了管理工具之外,使用 django Forms 可能会更容易。

于 2009-11-28T20:15:47.320 回答
1

您可以“模拟”某些类,使其看起来像一个模型,但它确实代理了您的 API

class QuerysetMock(object):
    def all():
        return call_to_your_api()
    [...]


class MetaMock(object):
     def fields():
         return fields_mock_objects..
     verbose_name = ''
     [...]

class ModelMock(object):
    _meta = MetaMock()
    objects = QuerysetMock()

admin.site.register(ModelMock)

这可能有效..但你需要做很多 django.model 兼容的东西

于 2009-11-28T21:06:28.683 回答
0

django ORM 有一个可插入的后端,这意味着您可以为不是 RDBMS 的东西编写后端。这可能是一项相当大的任务,但一个很好的起点是 Malcolm Tredinnick 在 DjangoCon 2008 上的演讲,在 ORM 内部

否则,您可以完全绕过 ORM,并手动编写表单以获得所需的访问权限。

于 2009-11-28T20:13:59.210 回答