2017-12-11 86 views
0

指定されたDjango Rest Frameworkで外部APIから内部APIを呼び出す必要があります。 ユーザーがフロントエンド(角にある)のボタン('View Calendar')をクリックすると、DRFのAPIエンドポイント('/viewCalendar/')が呼び出されます。これは外部APIエンドポイントです。 /viewCalendar/のエンドポイントのviews.pyでは、実際にメソッドを実行して出力を返す別のAPI(たとえば、'/commandExecForCalendar/')を呼び出すようなコードを記述する必要があります。この出力は、外部APIによってフロントエンドにさらに応答されます。 外部APIと内部APIの両方が同じDRFプロジェクトに存在します。Django Restフレームワーク:外部APIから内部APIを呼び出す

myDRFProj/ 
    commandExecApp/ 
     views.py -------- > this CBV works for internal calls 
     . 
     . 
    externalAPIApp/ 
     views.py -------- > this CBV handles API call from front-end and it will call the API for internal calls 

    mydrfproj/ 
     settings.py 
     urls.py ---------- > holds both external and internal API endpoints 

urls.py

url(r'commandExecForCalendar', commandExecAppView.cmdExcFrCalendar.as_view()), 
url(r'viewCalendar', externalAPIAppView.extApiCall.as_view()), 

ので、外観は内部に要求データを送信し、フロントエンドへの対応まで、そこから結果を取得するように、これらの二つのビューを作成する方法?

+0

です。 REST APIエンドポイントを同じに保ちながら、呼び出されるコードの主な実装を複数の場所から移動することができます。したがって、 'commandExecApp'のコードをヘルパーメソッドまたはクラスに抽象化し、そのモジュールを' externalAPIApp'によって使用されるようにインポートすると、明示的にHTTPリクエストを行う必要がなくなります。 – Jason

答えて

0

APIの複雑さによっては、externalAPIAppビューをCommandExecApp CBVのサブクラスになるようにデザインすることができます。

私は過去にこれを試みましたが、DRFクラスベースのビューの関数シグネチャと戻り値の型によって、ロードブロッキングが発生しました。これは、アプリケーション内で継承(vs構成)を介して機能を拡張する場合には珍しくありません。これにアプローチするには、いくつかの方法がある、と述べた

APIゲートウェイ

デザインexternalAPIAppは、本質的にcommandExecApp API経由に至るまでのHTTPリクエストを渡すゲートウェイのWebサービスとして動作するようにHTTP。

externalAPIAppcommandExecAppに送信する「クライアント」リクエストについては、requestsライブラリをご覧ください。

  1. 外部API:にアクセス可能で、外部のクライアントを許可孤立API

    共有ドメインモジュール

    は、アプリケーションへの3つの主要コンポーネントがあります考えてみましょう。

  2. 内部API:内部クライアントにアクセス可能で、内部クライアントを許可する独立したAPIです。
  3. ドメインモジュール:Django ORMとのすべての対話を処理する自己完結型のPythonモジュール。

トレードオフ

の両方に長所と短所があります。

ゲートウェイ手法では、追加(ローカル)ネットワーク要求に関連する遅延が発生します。一方、DRFは、ドメインロジックと緊密に結合するのに役立つ、開発者の時間を節約する機能/コンポーネントを提供します。

共有ドメインモジュールは懸念をより明確にしますが、より多くのコードを書いてテストすることが多いようです。

結局それはヘルパーメソッドやパッケージが便利です。これは、あるなど、建築、開発スケジュールの理解をするという決定、技術ロードマップ、関係者、

+0

ありがとう貴重な意見私がここで行ったこと:外部APIは 'requests'.method()で内部APIを呼び出します。request.dataを送信するために、私はjson.dumps(reeust.data)を使いました。内部APIが応答すると、データはdictからjsonに変換されました()。しかし、それはテスト目的のアプローチでした。また、内部クラスのオブジェクトを作成しています。両方とも働いた。 – SamCodes

関連する問題