Ruby開発者向けのラックの説明
すべてのRails、Sinatra、およびその他のRuby Webフレームワークの舞台裏で何が起こっていますか?
答えは、これを可能にする重要なコンポーネントであるラックです。
しかし、ラックとは正確には何ですか?
Rackは、フレームワーク(Rails)とアプリケーションサーバー(Puma)の間のレイヤーです。
彼らがコミュニケーションをとることを可能にするのは接着剤です。
なぜラックを使用するのですか?
さまざまなフレームワークとサーバーを交換できるため、Rackを使用しています。
それらはプラグインできるコンポーネントになります 。
これは、Rails、Sinatra、およびその他のRack互換フレームワークでPumaを使用できることを意味します。使用しているフレームワークやサーバーがラックインターフェースを実装している場合は関係ありません 。
Rackを使用すると、すべてのコンポーネントがその役割を果たし、誰もが満足します!
ラックミドルウェアとは何ですか?
ラックは、すべてのWeb要求と応答の真ん中にあります。
その結果、不要なリクエストへのアクセスを拒否することで保護者として機能したり、遅い応答を追跡することで歴史家として機能したりすることができます。
それがラックミドルウェアです です!
要求と応答のサイクルの一部として呼び出され、それを使って何かをする機会を得る小さなRubyプログラム。
これはどのような用途に使用されますか?
- ロギング
- セッション
- プロファイリング(リクエストが完了するまでにかかる時間を確認する)
- キャッシュ
- セキュリティ(IPアドレスに基づいてリクエストを拒否するか、リクエストの数を制限します)
- 静的ファイル(css、js、png…)の提供
これらは非常に便利で、Railsはミドルウェアをうまく利用してその機能の一部を実装します 。
rake middleware
でミドルウェアのリストを見ることができます Railsプロジェクト内。
さて、このラックインターフェース 先ほど触れました。
どのように見えますか?
例を挙げましょう…
独自のラックアプリケーションを作成する方法
独自のアプリケーションを作成することで、Rackがどのように機能するかを学ぶことができます。
やってみましょう!
Rackアプリケーションは、call
という1つのメソッドを持つクラスです。 。
このように見えます :
require 'rack' handler = Rack::Handler::Thin class RackApp def call(env) [200, {"Content-Type" => "text/plain"}, "Hello from Rack"] end end handler.run RackApp.new
このコードは、ポート8080でサーバーを起動します(試してみてください! 。
この配列は何を返しますか?
- HTTPステータスコード(200)
- HTTPヘッダー(「Content-Type」)
- 内容(「HellofromRack」)
リクエストの詳細にアクセスする場合は、env
を使用できます 引数。
このように :
req = Rack::Request.new(env)
これらの方法が利用可能です :
- path_info(/ articles / 1)
- ip(ユーザーの)
- user_agent(Chrome、Firefox、Safari…)
- request_method(get / post)
- 本文(コンテンツ)
- media_type(plain、json、html)
この情報を使用して、Rackアプリケーションを構築することができます。 。
たとえば、IPアドレスが5.5.5.5
の場合、コンテンツへのアクセスを拒否できます。 。
コードは次のとおりです :
require 'rack' handler = Rack::Handler::Thin class RackApp def call(env) req = Rack::Request.new(env) if req.ip == "5.5.5.5" [403, {}, ""] else [200, {"Content-Type" => "text/plain"}, "Hello from Rack"] end end end handler.run RackApp.new
アドレスを127.0.0.1
に変更できます 効果を見たい場合。
それでも問題が解決しない場合は、::1
を試してください 、ローカルホストのIPv6バージョン。
ラックミドルウェアの作成と使用方法
今:
アプリケーションとミドルウェアをチェーンして連携させるにはどうすればよいですか?
Rack::Builder
の使用 。
理解するための最良の方法は、例を使用することです。
これが私たちのラックアプリです :
require 'rack' handler = Rack::Handler::Thin class RackApp def call(env) req = Rack::Request.new(env) [200, {"Content-Type" => "text/plain"}, "Hello from Rack - #{req.ip}"] end end
これはミドルウェアです :
class FilterLocalHost def initialize(app) @app = app end def call(env) req = Rack::Request.new(env) if req.ip == "127.0.0.1" || req.ip == "::1" [403, {}, ""] else @app.call(env) end end end
これが私たちがそれらを組み合わせる方法です :
app = Rack::Builder.new do |builder| builder.use FilterLocalHost builder.run RackApp.new end handler.run app
この例では、2つのRackアプリケーションがあります。
- IPチェック用に1つ(
FilterLocalHost
) - コンテンツ(HTML、JSONなど)を配信するためのアプリケーション自体用の1つ
@app.call(env)
に注意してください 、それがFilterLocalHost
の特徴です ミドルウェア。
2つのうちの1つが発生する可能性があります :
- ミドルウェアチェーンを停止する応答を返します
- リクエストを
@app.call(env)
と一緒に渡します 次のミドルウェア、またはアプリ自体に
ミドルウェアを含むRackアプリの任意の部分で、応答を変更できます。
例 :
class UpcaseAll def initialize(app) @app = app end def call(env) status, headers, response = @app.call(env) response.upcase! [status, headers, response] end end
それがまさにRackの仕組みです🙂
概要
RubyWebフレームワークとサーバー間の相互作用を促進するインターフェースであるRackについて学習しました。また、独自のRackアプリケーションを作成して、その動作を理解する方法も学びました。
ご不明な点やフィードバックがございましたら、下にコメントを残してください。
読んでくれてありがとう!
-
開発者向け iOS 12 ベータ版のインストール方法
WWDC 2018 は驚きと新しいエントリーでいっぱいでした。なかでも最も魅力的と言われているのは、iOS 12 の新しいアップグレードです。iOS 12 では、ミー文字、ARKit 2、アニ文字、Siri ショートカット、グループ FaceTime などの新しい変更が加えられます。 現在、開発者は iOS 12 を利用できます。 iOS 12 の新しいイテレーションを手に入れるのが待ちきれず、ベータ版に問題がない場合は、適切な場所に来ています. この投稿では、iOS 12 のベータ版をダウンロードしてインストールする方法について説明します。 注: ベータ版にはバグや改善の余地があり、通
-
Windows 10 を無料でダウンロードする方法 (説明付き)
Microsoft は Windows 7 のサポートを 1 年以上前に終了しており、デバイスを安全かつスムーズに実行し続けるために、最新の Windows 10 にアップグレードすることをユーザーに推奨しています。つまり、Windows 7 のテクニカル サポート、セキュリティ アップデート、またはバグ スカッシングがなくなるか、使用するのは安全ではないと言えます。Windows 10 に切り替える絶好の機会です。また、Windows 11 は今年の 10 月に展開される予定です。 Windows 10 ユーザー向けの無償アップグレードとしてのみ提供されます。そのため、コンピューターをアップ