一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Ruby - Ruby on Rails中Rack中間件的基礎學習教程

Ruby on Rails中Rack中間件的基礎學習教程

2020-05-11 10:09SecondRocker Ruby

Rack是一個連接Ruby程序與服務器程序之間的中間件,甚至可以說Rails也是在Rack的基礎上建立起來的,這里我們就來為大家帶來Ruby on Rails中Rack中間件的基礎學習教程

rack是ruby服務器和rack應用程序之間的一個框架,rails,sinatra都是基于rack構建的,都屬于rack應用程序。

rack提供了一個標準的接口,用于與服務器進行交互。標準的rack程序是一個可以響應call的對象,可以是對象、Proc、lambda甚至是method,它接收env參數(環境對象),返回一個數組,數組包括:

  • 狀態(status),http響應狀態碼
  • 可以是hash,為http的header信息
  • 擁有each方法的對象,each返回字符串

rack通過中間件來進行擴展,即對原始的rack程序進行裝飾,在原有返回數組的基礎上進一步處理,并返回rack對象

簡單的rack程序

?
1
2
3
4
require 'rack'
 
app = lambda{|env|[200,{},["hello from rack"]]}
Rack::Handler::WEBrick.run app

使用中間件的rack程序:
require 'rack'

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Decorator
 def initialize(app)
  @app = app
 end
 def call(env)
  status, headers, body = @app.call(env)
  new_body = "from middleware input <br/>"
  body.each{|str| new_body << str}
  headers['Content-Length'] = new_body.bytesize.to_s
  [status, headers, [new_body]]
 end
end
 
app = lambda{|env|[200,{},["hello from rack"]]}
Rack::Handler::WEBrick.run Decorator.new(app)

上面使用中間件的方法在使用多個時容易混亂,rack有一個Builder類可以有效管理
使用如下
require 'rack'

?
1
2
3
4
5
6
7
8
require 'decorator'
 
app = Rack::Builder.new{
 use Rack::ContentLength
 use Decorator
 run lambda {|env| [200, {"Content-Type"=>"text/html"}, ["hello world"]]}
}.to_app
Rack::Handler::WEBrick.run app

使用Rack::Builder的map方法,可以創建有路由的rack程序
require 'rack'

?
1
2
3
4
5
6
7
8
9
10
app = Rack::Builder.new {
 map '/hello' do
run lambda {|env| [200, {"Content-Type" => "text/html"}, ["hello"]] } end
map '/world' do
run lambda {|env| [200, {"Content-Type" => "text/html"}, ["world"]] }
end
map '/' do
run lambda {|env| [200, {"Content-Type" => "text/html"}, ["all"]] } end
}.to_app
Rack::Handler::WEBrick.run app, :Port => 3000

由于rails的全棧性,rack中間件很多,在一些高并發但業務簡單的網站或api使用時
響應時間過長,在這種情況下可以考慮使用rack或者sinatra。

啟動一個rack程序有兩種方式:

1.直接使用ruby運行.rb文件,默認在8080啟動服務,無日志文件
2.使用rackup,默認在9292 啟動服務,有日志文件,rackup可使用 -o 指定ip, -p 指定端口號

?
1
2
3
4
require 'rack'
app = lambda{|env| [200,{},["hello world"]] }
Rack::Server.new.server.run app
ruby xxx.rb

Ruby on Rails中Rack中間件的基礎學習教程

?
1
2
3
#test.ru
run lambda{|env| [ 200,{},["rackup start"] ]}
rackup test.ru

Ruby on Rails中Rack中間件的基礎學習教程

rack會在啟動時默認加載一些中間件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def logging_middleware
    lambda { |server|
     server.server.name =~ /CGI/ || server.options[:quiet] ? nil : [Rack::CommonLogger, $stderr]
    }
   end
 
    m = Hash.new {|h,k| h[k] = []}
    m["deployment"] = [
     [Rack::ContentLength],
     [Rack::Chunked],
     logging_middleware,
     [Rack::TempfileReaper]
    ]
    m["development"] = [
     [Rack::ContentLength],
     [Rack::Chunked],
     logging_middleware,
     [Rack::ShowExceptions],
     [Rack::Lint],
     [Rack::TempfileReaper]
    ]
 
    m
   end

