sinatra 基本用法
admin
2023-02-15 11:00:10
0

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





相关内容

热门资讯

电风扇通电不转,但是有电 原因可能是因为电风扇缺油了,可以通过给风扇注油试试,具体的注油方式是能将电机拆下来,然后再对主轴和前...
美的波轮洗衣机通电不转怎么回事 可能是洗衣机顶盖的安全开关损坏,安全开关与可以控制洗衣机的程序,所以需要更换安全开关;可能是异物卡住...
冰箱通电不启动是怎么回事? 可能是电路故障。电源线开路,电源线插头与插座接触不良,启动继电器、过载保护器接线端子脱落或接触不良,...
为什么我家里的燃气热水器通电不... 1、可能是水管内没有水流通过,热水器不工作。2、可能是电池电量低,无法推动点火器。3、可能是水压低造...
冰箱通电后压缩机不启动,但压缩... 1、非常有可能是因为冰箱的压缩机内高压输出缓冲管出现了断裂,造成高压管不排气低压管不吸气的这种状况,...
身高缩了,房子小了,胆子也怯了... 据日经中文网7月24日报道,日本经济长期停滞催生了“不断缩小”的社会倾向,近年来日本人的平均身高持续...
广东省内铁路即将全线停运 作者 | 第一财经 南英今年第12号台风“红霞”已于7月24日凌晨生成,预计25日夜间至26日早晨在...
中美频繁高层互动,菲律宾好自为... 7月24日,菲律宾组织7艘公务船、3艘海警舰、1艘运鱼船,并唆使大量渔船位中国黄岩岛管辖海域非法聚集...
被要求补税2250万欧元的法国... ·贝尔纳·阿尔诺。(LVMH官网)他的“帝国”离不开这个国家的形象加持,而这个国家,也早已吃定了这一...
通派龙湖御潮云上:当极核地段遇... 在2026年的郑州楼市版图中,如果要寻找一个能够同时承载“主城确定性”与“产品革新力”的坐标,通派龙...