也许我应该先了解一下我想要实现的目标,因为可能有更好的解决方案。
我有一个使用Django的网络应用程序来管理媒体(录制的电视,电影等)。 Web应用程序允许您将元数据添加到媒体,例如您基于每个用户观看的内容,并允许您执行搜索并与Web资源同步以获取有关显示时间的信息等。
实际媒体文件位于文件服务器上,Django系统可以访问该文件服务器以扫描和更新其数据库。
我还有几个可以播放文件服务器媒体文件的媒体播放系统,前端用Python编写。
此前端需要元数据才能显示用户界面。目前我正在使用Django创建视图,以XML格式显示数据,然后使用urllib2检索前端页面。
我真正想要的是一种访问直接管理媒体播放系统中媒体元数据的Django ORM的方法,这样我就能拥有完整ORM的强大功能。
所以,最后回到我的问题。有没有办法以独立的方式远程访问ORM?我想我可以将模型复制到前端系统,然后让他们直接访问数据库,但必须有一个更优雅的解决方案。
答案 0 :(得分:4)
您真的需要客户端ORM的全部功能吗?如果你不这样做,某种Web服务将是我的最爱。 REST是当前的宠儿,参见例如django-rest-interface。
否则我看不出优雅的出路。您可以通过挑选Querysets和结果并通过某些API将它们抛弃来避免直接数据库连接的需要,但它可能比它的价值更麻烦。
答案 1 :(得分:1)
我认为直接访问数据库并不是实现这一目标的好方法。如果您将模型放入合适的模块中,共享它们应该不是问题。
但是,您公开了模型定义,因此更改数据库模式和模型定义可能有点困难。所以使用XML作为一个接口来解耦这个并不是很糟糕。
另一种选择是某种远程过程调用机制。
答案 2 :(得分:1)
对于我自己的参考(也许还有其他人),这是使用以下库的快速解决方案和示例:
我知道Python 2.6内置了对JSON的支持,但不幸的是,由于其他库的限制我至少暂时使用Python 2.5。
Django模型:
class Show(models.Model):
name = models.CharField(max_length=128)
Django urls.py:
from django_restapi.model_resource import Collection
from django_restapi.responder import JSONResponder
from wstest.tv.models import Show
show_resource = Collection(
queryset = Show.objects.all(),
responder = JSONResponder(),
)
##
##
urlpatterns = patterns('',
##
(r'^json/show/(.*?)/?$', show_resource),
)
然后在客户端阅读节目列表(交互式示例):
>>> from restful_lib import Connection
>>> import json
>>> # Create restful connection object
>>> conn = Connection("http://localhost:8000")
>>> # Use a get request to get a list of shows
>>> res = conn.request_get("/json/show/")
>>> # Convert the body of the response to a python object
>>> shows=json.read(str(res['body']))
>>> # result
>>> shows
[{'pk': 1, 'model': 'tv.show', 'fields': {'name': 'The Big Bang Theory'}}, {'pk': 2, 'model': 'tv.show', 'fields': {'name': 'Stargate Atlantis'}}, {'pk': 3, 'model': 'tv.show', 'fields': {'name': 'Fringe'}}, {'pk': 4, 'model': 'tv.show', 'fields': {'name': 'CSI Las Vegas'}}]
感谢您指点我正确的方向。