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...