sinatra 基本用法

sinatra 不同於rails,是一個輕量級的ruby 框架,非常輕巧靈活。


基本用法如官網所述:

#!/usr/bin/env ruby
require 'sinatra'

get '/frank-says' do
  'Put this in your pipe & smoke it!'
end


默認會監聽在127.0.0.1:4567 ,可以稍加配置,如下:

#!/usr/bin/env ruby
require 'sinatra'

configure do
  set :bind, '0.0.0.0'
  set :port, '1234'
end

get '/frank-says' do
  'Put this in your pipe & smoke it!'
end


處理404 和 50x

#!/usr/bin/env ruby
require 'sinatra'

configure do
  set :bind, '0.0.0.0'
  set :port, '1234'
end

get '/frank-says' do
  'Put this in your pipe & smoke it!'
end

not_found do
  status 404
  "page not found"
end

error do
  'Sorry there was a error - ' + env['sinatra.error'].messageend
end



變量分爲自定義變量和內置變量,使用變量的辦法如下

#!/usr/bin/env ruby
require 'sinatra'

configure do
  set :bind, '0.0.0.0'
  set :port, '1234'
end

get '/frank' do
  name = "Frank"
  "hello #{name}"
end
  
get '/frank-says' do
  "your ip address is #{request.ip}"
end



其他一些有用的內置變量如下:

  request.body              # 被客戶端設定的請求體(見下)
  request.scheme            # "http"
  request.script_name       # "/example"
  request.path_info         # "/foo"
  request.port              # 80
  request.request_method    # "GET"
  request.query_string      # ""
  request.content_length    # request.body的長度
  request.media_type        # request.body的媒體類型
  request.host              # "example.com"
  request.get?              # true (其他動詞也具有類似方法)
  request.form_data?        # false
  request["SOME_HEADER"]    # SOME_HEADER header的值
  request.referrer          # 客戶端的referrer 或者 '/'
  request.user_agent        # user agent (被 :agent 條件使用)
  request.cookies           # 瀏覽器 cookies 哈希
  request.xhr?              # 這是否是ajax請求?
  request.url               # "http://example.com/example/foo"
  request.path              # "/example/foo"
  request.ip                # 客戶端IP地址
  request.secure?           # false(如果是ssl則爲true)
  request.forwarded?        # true (如果是運行在反向代理之後)
  request.env               # Rack中使用的未處理的env哈希


爲了避免root運行的安全問題,可以切換一下身份(apache,uid 48)

#!/usr/bin/env ruby
require 'sinatra'

Process::UID.change_privilege(48) if Process.uid == 0

configure do
  set :bind, '0.0.0.0'
  set :port, '1234'
end

get '/frank-says' do
  "your ip address is #{request.ip}"
end


採用ruby xxx.rb 的方式啓動sinatra程序,缺點是必須在前臺運行。

如果需要在後臺運行,可以採用supervisor,創建配置文件/etc/supervisor/conf.d/sinatra.conf,內容如下,僅供參考:

[program:sinatra]
command=/usr/bin/ruby sinatra.rb
process_name=%(program_name)s
numprocs=1
directory=/data/ruby
umask=022
priority=999
autostart=true
user=apache
redirect_stderr=true
stdout_logfile=/var/log/sinatra/access.log
stderr_logfile=/var/log/sinatra/error.log


附 

CentOS7 安裝ruby + sinatra 環境

yum install ruby ruby-devel rubygems rubygem-rack 
gem install sinatra thin

ubuntu 16.04 安裝ruby + sinatra 環境

apt-get install ruby-sinatra ruby-sinatra-contrib thin


ps:官方推薦安裝thin,因爲它比默認的webrick性能更好,sinatra默認優先使用thin


update 2017-03-20

jruby效率高於ruby,如果使用jruby,由於thin是c擴展,jruby不支持,可以考慮在jruby中使用puma

,代碼如下:

#!/usr/bin/env ruby

require 'sinatra'
require 'puma'

#switch to apache user if run as root
Process::UID.change_privilege(48) if Process.uid == 0

configure do
  set :bind, '0.0.0.0'
  set :port, '4566'
  set :logging, 'log/sinatra.log'
  set :server, :puma
end

get '/' do
  "your ip address is #{request.ip}"
end





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章