真のsinatra(ruby/rack) after_filterの最速の方法は何ですか?
-
21-08-2019 - |
質問
はい、簡単な作業です。HTML をクライアントにレンダリングした後、リクエストからの情報を使用して db 呼び出しを実行したいと考えています。
私は軽量のマイクロフレームワークである Sinatra を使用していますが、実際には、より高速で簡単 (ラック?) であれば、Ruby のものは何でも利用できます。URLを取得し、そのURLに基づいてクライアントを別の場所にリダイレクトしたいだけです。
それでは、実際の after_filter であるrack/sinatraをどのように扱うのでしょうか。after_filter とは、応答がクライアントに送信された後を意味します。それとも、スレッドなしでは実行できないだけですか?
私はsinatraをフォークしてafterフィルターを追加しましたが、応答をフラッシュする方法はありません。ファイル(明らかにバイナリ用)をストリームすることを想定しているsend_dataでさえ、after_filtersを待ちます。
次の質問を見ました。 Ruby でのマルチパート応答 しかし、答えはレールにあります。そして、それが本当にクライアントへの応答をフラッシュし、その後の処理を可能にするかどうかはわかりません。
Rack::Callbacks には前後のコールバックがいくつかありますが、それらも応答がクライアントに送信される前に実行されるように見えます。 Rack::コールバック 実装(コメント追加):
def call(env)
@before.each {|c| c.call(env) }
response = @app.call(env)
@after.each {|c| c.call(env) }
response
#i am guessing when this method returns then the response is sent to the client.
end
したがって、rakeを使用してシェルを通じてバックグラウンドタスクを呼び出すことができることがわかりました。でも、それも無いと良いのですが…。もあります 決してブロックしない しかし、それは応答を遅らせることなく別のプロセスを実行するのに適していますか、それともアプリ全体を待たせることになるでしょうか(そうなると思います)?
これは大変なことだとは思いますが、要するに、応答が Ruby/sinatra/rack に送信された後に実際に実行される単純な after_filter です。
私の質問を読んでくれたり、答えてくれてありがとう!:-)
解決
run_later ポートを Rails に変更して、このトリックを実行するようにしました。ファイルはここで入手できます。
http://github.com/pmamediagroup/sinatra_run_later/tree/master