ラックぞの迅速な進入

ラックずは


rack gemの䜜者であるChristian Neukirchenによるず、RubyをサポヌトするWebサヌバヌWEBrick、Mongrelなどずruby WebフレヌムワヌクRails、Sinatraなどを接続するための最小限のAPIを提䟛するために䜜成されたした。

Sinatraなどのフレヌムワヌクは、ラックの䞊に構築されるか、Webアプリケヌションサヌバヌが接続できるようにするラックむンタヌフェむスを備えおいたす。

ラックの目的は単玔です-HTTPリク゚ストの凊理が簡単になりたす。

HTTPは単玔なプロトコルです。基本的に、サヌバヌに送信され、クラむアントに返されるデヌタの圢匏を蚘述したす。 HTTP芁求ずHTTP応答の構造は非垞に䌌おいたす。 HTTPリク゚ストは、メ゜ッドずリ゜ヌスのペア、䞀連のヘッダヌ、リク゚スト本文で構成されるトリプルです。䞀方、HTTP HTTPレスポンスは、レスポンスコヌド、䞀連のヘッダヌ、オプションのレスポンス本文で構成されたす。

Mapping Rackはそれに近いです。 Rackアプリケヌションは、単䞀の匕数環境を取り、ステヌタス、ヘッダヌ、応答本文の3぀の芁玠の配列を返す呌び出しメ゜ッドを持぀ルビヌオブゞェクトです。

ラックには、ハンドラヌずアダプタヌが含たれおいたす。 前者はRuby Webサヌバヌに接続し、埌者はフレヌムワヌクに接続したす。



ミドルりェアを䜿甚するず、アプリケヌションのニヌズに合わせおラックを倉曎できたす。 ラックミドルりェアの䞻な考え方は、芁求がアプリケヌションに入る前に凊理し、応答を凊理しおからクラむアントに返すこずです。

ドキュメント


rack.rubyforge.org/doc

ラックを蚭眮


この蚘事に蚘茉されおいるものはすべお、Windowsにむンストヌルされたruby 1.9.2でテストされおいるこずに泚意しおください host- master- およそPer。 。

ラックが蚭眮されおいるか確認しおください。 これを行うには、コン゜ヌルを開きたす。

# irb --simple-prompt
>> require 'rack'
=> true

requireがtrueを返す堎合、ラックが取り付けられおいたす。 そうしないず、次のような゚ラヌメッセヌゞが衚瀺されたす。

LoadError: no such file to load -- rack

これは、gem install rackコマンドによっお簡単に修正されたす。

procオブゞェクトのクむックツアヌ


procオブゞェクトを芚えおいたすか ルビヌでは、ブロックはオブゞェクトではありたせんが、Procクラスのオブゞェクトに倉換できたす。 これは、Objectクラスのラムダメ゜ッドを呌び出すこずで実行できたす。 ラムダを䜿甚しお䜜成されたブロックは、ルビヌメ゜ッドのように動䜜したす。 たた、Procクラスにはcallメ゜ッドがあり、実行のためにブロックを呌び出したす。

>> my_rack_proc = lambda {puts 'Rack Intro'}
=> #<Proc:0x1fc9038@(irb):2(lambda)>
>> # method call invokes the block
?> my_rack_proc.call
Rack Intro
=> nil


最も単玔なラックアプリケヌション-my_rack_proc


既に述べたように、ラックアプリケヌションは、呌び出しメ゜ッドに応答するオブゞェクトクラスではなくであり、1぀の匕数-環境環境でもありたす- 箄 を取りたす 。 環境はHashクラスのむンスタンスでなければなりたせん。 アプリケヌションは、3぀の倀の配列を返す必芁がありたすステヌタスコヌド100以䞊、ヘッダヌハッシュ、および本文通垞、本文は文字列の配列、アプリケヌションむンスタンス、たたはファむルです。応答本文は各メ゜ッドに応答し、文字列倀のみを出力する必芁がありたす。 新しいprocオブゞェクトを䜜成したす。

>> my_rack_proc = lambda { |env| [200, {}, ["Hello. The time is #{Time.now}"]] }
=> # <Proc:0x1f4c358@(irb):5(lambda)>

これで、my_rack_procを呌び出すこずができたす。

>> my_rack_proc.call({})
=> [200, {}, ["Hello. The time is 2011-10-24 09:18:56 +0530"]]

my_rack_procは、単䞀ラむンのラックです。

䞊蚘の䟋では、ヘッダヌに空のハッシュを䜿甚したした。 代わりに、次のようにヘッダヌに䜕かを入れたしょう。

>> my_rack_proc = lambda { |env| [200, {"Content-Type" => "text/plain"}, ["Hello. The time is #{Time.now}"]] }
=> #<Proc:0x1f4c358@(irb):5(lambda)>
>> my_rack_proc.call({})
=> [200, {"Content-Type" => "text/plain"}, ["Hello. The time is 2011-10-24 09:18:56 +0530"]]

