17

同じサーバーに配置された REST API に基づく Web アプリケーションがあります。アクセス可能なTaskリソースと、基本的にタスクを作成するための単なるフォームで/api/task/<task_id>ある Web ページがあるとします。/create-taskそれにはいくつかの方法があります。

a) Javascript を使用して REST API と通信する (そうしたくない)

b) データベースにオブジェクトを直接作成する

@app.route('/create-task', methods=['POST'])
def create_task(self):
    # create an object
    try:
        task = Task(request.form)
    except:
        # handle errors and put them to form
        pass
    # save it into db
    task.save()

c)requestsライブラリを使用して REST API を呼び出す

@app.route('/create-task', methods=['POST'])
def create_task(self):
    # send request to REST API
    r = requests.post(url_for('api.task', _external=True), json=request.form.data)
    if r.status_code != 200:
        # handle errors and put them to form
        pass

どのオプションがベスト プラクティスであると考えられますか? エラー処理とフォームに関連する問題を考えてみてください。

おまけ質問についてflask-restful。フラスコレストフルで構築された動作中の API が既にあり、オプション b) を使用したいとしましょう。どういうわけかTaskResource.postそれを行うために使用できますか?

4

1 に答える 1

12

可能であれば、実際に最善の方法は、HTTP や REST を経由せずに、Python を介して API コードを直接呼び出すことです。これにより、HTTP 要求のオーバーヘッドと発生する可能性のある障害点が回避されます。私は慣れてflask-restfulいないので、これがどれほど簡単かわかりません。「フラスコの安静なAPIリソースメソッドの呼び出し」の答えは、APIから共通コードを抽出して、APIとアプリの両方で使用できるライブラリに抽出することを示唆しているようです。

それ以外:

A) API が認証を必要としない場合、または「秘密」であることを意図していない場合、Javascript/AJAX を使用することはそれほど悪くないかもしれません。Javascript でフォーム エラー処理を記述する必要がありますが、REST API 呼び出しでエラーが返された場合は、/create-task への HTTP 要求を回避できます。

C) は B) より優れています。壊れる可能性が少ないからです。タスクの作成を担当するのは REST API のみであり、ユーザーが行っているのはパラメーターを渡すことだけです。問題は、API からエラー応答を読み取り、フォーム ハンドラーに書き直す必要があることです。これはばかげた作業です。また、これにより、 で適切な URL を生成できたりurl_for('api.task')、実稼働サーバーでその URL にアクセスできたりするなどの脆弱性が生じます。

B) は、コードのコピーと貼り付けが悪いのと同じ理由で悪いです。タスクが作成される場所が 2 つあります。何かを変更する場合は、両方を変更することを忘れないでください (データベースの実装の詳細など)。これは最終的に壊れて戻ってきてあなたを傷つけます。

于 2014-11-13T10:26:41.710 に答える