Webサービスを作成する1つの方法は、休息です。
休みます。 RESTデータは、少数の標準形式(HTML、XML、JSONなど)で送信する必要があります。 ネットワークプロトコル(HTTPなど)はキャッシュをサポートする必要があり、ネットワーク層に依存してはならず、要求と応答のペア間で状態情報を保存してはなりません。 このアプローチはシステムにスケーラビリティを提供し、新しい要件に合わせて進化させることができると主張されています。
Django RESTフレームワークは、Djangoフレームワークのイデオロギーに基づいて休息を扱うための便利なツールです。
環境要件:
Python(2.6、2.7)
ジャンゴ(1.3、1.4、1.5)
リクエストに応じて:
マークダウン
PyYaml
ジャンゴフィルター
設置
通常のpipコマンドをインストールできます:
pip install djangorestframework
そして、あなたは追加のパッケージを置くことができます:
pip install markdown pip install pyyaml pip install django-filter
または、Githubを使用してプロジェクトのクローンを作成します。
git clone git@github.com:tomchristie/django-rest-framework.git cd django-rest-framework pip install -r requirements.txt pip install -r optionals.txt
INSTALLED_APPSにアプリケーションを登録することを忘れないでください。
INSTALLED_APPS = ( ... 'rest_framework', )
また、urls.pyにエントリを追加します。
urlpatterns = patterns('', ... url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) )
Urlはお好みに設定できます。主なことは、ファイルをurls rest framework(rest_framework.urls)に接続することです。
使用例
ユーザーとそのグループで動作するAPIを作成します。
最初に、使用するシリアライザーを定義する必要があります。
from django.contrib.auth.models import User, Group, Permission from rest_framework import serializers class UserSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = User fields = ('url', 'username', 'email', 'groups') class GroupSerializer(serializers.HyperlinkedModelSerializer): permissions = serializers.ManySlugRelatedField( slug_field='codename', queryset=Permission.objects.all() ) class Meta: model = Group fields = ('url', 'name', 'permissions')
views.pyを書きましょう
from django.contrib.auth.models import User, Group from rest_framework import generics from rest_framework.decorators import api_view from rest_framework.reverse import reverse from rest_framework.response import Response from quickstart.serializers import UserSerializer, GroupSerializer @api_view(['GET']) def api_root(request, format=None): """ The entry endpoint of our API. """ return Response({ 'users': reverse('user-list', request=request), 'groups': reverse('group-list', request=request), }) class UserList(generics.ListCreateAPIView): """ API endpoint that represents a list of users. """ model = User serializer_class = UserSerializer class UserDetail(generics.RetrieveUpdateDestroyAPIView): """ API endpoint that represents a single user. """ model = User serializer_class = UserSerializer class GroupList(generics.ListCreateAPIView): """ API endpoint that represents a list of groups. """ model = Group serializer_class = GroupSerializer class GroupDetail(generics.RetrieveUpdateDestroyAPIView): """ API endpoint that represents a single group. """ model = Group serializer_class = GroupSerializer
APIの開始点となるapi_root関数を作成しました。 モデルと通信するための4つのクラスは、どのシリアライザーを使用すべきかを示しました。
urls.pyにリンクを追加します
from django.conf.urls import patterns, url, include from rest_framework.urlpatterns import format_suffix_patterns from quickstart.views import UserList, UserDetail, GroupList, GroupDetail urlpatterns = patterns('quickstart.views', url(r'^$', 'api_root'), url(r'^users/$', UserList.as_view(), name='user-list'), url(r'^users/(?P<pk>\d+)/$', UserDetail.as_view(), name='user-detail'), url(r'^groups/$', GroupList.as_view(), name='group-list'), url(r'^groups/(?P<pk>\d+)/$', GroupDetail.as_view(), name='group-detail'), ) # Format suffixes urlpatterns = format_suffix_patterns(urlpatterns, allowed=['json', 'api']) # Default login/logout views urlpatterns += patterns('', url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) )
重要なポイントは、ユーザー詳細とグループ詳細の使用です。 views.pyと正しく通信するには、{modelname} -detailという形式の命名を使用する必要があります。
format_suffix_patternsでは、URLのサフィックスを指定しました。
設定
INSTALLED_APPS = ( ... 'rest_framework', ) REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAdminUser',), 'PAGINATE_BY': 10 }
結果
コンソールでcurlを使用して、何が起こったかをテストします。
bash: curl -H 'Accept: application/json; indent=4' -u admin:password http://127.0.0.1:8000/users/ { "count": 2, "next": null, "previous": null, "results": [ { "email": "admin@example.com", "groups": [], "url": "http://127.0.0.1:8000/users/1/", "username": "admin" }, { "email": "tom@example.com", "groups": [ ], "url": "http://127.0.0.1:8000/users/2/", "username": "tom" } ] }
ブラウザでは、次のようなものを見ることができます:
参照:
プロジェクトサイト
Github
PS djangoで休息をとるために、 django-pistonと呼ばれる別の悪くないアプリケーションがあります。 ご希望であれば、それについて書くことができますが、使用中はそれほど複雑ではありません。