2009-11-13 9 views
10

私は新しいプロジェクトのためにDjangoを学ぶための言い訳を探しています。通常、XMLやJSONなどのプラットフォームに依存しないコンテキストでデータを吐き出すリソースにURLをマップする、RESTfulなサーバーサイドインターフェイスを構築するのが好きです。これは ですが、フレームワークを使用しないと簡単に行うことができますが、Ruby on Railsなどの一部のツールでは、既存のモデルコードに基づいて、渡したURLのタイプに基づいて簡単にXMLをクライアントに返すことができます。Django RESTfulインターフェイスを構築するのが簡単

私の質問は、Djangoのようなものがこれをサポートしていますか?私はグーグルで、Djangoの上に行くことができるいくつかの 'RESTfulな'第三者コードを発見しました。私があまりにも熱心であるかどうかは分かりません。

Django以外のPythonフレームワークは既にこれを念頭に置いて作成されていますので、PHPのような言語で既に持っているように、私は再構成する必要はありません。

答えて

15

これはおそらく行うことはとても簡単です。

URLマッピングは、たとえば、構築するのは簡単です:それはXMLにモデルを有効にするのは簡単ですので

urlpatterns = patterns('books.views', 
    (r'^books/$', 'index'), 
    (r'^books/(\d+)/$', 'get')) 

Djangoは、model serializationをサポートしています。

from django.core import serializers 
from models import Book 

data = serializers.serialize("xml", Book.objects.all()) 

decoratorsと2を組み合わせて、あなたが構築することができます高速ハンドハンドラー:

from django.http import HttpResponse 
from django.shortcuts import get_object_or_404 

def xml_view(func): 
    def wrapper(*args, **kwargs): 
    result = func(*args, **kwargs) 
    return HttpResponse(serializers.serialize("xml", result), 
     mimetype="text/xml") 
    return wrapper 

@xml_view 
def index(request): 
    return Books.objects.all() 

@xml_view 
def get(request, id): 
    return get_object_or_404(Book, pk=id) 
+1

JSONはどうですか? – marcc

+3

同様の 'json_view'デコレータを作成します:' return HttpResponse(json.dumps(result)、mimetype = "application/json") ' –

+1

(' simplejson'をインストールするか、組み込み 'json'モジュールをPython 2.6以降) –

2

どのような種類のデータでも応答できます。 JSON/XML/PDF/pictures/CSV ...

Django自体にはset of serializersが付属しています。

編集

私はちょうどPistonで見ていた - 有望に見えます。最高の機能:

あなたのやり方は変わりません。

:)

+0

django-pistonは問題ありません。私の意見ではまだ少し未熟です。 – marcc

1

1年以上前のことですが、インターネットでメディアをストリーミングするシアトルの大企業のために、DjangoにREST Webサービスを書きました。

Djangoは目的には優れていました。 「有料オタク」のように、DjangoのURL設定はすばらしく、必要な方法でURLを設定し、適切なオブジェクトを提供することができます。

