web-dev-qa-db-ja.com

Rackミドルウェアの「env」変数とは何ですか?

RackミドルウェアフィルターがRuby初期化と呼び出しメソッドを持つクラスであることを知っています。呼び出しメソッドが "env"引数を取ることを知っています。このようなもの:

class MyFilter
  def initialize(app)
  end

  def call(env)
  end
end

私の質問は、「呼び出し」に送信される「env」引数は正確には何ですか?これはRails ENV環境(つまり、開発、テスト、本番))と同じですか?.

ありがとう!

22
User314159

envは単なるハッシュです。ラック自体とさまざまなミドルウェアが価値を付加します。

ハッシュに含まれるさまざまなキーを理解するには、 ラック仕様 を確認してください。

そしてここにサンプルのenvハッシュがあります:

{
  "GATEWAY_INTERFACE" => "CGI/1.1",
  "PATH_INFO" => "/index.html",
  "QUERY_STRING" => "",
  "REMOTE_ADDR" => "::1",
  "REMOTE_Host" => "localhost",
  "REQUEST_METHOD" => "GET",
  "REQUEST_URI" => "http://localhost:3000/index.html",
  "SCRIPT_NAME" => "",
  "SERVER_NAME" => "localhost",
  "SERVER_PORT" => "3000",
  "SERVER_PROTOCOL" => "HTTP/1.1",
  "SERVER_SOFTWARE" => "WEBrick/1.3.1 (Ruby/2.0.0/2013-11-22)",
  "HTTP_Host" => "localhost:3000",
  "HTTP_USER_AGENT" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:26.0) Gecko/20100101 Firefox/26.0",
  "HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
  "HTTP_ACCEPT_LANGUAGE" => "zh-tw,zh;q=0.8,en-us;q=0.5,en;q=0.3",
  "HTTP_ACCEPT_ENCODING" => "gzip, deflate",
  "HTTP_COOKIE" => "jsonrpc.session=3iqp3ydRwFyqjcfO0GT2bzUh.bacc2786c7a81df0d0e950bec8fa1a9b1ba0bb61",
  "HTTP_CONNECTION" => "keep-alive",
  "HTTP_CACHE_CONTROL" => "max-age=0",
  "rack.version" => [1, 2],
  "rack.input" => #<StringIO:0x007fa1bce039f8>,
  "rack.errors" => #<IO:<STDERR>>,
  "rack.multithread" => true,
  "rack.multiprocess" => false,
  "rack.run_once" => false,
  "rack.url_scheme" => "http",
  "HTTP_VERSION" => "HTTP/1.1",
  "REQUEST_PATH" => "/index.html"
}

そして、使いやすくするために、チェックアウト Rack :: Request を使用すると、envハッシュ内の値にアクセスしやすくなります。

40
lulalala

簡単なプログラミングを書いて 'env'変数を出力してみることをお勧めします。

require "rubygems"
require "rack" 
def pp(hash)
  hash.map {|key,value| "#{key} => #{value}"}.sort.join("<br/>") 
end
Rack::Handler::WEBrick.run lambda {|env| [200,{},[pp(env)]]} , :Port=>3000

リンクlocalhost:3000を入力します

9
Joy Hu

env変数はハッシュであり、リクエストヘッダーや本文などの多くの有用な情報と、アップストリームミドルウェアによって追加された可能性のあるランタイム環境データが含まれています。

5
rossta

ソースコード を確認すると、使用しているWebサーバーに応じて、envハッシュで異なる値を取得できます。 documentation の内容を使用してonlyをお勧めします。

基本的に、envはWebサーバーに固有のリクエストオブジェクトのハッシュバージョンです。 Rackは、ミドルウェアがWebサーバー間で一貫して動作できるように、正規化された環境を提供するためにいくつかの作業を行います。

0
Garry Polley