sinatra 是基于ruby语言实现的http路由框架,通过sinatra可以高效率实现web框架,要想了解sinatra的流程,可以参考
http://wangsheng2008love.blog.163.com/blog/static/7820168920133145425544/
http://www.sinatrarb.com/intro-zh.html
本文中用到了erb模板,其风格与php类似,就是在html中通过嵌入<? ... ?> 执行ruby语句、<?= ...?>执行ruby语句并给html中的变量赋值,比如:
<meta http-equiv="refresh" content="10"> <h2>ttt.c</h2> <% str = "" File.open(".ttt.c") do |file| while line = file.gets str += line str += "<br>" end file.close(); end %> <%= str %>这里实现的是读取文件内容,并定时10秒进行刷新
好了废话不多说了,下面开始介绍使用sinatra框架 + erb模板,开发登录页面login.rb的过程,lgoin.rb文件的内容如下:
require 'rubygems' #注意:如果你的Ruby版本低于1.9,需要在代码第一行添加:"require 'rubygems'" require 'sinatra' require 'sass' require 'digest/md5' use Rack::Session::Pool, :expire_after => 120 configure do enable :sessions set :username, 'frank' set :passwordmd5, '0efe415c937f6858550a6378f4f3f374' #'sinatra' end get '/' do if session[:admin] == true redirect to('start') else redirect to('login') end end get '/login' do erb :login end post '/login' do if params[:username] == settings.username && Digest::MD5.hexdigest(params[:password]) == settings.passwordmd5 session[:admin] = true redirect to('start') else erb :login end end get '/start' do halt(401,'Not Authorized') unless session[:admin] erb :start end get '/logout' do session.clear redirect to('/login') end其中,use Rack::Session::Pool, :expire_after => 120 表示,session的过期时间为120秒,即登陆了成功后,120秒内无操作,session将无效
然后:
configure do enable :sessions set :username, 'frank' set :passwordmd5, '0efe415c937f6858550a6378f4f3f374' end表示,启用session功能,并将用户名固定为frank,密码的MD5值
之后就是对http请求进行路由,其中get、post都是指http的请求类型。比如,
get '/' do if session[:admin] == true redirect to('start') else redirect to('login') end end表示sinatra收到针对根的get请求后,会读取session中保存的admin,如果为true,说明已经成功登录,就会将请求直接路由到start页面,否则将会路由到login页面。
get '/login' do erb :login end表示收到对login页面的请求后,将显示erb模板login的内容,即login.erb文件。通常模板文件都会保存在views目录下,login.erb的内容如下:
<form action="/login" method="post"> Name: <input type="text" name="username" /> Password: <input type="password" name="password" /> <input type="submit" value="Log in" /> </form>就是定义了一个username文本框、password密码框、一个提交按钮。按下这个按钮就会触发post操作
post '/login' do if params[:username] == settings.username && Digest::MD5.hexdigest(params[:password]) == settings.passwordmd5 session[:admin] = true redirect to('start') else erb :login end end这里针对login页面的post操作进行处理,判断用户名、密码的md5是否验证通过,如果验证通过则将session中的admin置为true,然后重定向页面到start,否则将重新显示登录页面。
get '/start' do halt(401,'Not Authorized') unless session[:admin] erb :start end浏览器请求start页面,如果没有登录成功,会触发401错误,并显示Not Authorized
执行ruby -o 0.0.0.0 -p 80 login.rb命令,在浏览器中输入服务器的ip,就可以开始登录页面了