2016-09-02 3 views
1

私はユーザー入力を受け入れ、背中に多くの処理を行うAPIを持っています。私の質問は、入力検証後に応答コード(200)を返すべきか、入力処理(mysqlへの保存、入力の書式設定、redisへの保存など)が終了するまで待つべきですか?Python:応答コードを返すのはいつですか?

サンプルコードは:

# Should I wait for the greenlets to finish processing - which might take a long time? 
@app.route('/messages', methods=['POST']) 
def send_message(): 
    user_input = flask.request.form.get('user_input') 

    if user_is_valid() and user_input_is_valid(user_input): 
     process_input = [gevent.spawn(format_input_and_save_to_mysql, user_input), 
         gevent.spawn(format_input_and_save_to_redis, user_input)] 
     gevent.join_all(process_input) 
     return 'Processing done', 200 

    return 'Unauthorized', 401 

# Or should I return immediately even though the processing is still being done? 
@app.route('/messages', methods=['POST']) 
def send_message(): 
    user_input = flask.request.form.get('user_input') 

    if user_is_valid() and user_input_is_valid(user_input): 
     gevent.spawn(format_input_and_save_to_mysql, user_input) 
     gevent.spawn(format_input_and_save_to_redis, user_input) 
     return 'Processing done', 200 

    return 'Unauthorized', 401 
+2

あなたのアプリケーションに適したものを実行する必要があります。正解はありません。 – davidism

答えて

1

あなたは応答を返すことは何を意味するのかを考える必要があります:ブラウザがブラウザが彼の要求は、行わリダイレクトまたは何らかの形で失敗したと思って、サーバーからの応答を受信した場合。

これにより、すべての特定のケースでこれについて考える必要があります。すべてのタスクの最後に要求処理の結果が必要な場合は、すべてのプロシージャが完了するのを待って結果を返すか、サブタスクの1つが失敗した場合は適切なステータスコードを返します。

しかし、これらのタスクが実際に長時間実行されている場合(数秒間など)、リクエストのタイムアウトが原因で問題が発生する可能性があります。もしそうなら、インターバルポーリング、ロングポーリング、ウェブソケットのような問題を解決するいくつかの手法があります。

あらゆる種類のポーリングはフロントエンドで実装されます。つまり、ブラウザはサーバに新しいコンテンツやデータを要求する必要があります。したがって、長時間実行されているタスクが開始されると、サーバーからの応答が返されます。この応答をブラウザで分析すると、指定されたAPIエンドポイントに対してポーリングが開始されます。長時間実行されているタスクの進行状況に基づいて、特定のステータスまたは処理されたデータを返し、ポーリングを停止する場合があります。プロセスが終了していない場合は、「実行中」のステータスを返して、再度ポーリングすることができます。したがって、ポーリングはブラウザからのいくつかの要求とサーバーからの適切な応答につながります。

ウェブサイトとは対照的に、ブラウザとサーバーの両方がウェブソケット接続上でいわゆるイベントを発生させることができるため、サーバーとブラウザ間のリアルタイム通信を提供します。

今日の終わりには、本当に必要なものを決める必要があります。 WebSocketは本当に素晴らしいですが、あなたが初心者の場合は、IMHOが扱いにくいです。ただし、方法の例はimplement websockets using Flask and geventです。しかし、あなたが覚えておく必要がある大きなものがあります。ポーリングまたはWebソケットを使用してこれらのサーバータスクの進行状況をリクエストする場合は、これらのタスクからステータスまたは進行メッセージを取得する必要があります。これらのタスクは解決することとはまったく異なります。このために出発点が必要な場合は、タスクキューを参照することをお勧めします。 Celery

関連する問題