Sinatra 運(yùn)行一個模塊化應(yīng)用

2023-12-20 15:44 更新

有兩種方式運(yùn)行一個模塊化應(yīng)用,使用 run! 來運(yùn)行:

# my_app.rb
require 'sinatra/base'

class MyApp < Sinatra::Base
  # ... app code here ...

  # start the server if ruby file executed directly
  run! if app_file == $0
end

運(yùn)行:

ruby my_app.rb

或者使用一個 config.ru,允許你使用任何 Rack 處理器:

# config.ru
require './my_app'
run MyApp

運(yùn)行:

rackup -p 4567

使用 config.ru 運(yùn)行傳統(tǒng)方式的應(yīng)用

編寫你的應(yīng)用:

# app.rb
require 'sinatra'

get '/' do
  'Hello world!'
end

加入相應(yīng)的 config.ru:

require './app'
run Sinatra::Application

什么時候用 config.ru?

以下情況你可能需要使用 config.ru:

  • 你要使用不同的 Rack 處理器部署 (Passenger, Unicorn, Heroku, …).
  • 你想使用一個或者多個 Sinatra::Base 的子類。
  • 你只想把 Sinatra 當(dāng)作中間件使用,而不是端點。

你并不需要切換到 config.ru 僅僅因為你切換到模塊化方式,你同樣不需要切換到模塊化方式,僅僅因為要運(yùn)行 config.ru. 把 Sinatra 當(dāng)成中間件來使用

不僅 Sinatra 有能力使用其他的 Rack 中間件,任何 Sinatra 應(yīng)用程序都可以反過來自身被當(dāng)作中間件,被加在任何 Rack 端點前面。這個端點可以是任何 Sinatra 應(yīng)用,或者任何基于 Rack 的應(yīng)用程序 (Rails/Ramaze/Camping/…)。

require 'sinatra/base'

class LoginScreen < Sinatra::Base
  enable :sessions

  get('/login') { haml :login }

  post('/login') do
    if params[:name] = 'admin' and params[:password] = 'admin'
      session['user_name'] = params[:name]
    else
      redirect '/login'
    end
  end
end

class MyApp < Sinatra::Base
  # 在前置過濾器前運(yùn)行中間件
  use LoginScreen

  before do
    unless session['user_name']
      halt "Access denied, please <a href='/login'>login</a>."
    end
  end

  get('/') { "Hello #{session['user_name']}." }
end


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號