Django ORMはバイナリBLOBをサポートしていません。写真などを提供したい場合は、データベースではなくファイルシステムに保存する必要があります。複数のサーバーを使用していたため、独自のBLOBサポートを作成するか、すべてのサーバーを最新のバイナリデータで最新の状態に保つためのレプリケーションフレームワークを見つけるかを選択する必要がありました。 (私は自分のBLOBサポートを書くことにしましたが、それほど難しくはありませんでしたので、実際にはDjangoの人たちはその作業をしませんでした。

私はDjango ORMが本当に好きです。それはデータベース部分を本当に簡単にします。 any SQLを知る必要はありません。(私はSQLが気に入らず、Pythonが好きなので、二重の勝利です。)無料で入手できる「管理インターフェース」は、あなたのデータを見渡し、テスト中にデータを突き抜ける素晴らしい方法を提供しますおよび開発。

私は予約なしでDjangoをお勧めします。

3

Pistonは、RESTful APIを作成するためのDjango用のミニフレームワークです。

エリックHolscherの最近のブログ記事は、ピストンを使用しての長所のいくつかのより多くの洞察を提供:pistonためLarge Problems in Django, Mostly Solved: APIs

4

(私が最も明白なリンクを編集する必要がありました。)

1 - (リンク上記)。私は以前はapibuilder(ワシントンタイムズのオープンソース)を使っていましたが、Pistonは私にとっては簡単です。私にとって最も難しいのは、APIのURL構造を把握し、正規表現を助けることです。私もsurlexを使って、その雑用をはるかに簡単にしました。

class Group(models.Model): 
    """ 
    Tree-like structure that holds groups that may have other groups as leaves. 
    For example ``st01gp01`` is part of ``stage1``. 
    This allows subgroups to work. The name is ``parents``, i.e.:: 

     >>> stage1group01 = Group.objects.get(unique_name = 'St 1 Gp01') 
     >>> stage1group01 
     >>> <Group: St 1 Gp01> 
     # get the parents... 
     >>> stage1group01.parents.all() 
     >>> [<Group: Stage 1>] 

    ``symmetrical`` on ``subgroup`` is needed to allow the 'parents' attribute to be 'visible'. 
    """ 
    subgroup = models.ManyToManyField("Group", related_name = "parents", symmetrical= False, blank=True) 
    unique_name = models.CharField(max_length=255) 
    name = models.CharField(max_length=255) 
    academic_year = models.CharField(max_length=255) 
    dept_id = models.CharField(max_length=255) 
    class Meta: 
     db_table = u'timetable_group' 
    def __unicode__(self): 
     return "%s" % self.name 

そしてこのurls.py断片(正規表現マクロを簡単に設定することを可能にすることsurlexに注意してください):(私たちが取り組んでいる時刻表システムから)Groupためにこのモデルを使用して

例、 :

from surlex.dj import surl 
from surlex import register_macro 
from piston.resource import Resource 
from api.handlers import GroupHandler 
group_handler = Resource(GroupHandler) 

# add another macro to our 'surl' function 
# this picks up our module definitions 
register_macro('t', r'[\w\W ,-]+') 

urlpatterns = patterns('', 
# group handler 
# all groups 
url(r'^groups/$', group_handler), 
surl(r'^group/<id:#>/$', group_handler), 
surl(r'^group/<name:t>/$', group_handler),) 

その後、このハンドラは、(デフォルトで)JSON出力した後になりますし、またXMLやYAMLを行うことができます。あなたが見ることができるように

class GroupHandler(BaseHandler): 
    """ 
    Entry point for Group model 
    """ 

    allowed_methods = ('GET',) 
    model = Group 
    fields = ('id', 'unique_name', 'name', 'dept_id', 'academic_year', 'subgroup') 

    def read(self, request, id=None, name=None): 
     base = Group.objects 
     if id: 
      print self.__class__, 'ID' 
      try: 
       return base.get(id=id) 
      except ObjectDoesNotExist: 
       return rc.NOT_FOUND 
      except MultipleObjectsReturned: # Should never happen, since we're using a primary key. 
       return rc.BAD_REQUEST 
     else: 
      if name: 
       print self.__class__, 'Name' 
       return base.filter(unique_name = name).all() 
      else: 
       print self.__class__, 'NO ID' 
       return base.all() 

、ハンドラコードのほとんどは、パラメータがurlpatternsに渡されているかを把握しています。

URLの例としては、api/groups/,api/group/3301/api/group/st1gp01/などがあり、いずれもJSONが出力されます。

2

第三者コードが好きではないというあなたのコメントについて - それはあまりにも悪いです。プラグイン可能なアプリは、djangoの最大の機能の1つです。他の人が答えたように、ピストンはあなたのために仕事のほとんどを行います。

関連する問題