2009-06-24 3 views
0

Peut-être que je devrais d'abord donner une idée de ce que je veux accomplir car il pourrait y avoir une bien meilleure solution.Accès à distance à Django ORM

J'ai une application Web à l'aide de Django qui gère les médias (TV enregistrée, films, etc.). L'application Web vous permet d'ajouter des métadonnées aux médias, telles que ce que vous avez regardé par utilisateur, et vous permet d'effectuer des recherches et de les synchroniser avec des ressources Web pour obtenir des informations sur les heures de diffusion, etc.

Les fichiers multimédias réels vit sur un serveur de fichiers, auquel le système Django a accès à numériser et mettre à jour sa base de données.

J'ai également plusieurs systèmes de jeu multimédia qui peut lire les fichiers multimédias du serveur de fichiers, avec les extrémités avant-écrites en Python.

Ce frontend a besoin des méta-données pour afficher une interface utilisateur. Actuellement, je crée des vues avec Django qui présente les données au format XML, puis récupère les pages sur les frontaux en utilisant urllib2. Ce que j'aimerais vraiment, c'est un moyen d'accéder à l'ORM de Django qui gère directement les méta-données des médias depuis les systèmes de lecture de média, afin que je puisse avoir la puissance de l'ORM complet là-bas.

Donc, enfin de retour à ma question. Existe-t-il un moyen d'accéder à distance à l'ORM de manière autonome? Je suppose que je pourrais copier le modèle sur les systèmes frontaux, puis leur donner un accès direct à la base de données, mais il doit y avoir une solution plus élégante.

Répondre

4

Avez-vous vraiment besoin de toute la puissance d'ORM dans le client? Si vous ne le faites pas, une sorte de service Web serait favori pour mon argent. REST est le chéri actuel, voir par ex. django-rest-interface.

Sinon, je ne vois pas d'issue élégante. Vous pourriez peut-être échapper au besoin de connexions DB directes en décochant les Querysets et les résultats et en les balançant via une API, mais c'est probablement plus compliqué que ça en vaut la peine.

+0

Vous avez raison, je n'ai probablement pas besoin de tout l'ORM dans le client. Je voulais juste éviter d'avoir à tout emballer en XML et à le déballer tout le temps. djang-rest-interface a l'air intéressant, j'irai lire. Merci! –

+1

django-piston est un chéri parmi les chéris. –

1

Je ne pense pas que l'accès à la base de données est directement une mauvaise façon d'y parvenir. Si vous placez vos modèles dans un module approprié, le partage ne devrait pas poser de problème.

Cependant, vous exposez les définitions du modèle, il peut être un peu difficile de changer vous schéma de base de données et des définitions modèle. Utiliser XML comme interface pour découpler ce n'est pas vraiment mauvais.

Une autre option serait un mécanisme d'appel de procédure à distance.

0

Pour ma référence (et peut-être d'autres), voici une solution rapide et par exemple en utilisant les bibliothèques suivantes:

Je sais que Python 2.6 a un support intégré pour JSON, mais malheureusement je suis coincé avec Python 2.5 en raison d'autres restrictions de la bibliothèque, au moins pour l'instant.

modèle 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), 
) 

Et puis sur le côté client de lire la liste des spectacles (exemple interactif):

>>> 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'}}] 

Merci de m'avoir indiqué dans la bonne direction tout le monde.