包括body長度錯誤提示訪問記錄等。

rack有一個Directory的中間件,可以為目錄文件生成一個web服務。
使用很簡單一句話:

?
1
2
3
#test.ru
run Rack::Directory.new "~/"
rackup test.ru

這樣就會把home目錄下的所有文件、文件夾在瀏覽器中顯示

Ruby on Rails中Rack中間件的基礎學習教程

rails應用中使用rake middleware即可顯示所有的middleware(中間件)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
** **rake middleware
use Rack::Sendfile
use ActionDispatch::Static
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x007feef1563b90>
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use WebConsole::Middleware
use ActionDispatch::DebugExceptions
use ActionDispatch::RemoteIp
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
run Fool::Application.routes

rails使用了rack定義的一些中間件,自定義了一些中間件,其中自定義的routes為rack程序,routes 把rails controller的action變為lambda并作為rack程序運行,在rails console里輸入

?
1
2
2.2.1 :001 > QuestionsController.action(:new)
 => #<Proc:0x007fbe482ee0b0@/Users/killman/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.1/lib/action_controller/metal.rb:237 (lambda)>

在config/application.rb可添加、刪除、修改中間件

?
1
2
3
config.middleware.use(new_middleware, args)#:把新中間件添加到列表末尾;
config.middleware.insert_before(existing_middleware,
 new_middleware, args)#:在 existing_middleware

 之前添加新中間件;

?
1
2
config.middleware.insert_after(existing_middleware,
 new_middleware, args)#:在 existing_middleware

 之后添加新中間件;

?
1
2
config.middleware.swap ActionDispatch::ShowExceptions, Lifo::ShowExceptions #替換中間件
config.middleware.delete "Rack::Lock"#刪除中間件

中間件的作用:

  • Rack::Sendfile :設置服務器上的 X-Sendfile 報頭。通過 config.action_dispatch.x_sendfile_header選項設置。
  • ActionDispatch::Static :用來服務靜態資源文件。如果選項 config.serve_static_assets為 false,則禁用這個中間件。
  • Rack::Lock :把 env["rack.multithread"]旗標設為 false,程序放入互斥鎖中。
  • ActiveSupport::Cache::Strategy::LocalCache::Middleware :在內存中保存緩存,非線程安全。
  • Rack::Runtime :設置 X-Runtime 報頭,即執行請求的時長,單位為秒。
  • Rack::MethodOverride :如果指定了 params[:_method]參數,會覆蓋所用的請求方法。這個中間件實現了 PUT 和 DELETE 方法。
  • ActionDispatch::RequestId :在響應中設置一個唯一的 X-Request-Id 報頭,并啟用 ActionDispatch::Request#uuid方法。
  • Rails::Rack::Logger :請求開始時提醒日志,請求完成后寫入日志。
  • ActionDispatch::ShowExceptions :補救程序拋出的所有異常,調用處理異常的程序,使用特定的格式顯示給用戶。
  • ActionDispatch::DebugExceptions :如果在本地開發,把異常寫入日志,并顯示一個調試頁面。
  • ActionDispatch::RemoteIp :檢查欺騙攻擊的 IP。
  • ActionDispatch::Reloader :提供“準備”和“清理”回調,協助開發環境中的代碼重新加載功能。
  • ActionDispatch::Callbacks :在處理請求之前調用“準備”回調。
  • ActiveRecord::Migration::CheckPending :檢查是否有待運行的遷移,如果有就拋出 ActiveRecord::PendingMigrationError異常。
  • ActiveRecord::ConnectionAdapters::ConnectionManagement :請求處理完成后,清理活躍的連接,除非在發起請求的環境中把 rack.test設為 true。
  • ActiveRecord::QueryCache :啟用 Active Record 查詢緩存。
  • ActionDispatch::Cookies :設置請求的 cookies。
  • ActionDispatch::Session::CookieStore :負責把會話存儲在 cookies 中。
  • ActionDispatch::Flash :設置 Flash 消息的鍵。只有設定了 config.action_controller.session_store選項時才可用。
  • ActionDispatch::ParamsParser :把請求中的參數出入 params。
  • ActionDispatch::Head :把 HEAD 請求轉換成 GET 請求,并處理。
  • Rack::ConditionalGet :添加對“條件 GET”的支持,如果頁面未修改,就不響應。
  • Rack::ETag :為所有字符串類型的主體添加 ETags 報頭。ETags 用來驗證緩存。

