Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ちょっとわかるrack
Search
Leonard Chin
May 24, 2012
Programming
10
1.3k
ちょっとわかるrack
初心者向けrackの簡単な紹介
・rackとは何か
・rackアプリの作り方
・rack middlewareの作り方・使い方
※2012/5/14の会社内LTで使用した資料
Leonard Chin
May 24, 2012
Tweet
Share
More Decks by Leonard Chin
See All by Leonard Chin
生鮮ECのタイムセールを 耐え抜いてきた話 / Handling high traffic sale days at Cookpad Mart
lchin
3
12k
Performance as a Product Feature
lchin
5
2.1k
Database Performance for Ruby on Rails Applications
lchin
7
1.3k
Database Performance for Rails Applications
lchin
5
730
How to Survive and thrive as an engineer in a foreign land
lchin
4
1.3k
#eachを使ったら負け
lchin
7
1.6k
Other Decks in Programming
See All in Programming
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
0
190
Patterns of Patterns
denyspoltorak
0
830
AgentCoreとHuman in the Loop
har1101
5
190
re:Invent 2025 トレンドからみる製品開発への AI Agent 活用
yoskoh
0
670
gunshi
kazupon
1
140
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
890
CSC307 Lecture 01
javiergs
PRO
0
670
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
810
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
140
Grafana:建立系統全知視角的捷徑
blueswen
0
290
The Art of Re-Architecture - Droidcon India 2025
siddroid
0
170
Claude Codeの「Compacting Conversation」を体感50%減! CLAUDE.md + 8 Skills で挑むコンテキスト管理術
kmurahama
1
770
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2k
Believing is Seeing
oripsolob
1
33
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.5k
Odyssey Design
rkendrick25
PRO
0
470
Building a Scalable Design System with Sketch
lauravandoore
463
34k
The browser strikes back
jonoalderson
0
320
How Software Deployment tools have changed in the past 20 years
geshan
0
31k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
69
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
390
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Designing for Performance
lara
610
70k
Transcript
ͪΐͬͱΘ͔Δ
Web Server App Server IUUQ DBMMSVCZ DBMMBQQ Your App
Web Server App Server IUUQ DBMMSVCZ DBMMBQQ Your App BQBDIFOHJOYFUD
QBTTFOHFSNPOHSFMUIJOFUD
Web Server App Server IUUQ DBMMSVCZ DBMMBQQ Your App BQBDIFOHJOYFUD
QBTTFOHFSNPOHSFMUIJOFUD ͜ͷ*'ɺͲ͏͢Δʁ
Web Server App Server IUUQ DBMMSVCZ DBMMBQQ Your App BQBDIFOHJOYFUD
QBTTFOHFSNPOHSFMUIJOFUD ڞ௨*'3BDL 3BDL"QQMJDBUJPO
call(env)
def call(env) ... end 3FRVFTUΛ͞ΕΔ 3FTQPOTFΛฦ͢ [status, headers, response_body]
ৄࡉ41&$Ͱ http://rack.rubyforge.org/doc/SPEC.html
4JOBUSBͷ߹
# Rack call interface. def call(env) dup.call!(env) end attr_accessor :env,
:request, :response, :params def call!(env) # :nodoc: @env = env @request = Request.new(env) @response = Response.new @params = indifferent_params(@request.params) template_cache.clear if settings.reload_templates force_encoding(@params) @response['Content-Type'] = nil invoke { dispatch! } invoke { error_block!(response.status) } unless @response['Content-Type'] if Array === body and body[0].respond_to? :content_type content_type body[0].content_type else content_type :html end end @response.finish end
SBDLVQ
rackup config.ru ΞϓϦͷೖΓޱΛఆٛ Rack::Builder.new { <config.ru> }.to_app ʹ͢
#config.ru require ‘rack’ require ‘myapp’ run MyApp.new 3BDL"QQMJDBUJPO JFJNQMFNFOUTcall(env)
# Minimum config.ru require ‘rack’ run lambda { |env| [200,
{ "Content-Type" => "text/plain" }, ["OK"] ] } TUBUVT IFBEFST CPEZ
3BDL.JEEMFXBSF
Web Server App Server IUUQ DBMMSVCZ Your App BQBDIFOHJOYFUD QBTTFOHFSNPOHSFMUIJOFUD
3BDL*' 3BDL"QQMJDBUJPO Middleware Middleware 3BDL*' 3BDL*' .JEEMFXBSFΛૠೖ ^
w $43' w 3FEJSFDUJPO w -PHHJOH w 4FTTJPO.BOBHFNFOU w "VUIFOUJDBUJPO
w &NCFE(PPHMF"OBMZUJDT FUD
class Middleware def initialize(app) @app = app end def call(env)
# do something response = @app.call(env) # do something end end ࣍ʹݺͿ"QQ.JEEMFXBSF 3FRVFTUΛ͍͡Δ 3FTQPOTFΛ͍͡Δ
&YBNQMFSBDL@DTSG
def call(env) unless env['rack.session'] raise SessionUnavailable.new('Rack::Csrf depends on session middleware')
end self.class.token(env) req = Rack::Request.new(env) untouchable = skip_checking(req) || !@http_methods.include?(req.request_method) || req.params[self.class.field] == env['rack.session'][self.class.key] || req.env[self.class.rackified_header] == env['rack.session'][self.class.key] if untouchable @app.call(env) else raise InvalidCsrfToken if @raisable [403, {'Content-Type' => 'text/html', 'Content-Length' => '0'}, []] end end $43'νΣοΫࣦഊͨ͠Βɺ ͙͢ʹ3FTQPOTFฦ͢ 3FRVFTUʹ$43'ରࡦUPLFOΛνΣοΫ ௨ͬͨΒɺͦͷ··࣍
6TJOH.JEEMFXBSF
#config.ru require ‘rack’ require ‘myapp’ class Middleware def initialize(app) @app
= app end def call(env) env["rack.some_header"] = "setting an example" @app.call(env) end end use Middleware run MyApp.new 3BDL෦Ͱ!VTFྻʹૠೖ 3BDL#VJMEFSʹCJOE͞ΕͯΔ