讀書筆記 Rails 中的 Rack 中介軟體

2022-07-12 08:51:10 字數 2036 閱讀 6713

rack 起源於 python 的 wsgi 協議, 是乙個語言相關的 http 服務端介面 (cgi, fcgi, scgi 是語言無關的介面, wsgi, rack, servlet 則屬於語言相關的介面), 該協議下乙個簡單的應用形式如下

# config.ru

class helloworld

def call(env)

[200, , ['hello world!']]

endend

run helloworld.new

將該檔案存為 config.ru, 然後在該目錄下執行 rackup 即可啟動該應用, 詳細規範可以參考 

rails 3.0, sinatra 都使用了 rack 作為自己的底層, 也就是說這兩個 web 框架可以共用 rack 中介軟體

rack 的協議本身很簡單, 需要通過中介軟體來支援常見的 http 功能,比如 cookie, session, flash, log, cache, ...

module rack

class runtime

@header_name = "x-runtime"

enddef call(env)

start_time = time.now

request_time = time.now - start_time

if !headers.has_key?(@header_name)

headers[@header_name] = "%0.6f" % request_time

end[status, headers, body]

endend

end中介軟體的使用也很方便, 只需加一句 "use rack::runtime" 即可, 如下所示

# config.ru

class helloworld

def call(env)

[200, , ['hello world!']]

endend

use rack::runtime

run helloworld.new

$ rake middleware 

(in /path/to/project)

use actiondispatch::static

use rack::lock

use rack::runtime

use rails::rack::logger

use actiondispatch::showexceptions

use actiondispatch::remoteip

use rack::sendfile

use actiondispatch::callbacks

use actiondispatch::cookies

use actiondispatch::session::cookiestore

use actiondispatch::flash

use actiondispatch::paramsparser

use rack::methodoverride

use actiondispatch::head

use actiondispatch::beststandardssupport

use openidauthentication

def default_middleware_stack

actiondispatch::middlewarestack.new.tap do |x|

x.use rack::runtime

endend

endend

再執行 rake middleware, 可以看到大部分 middleware 都不見了

比如 vendor/plugins/open_id_authentication/init.rb 中間就有一句:

config.middleware.use openidauthentication

這句話就把 openidauthentication 這個中介軟體放到了 middlewarestack 的棧頂

python中的異常(讀書筆記)

try 語句塊 可能產生異常的語句塊 except 異常名1 要處理的異常 語句塊 異常處理語句 except 異常名2 要處理的異常 語句塊 異常處理語句.else 語句塊 未觸發異常,則執行該語句塊 finally 語句塊 始終執行該語句塊,一般為了達到釋放資源的目的異常名 描述attribut...

岩中花樹 讀書筆記

面試 你懂什麼是分布式系統嗎?redis分布式鎖都不會?乙個孩子這樣問他的父親,什麼是歷史?父親告訴他,我們生活在這個星球上所有發生過的人和事,就是歷史,比如說,乙隻小鳥一天裡做多少只蟲子,練習飛翔飛到多遠,這就是這只小鳥一天的歷史。以想象取勝,歷史以事實資證,偉大的 中交織著歷史形象,而歷史又不妨...

mysql運維 讀書筆記 Mysql 讀書筆記

mysql儲存時間有兩種型別 datetime和timestamp。分別說一下兩者的區別。datetime,以8位元組儲存時間,理論上可以從0000年儲存到9999年。並且沒有時區的概念,它儲存的就是乙個時間點的概念。timestamp和datetime最主要的不同就是,它是以4個位元組儲存,由19...