延伸 · 閱讀

精彩推薦
  • RubyRuby迭代器的7種技巧分享

    Ruby迭代器的7種技巧分享

    這篇文章主要介紹了Ruby迭代器的7種技巧分享,Ruby中的迭代器非常人性化,本文既是講解了7個技巧也是講解了7種迭代器,需要的朋友可以參考下 ...

    腳本之家4782020-04-20
  • RubyCentOS中配置Ruby on Rails環境

    CentOS中配置Ruby on Rails環境

    經過一個上午的折騰,終于把ROR環境在CentOS中搞定,繞了很多彎路,把文章寫下來總結一下 ...

    可樂加糖4762020-04-12
  • RubyRuby環境下安裝使用bundler來管理多版本的gem

    Ruby環境下安裝使用bundler來管理多版本的gem

    這篇文章主要介紹了Ruby環境下安裝使用bundler來管理多版本的gem的方法,舉了Ruby On Rails中的應用實例來進行演示,需要的朋友可以參考下 ...

    日拱一卒4332020-05-10
  • Ruby剖析 Ruby 訪問控制

    剖析 Ruby 訪問控制

    前面,我們說 Ruby 沒有函數,只有方法.而且實際上有不止一種方法.這一節我們介紹 訪問控制 (accesscontrols). 想想當我們在最高層而不是在一個類的定義里定義...

    ruby教程網3572020-04-08
  • RubyRuby設計模式編程中使用Builder建造者模式的實例

    Ruby設計模式編程中使用Builder建造者模式的實例

    這篇文章主要介紹了Ruby設計模式編程中使用Builder建造者模式的實例,建造者模式將一個復雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表...

    范孝鵬2192020-05-07
  • Ruby簡要說明Ruby中的迭代器

    簡要說明Ruby中的迭代器

    這篇文章主要介紹了Ruby中的迭代器,迭代器的概念在動態語言的編程中十分重要,文章中介紹了Ruby中的each迭代器和collect迭代器,需要的朋友可以參考下 ...

    goldensun2772020-04-25
  • RubyRuby簡潔學習筆記(一):字符串、數字、類和對象

    Ruby簡潔學習筆記(一):字符串、數字、類和對象

    這篇文章主要介紹了Ruby簡潔學習筆記(一):字符串、數字、類和對象,本文是學習筆記第一篇,需要的朋友可以參考下 ...

    腳本之家2472020-04-20
  • RubyRuby進行文件信息輸出實例代碼

    Ruby進行文件信息輸出實例代碼

    Ruby進行文件信息輸出實例代碼,數據是隨機的,所以每次的記錄都會不同。 ...

    ruby教程網2962020-04-10
主站蜘蛛池模板: 亚洲天天做夜夜做天天欢 | 国产91无毒不卡在线观看 | 人成午夜免费大片在线观看 | 4hu永久地域网名入口 | 十大免费b2b网站 | 女人把扒开给男人爽的 | chinese东北痞子gay | 91色视| 国产成人精品第一区二区 | 高清国产激情视频在线观看 | 双性肉文h | 欧美一级视频免费观看 | 99国产热 | 亚洲精品一线二线三线 | 99在线视频观看 | 日本嫩交| 亚洲六月丁香六月婷婷色伊人 | 国产良心大作白丝精厕 | 国产一区二区在线观看美女 | 草久久网| 国产福利一区二区三区四区 | 日韩毛片高清在线看 | 亚洲精品在线免费观看视频 | 乳 好大h| 久久亚洲成a人片 | 四虎影院永久在线 | 久久中文字幕乱码免费 | 超爽人人做人人爽 | 国语刺激对白勾搭视频在线观看 | 国产农村一级特黄α真人毛片 | 韩国伦理hd| 欧美坐爱| 2018天天弄| 国产视频播放 | 国产在线伊人 | 成人嗯啊视频在线观看 | 亚洲国产区男人本色在线观看欧美 | 欧美精品99久久久久久人 | 韩国www | 亚洲精品中文 | 操到翻白眼 |