Rack 中间件中的“env”变量是啥?

Posted

技术标签:

【中文标题】Rack 中间件中的“env”变量是啥?【英文标题】:What is the "env" variable in Rack middleware?Rack 中间件中的“env”变量是什么? 【发布时间】:2013-06-28 02:38:44 【问题描述】:

我知道 Rack 中间件过滤器是一个带有初始化和调用方法的 Ruby 类。我知道调用方法需要一个“env”参数。像这样的:

class MyFilter
  def initialize(app)
  end

  def call(env)
  end
end

我的问题是:发送给“call”的“env”参数到底是什么?这是否与 Rails ENV 环境相同(即开发、测试、生产)。

谢谢!

【问题讨论】:

【参考方案1】:

我建议你可以尝试通过编写一个简单的程序来打印'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

【讨论】:

不错!呈现实际 html 的轻微更新:Rack::Handler::WEBrick.run lambda |env| [200, 'Content-Type' =&gt; 'text/html',[pp(env)]] , :Port=&gt;5000 @JanKlimo,这是个好主意。实际上,我进行了一些修改,以便在从浏览器查看时输出正确的 HTML,并在 curl 完成时输出纯文本。 gist.github.com/akostadinov/02361c02cca88ecfdde81ecfc914e89f【参考方案2】:

env 变量是一个哈希,其中包含很多有用的信息,包括请求头和请求体,以及上游中间件可能添加的运行时环境数据。

【讨论】:

【参考方案3】:

env 只是一个哈希值。机架本身和各种中间件为其添加价值。

要了解哈希中的各种键,请查看Rack Specification。

这是一个示例环境哈希:


  "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 哈希中的值。

【讨论】:

【参考方案4】:

查看 source code 取决于您拥有的 Web 服务器,您可以在 env 哈希中获得不同的值。我建议使用documentation 中的内容。

基本上,env 是特定于 Web 服务器的请求对象的哈希版本。 Rack 做了一些工作来提供一个规范化的环境,这样中间件就可以在 Web 服务器之间保持一致。

【讨论】:

以上是关于Rack 中间件中的“env”变量是啥?的主要内容,如果未能解决你的问题,请参考以下文章

您将 Rack 中间件文件和要求放在哪里?

laravel / lumen 访问中间件中的 .env 值

配置文件中间件:config-lite

在 Ruby on Rails 的上下文中引用时,啥是中间件?

Express JS 中的中间件是啥

SAS中的宏变量开头和结尾分别是啥命令?