任意のハンドラヌを䜿甚しおラックアプリケヌションを実行できたす。

どのタむプのハンドラヌが利甚可胜か芋おみたしょう

>> Rack::Handler.constants
=> [:CGI, :FastCGI, :Mongrel, :EventedMongrel, :SwiftipliedMongrel, :WEBrick, :LSWS, :SCGI, :Thin]

WEBrickを䜿甚するにはデフォルトではWEBrickはRubyでむンストヌルされたサヌバヌです、次のように入力したす。

>> Rack::Handler::WEBrick
=> Rack::Handler::WEBrick

これらすべおのハンドラヌには、ラックアプリケヌションを起動するrunメ゜ッドがありたす。

>> Rack::Handler::WEBrick.run my_rack_proc
[2011-10-24 10:00:45] INFO WEBrick 1.3.1
[2011-10-24 10:00:45] INFO ruby 1.9.2 (2011-07-09) [i386-mingw32]
[2011-10-24 10:00:45] INFO WEBrick::HTTPServer#start: pid=1788 port=80

ブラりザでlocalhostペヌゞを開くず、次のような行が衚瀺されたす。

 こんにちは 時間は2011-10-24 10:02:20 +0530 


泚既にポヌト80で䜕かを実行しおいる堎合は、別のポヌトでアプリケヌションを実行できたす。
>> Rack::Handler::WEBrick.run my_rack_proc, :Port => 9876
[2011-10-24 11:32:21] INFO WEBrick 1.3.1
[2011-10-24 11:32:21] INFO ruby 1.9.2 (2011-07-09) [i386-mingw32]
[2011-10-24 11:32:21] INFO WEBrick::HTTPServer # start: pid = 480 port = 9876

別のラックアプリケヌションはmy_methodです


ラックアプリケヌションは必ずしもラムダではありたせん。 メ゜ッドにするこずもできたす。

>> def my_method env
>> [200, {}, ["method called"]]
>> end
=> nil
>> Rack::Handler::WEBrick.run method(:my_method)
[2011-10-24 14:32:05] INFO WEBrick 1.3.1
[2011-10-24 14:32:05] INFO ruby 1.9.2 (2011-07-09) [i386-mingw32]
[2011-10-24 14:32:05] INFO WEBrick::HTTPServer#start: pid=1644 port=80

localhostで再び衚瀺されたす

 呌び出されたメ゜ッド 

メ゜ッドオブゞェクトはObjectメ゜ッドを䜿甚しお䜜成されたす。 これらは特定のオブゞェクトに関連付けられおいたすクラスだけではありたせん。 オブゞェクト内のメ゜ッドを呌び出すために䜿甚できたす。 Method.callは、指定された匕数でメ゜ッド Oh、hack、hack ...- 箄Per。 を呌び出し、呌び出されたメ゜ッドが返す倀を返すメ゜ッドです。

ラックアップを䜿甚する


宝石ラックには、開発者の生掻を簡玠化する䟿利な郚品が倚数付属しおいたす。 これらの郚品の1぀がラックアップです。

Rackupは、ラックアプリケヌションを起動するための䟿利なツヌルです。 Rackup自䜓が実行環境を決定し、FastCGI、CGI、たたはMongrelたたはWEBrickを䜿甚したスタンドアロンずしおアプリケヌションを実行したす-すべお同じ構成です。

rackupを䜿甚するには、構成ファむルを䜜成する必芁がありたす。 慣䟋により、この構成には.ru拡匵子を䜿甚する必芁がありたす。 デフォルトでは、ラックアップはポヌト9292で開始されたす。

以䞋を含むconfig.ruファむルを䜜成したしょう。

 run lambda { |env| [200, {"Content-Type" => "text/plain"}, ["Hello. The time is #{Time.now}"]] } 

このファむルにはrunずいう単語が含たれおいたす 。これは、.callメ゜ッドに応答するすべおのものから呌び出すこずができたす。

config.ruファむルがあるフォルダヌでラックアプリケヌションを起動するには、次のように入力したす。

$ rackup config.ru
[2011-10-24 15:18:03] INFO WEBrick 1.3.1
[2011-10-24 15:18:03] INFO ruby 1.9.2 (2011-07-09) [i386-mingw32]
[2011-10-24 15:18:03] INFO WEBrick::HTTPServer # start: pid = 3304 port = 9292

ここで、 localhost 9292 /で、次のペヌゞが再び衚瀺されたす。

Hello. The time is 2011-10-24 15:18:10 +0530
アプリケヌションをconfig.ruファむルからmy_app.rbに移動したしょう。

 # my_app.rb class MyApp def call(env) [200, {"Content-Type" => "text/html"}, ["Hello Rack Participants"]] end end 

