私はDjango RESTフレームワークの初心者であり、アドバイスが必要です。 Webサービスを開発しています。サービスは、他のサービスにRESTインターフェースを提供する必要があります。実装する必要があるRESTインターフェイスは、モデルを直接操作していません(get、put、post、delete操作を意味します)。代わりに、他のサービスにいくつかの計算結果を提供します。リクエストに応じて、私のサービスはいくつかの計算を行い、結果を返すだけです(結果を独自のデータベースに保存しません)。
以下は、RESTインターフェースを実装する方法についての私の理解です。私が間違っている場合、私を修正します。
私は何か見落としてますか?アプローチは一般的に正しいですか?
Django-rest-frameworkは、モデルに関連付けなくてもうまく機能します。あなたのアプローチは大丈夫に聞こえますが、すべてを機能させるためにいくつかのステップをトリミングできると思います。
たとえば、restフレームワークにはいくつかの組み込みレンダラーが付属しています。そのままで、JSONとXMLをAPIコンシューマーに返すことができます。必要なpythonモジュールをインストールするだけでYAMLを有効にすることもできます。 Django-rest-frameworkは、dict、list、Tupleなどの基本的なオブジェクトを出力します。追加の作業は必要ありません。
したがって、基本的には、引数を受け取り、必要な計算をすべて実行し、その結果をTupleでREST apiビューに返す関数またはクラスを作成するだけです。 JSONやXMLがニーズに合う場合、Django-rest-frameworkがシリアル化を処理します。
この場合、手順2と3をスキップして、1つのクラスを計算用に使用し、もう1つをAPIコンシューマーに提示するために使用できます。
ここにいくつかのスニペットが役立ちます:
私はこれをテストしていないことに注意してください。これは単なる例であり、動作するはずです:)
CalcClass:
class CalcClass(object):
def __init__(self, *args, **kw):
# Initialize any variables you need from the input you get
pass
def do_work(self):
# Do some calculations here
# returns a Tuple ((1,2,3, ), (4,5,6,))
result = ((1,2,3, ), (4,5,6,)) # final result
return result
RESTビュー:
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from MyProject.MyApp import CalcClass
class MyRESTView(APIView):
def get(self, request, *args, **kw):
# Process any get params that you may need
# If you don't need to process get params,
# you can skip this part
get_arg1 = request.GET.get('arg1', None)
get_arg2 = request.GET.get('arg2', None)
# Any URL parameters get passed in **kw
myClass = CalcClass(get_arg1, get_arg2, *args, **kw)
result = myClass.do_work()
response = Response(result, status=status.HTTP_200_OK)
return response
あなたのurls.py:
from MyProject.MyApp.views import MyRESTView
from Django.conf.urls.defaults import *
urlpatterns = patterns('',
# this URL passes resource_id in **kw to MyRESTView
url(r'^api/v1.0/resource/(?P<resource_id>\d+)[/]?$', login_required(MyRESTView.as_view()), name='my_rest_view'),
url(r'^api/v1.0/resource[/]?$', login_required(MyRESTView.as_view()), name='my_rest_view'),
)
http://example.com/api/v1.0/resource/?format=json にアクセスすると、このコードはリストのリストを出力するはずです。サフィックスを使用する場合は、?format=json
を.json
に置き換えることができます。ヘッダーに"Content-type"
または"Accept"
を追加して、取得するエンコードを指定することもできます。
[
[
1,
2,
3
],
[
4,
5,
6
]
]
これがお役に立てば幸いです。