2

私はDjangoWebアプリケーションを持っています。これにより、ユーザーはUIからHTTPを介してリモートサーバーでstop / start/install_pkgを実行できます。Django Webアプリには、開始/停止/ install_pkg関数がすでに実装されており、基本的に適切なURLを作成し、パラメーターを使用してHTTPURLを呼び出します。

私の目標は、ユーザーが次のようなREST呼び出しを行うときに同じ内部関数を使用することです。

1. https://api/v1/server/<server_name>/start/?api_key=<api_key>&params=<params>
2. https://api/v1/server/<server_name>/stop/?api_key=<api_key>&params=<params>
3. https://api/v1/server/<server_name>/install_pkg/?api_key=<api_key>&params=<params>

そして、リモートサーバー応答オブジェクトを含む呼び出し元にJSON応答を返します。

これまで、Tastypieライブラリを使用して、RESTを介したDjangoWebアプリのモデルデータへの読み取り専用アクセスを公開してきました。

非ORMリソースに関するTastypieチュートリアルは、Tastypieの9つのメソッドをオーバーライドすることによって非ORMリソースと対話する方法を示しています。しかし、私の限られた知識と理解を考えると、私の場合にTastypieを使用する方法についてはよくわかりません。ここに何か足りないものがありますか?

編集:(2012年10月29日)

さらに明確にするために-DjangoWebアプリには各リモートサーバーのORMエントリがありますが、この情報は登録時に作成されるため、(name、ip、domain、...)などの特定のリモートサーバーに関する静的情報です。 DjangoWebアプリへのリモートサーバー。

Django WebアプリからリモートサーバーへのWebサービス呼び出しは、(app_state、pkg_installed_list、...)のようなリモートサーバーの最新の状態をフェッチしますが、このデータはDjnagoWebアプリのどこにも保存されません。UIの場合と同じようにレンダリングされます。

したがって、リモートサーバーに関するDjango WebアプリのGETは、基本的に静的情報を返します。

ありがとう、

4

1 に答える 1

8

1つの方法は、サーバーリソースのみを追跡し、カスタムエンドポイントとしてstart / stop/install_pkgを実装することです。

Tastypieの下にサーバーリソースを実装して、通常のORMベースのリソースを使用して各サーバーのエンドポイントを設定します。これは、リソースに標準のREST操作を実装し、サーバー情報を読み取るためにGETを実行し、サービスで管理するために別のサーバーを追加する必要がある管理者ユーザーがいる場合はPOSTを実行して、既存のサーバーを更新するためにPUT/PATCHを実行します。

次に、ServerResourceを拡張して、次の方法で追加のエンドポイントを含めます。

  1. prepend_urls3つのカスタムエンドポイント(start、stop、install_pkg)を定義するために使用する
  2. サーバーリソースの下の関数に各エンドポイントを実装し、セキュリティを考慮して操作を制限します(GETまたはPOSTを呼び出しますか?)

もう1つの方法は、サーバーリソースと多対多の関係を持つ非ORMリソースとしてServiceResourceを作成することです。これはよりトリッキーですが、間違いなくはるかにクリーンなデザインです。

ServiceResourceには、前のシナリオ(開始/停止)と同じように2つのカスタムエンドポイントがありますが、サーバーにサービスをインストールするには、そのサービスに関連付けるServerResourceにPUT/PATCHを送信します。

より具体的な回答については、より具体的な質問を述べてください。


続行する方法の詳細については、Tastypieクックブックを参照してください。

この検索例ではoverride_urls、0.9.11で使用したいものを使用しており、prepend_urlsまだリリースされていない0.9.12と同様の動作をします。使用しているバージョンに応じて、3つのカスタムエンドポイントを作成する必要があります。

 def override_urls(self):
        return [
            url(r"^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/%start%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('start'), name="api_start"),
            url(r"^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/%stop%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('stop'), name="api_stop"),
            url(r"^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/%install_pkg%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('install_pkg'), name="api_install_pkg"),
        ]

次に、ServerResourceの検索例と同様に3つのハンドラーを定義する必要があります。start関数の開始点を示します。これは同期操作の例です。非同期にしたい場合は、さらに多くのことが必要になりますが、それが出発点です。

from tastypie.http import Http

def start(self, request, **kwargs):
    self.method_check(request, allowed=['post'])
    self.is_authenticated(request)
    self.throttle_check(request)

    try:
        output = function_that_starts_server(kwargs['pk'])
    except FailedException as failure:
        return self.create_response(request, { 'status' : 'failure', 'reason' : failure }, Http

    self.log_throttled_access(request)
    return self.create_response(request, { 'status' : 'success', 'log' : output })
于 2012-10-27T02:42:33.853 に答える