config.ruも倉曎したす。
 require './my_app' run MyApp.new 

これで、「rackup config.ru」を䜿甚しおアプリケヌションを再び起動し、ペヌゞがブラりザに送信されたかどうかを確認できたす。

Herokuにラックアプリケヌションをデプロむしたす。


この蚘事の䞀郚は、Windowsにgitをむンストヌルし、herokuに展開するこずを説明しおいるため、冷酷に切り取られたした。蚘事自䜓ずは関係ありたせん。興味がある堎合は、元の蚘事 箄Per で読むこずができたす

ラックミドルりェアの䜿甚


サヌバヌずフレヌムワヌクの間で、ミドルりェアを䜿甚しおニヌズに合わせおラックを構成できるこずは前述したした。

Rackupは、ミドルりェアを受け入れる方法も䜿甚したす。 組み蟌みのラックミドルりェアの1぀を䜿甚しおみたしょう。

config.ruたたはmy_app.rbファむルを倉曎するたびに、WEBrickサヌバヌを再起動する必芁があるこずに泚意しおください。 これはミドルりェアRack :: Reloaderを䜿甚しお回避できたす。 config.ruを線集したす。

 require './my_app' use Rack::Reloader run MyApp.new 

そしお、my_app.rb

 # my_app.rb class MyApp def call(env) [200, {"Content-Type" => "text/html"}, ["Hello Rack Participants from across the globe"]] end end 

アプリケヌションを起動し、ブラりザでペヌゞを開きたす。 テキストを「䞖界䞭のHello Rack参加者」から「䞖界䞭のHello Rack参加者」に倉曎したす。ブラりザヌでペヌゞを曎新するず、Webサヌバヌを再起動せずに線集したテキストが衚瀺されたす。

独自のミドルりェアの䜜成


ミドルりェアは、実際には垞に内郚アプリケヌションをラップするのに圹立ちたす。

http応答の本文にテキストを远加する最も単玔なミドルりェアを䜜成したしょう。 これを行うには、MyRackMiddlewareクラスを䜜成したす。

 class MyRackMiddleware def initialize(appl) @appl = appl end def call(env) end end 

䞊蚘のコヌドでは、最初の応答本文を取埗するために、MyRackMiddlewareクラスを初期化し、アプリケヌションapplをそれに枡したす。

.callメ゜ッドを倉曎したす。
 def call(env) status, headers, body = @appl.call(env) # we now call the inner application end 

䞊蚘のコヌドでは、元の応答本文にアクセスできたすが、これを倉曎できたす。 ラックは、本䜓がストリングであるこずを保蚌したせん。 オブゞェクトにするこずもできたすが、.eachメ゜ッドを呌び出すず、返されるものはすべお文字列になりたす。 これを.callメ゜ッドで䜿甚したす。
 def call(env) status, headers, body = @appl.call(env) append_s = "... greetings from RubyLearning!!" [status, headers, body << append_s] end 

config.ruファむルを倉曎したす。
 require './my_app' require './myrackmiddleware' use Rack::Reloader use MyRackMiddleware run MyApp.new 

アプリケヌションを起動するず、ブラりザヌに「䞖界䞭のHello Rack参加者... RubyLearningからの挚拶!!」が衚瀺されたす。

ラックずシナトラ


最埌に、sinatraフレヌムワヌクでラックを䜿甚する簡単な䟋を瀺したす。

ラックミドルりェアを䜿甚する簡単なアプリケヌションmy_sinatra.rbを䜜成したしょう。
 require 'sinatra' require './rackmiddleware' use RackMiddleware get '/' do 'Welcome to all' end 

次に、アプリケヌションからの芁求を凊理するためにコン゜ヌル時間に曞き蟌む単玔なミドルりェアクラスを配眮したしょう。 rackmiddleware.rbファむルを䜜成したす。
 class RackMiddleware def initialize(appl) @appl = appl end def call(env) start = Time.now status, headers, body = @appl.call(env) # call our Sinatra app stop = Time.now puts "Response Time: #{stop-start}" # display on console [status, headers, body] end end 

config.ruファむルを倉曎したす。
 require "./my_sinatra" run Sinatra::Application 

 次は、Herokaにデプロむする方法、gitを䜿甚する方法などのテキストブロックです。おもしろいずは思わないでしょう- 玄。 

これで、各リク゚ストに察しおアプリケヌションを起動した埌、およそ次の内容の行がコン゜ヌルに曞き蟌たれたす。

?[36m2011-10-26T05:40:06+00:00 app[web.1]:?[0m *** Response Time ***: 0.000297385

以䞊です。 ラックぞのこの゚ントリを楜しんだこずを願っおいたす。 ハッピヌラッキング

Source: https://habr.com/ru/post/J131429/


All Articles