tuto – sinatra – mettre un compteur pour limiter l’accès à un formulaire

Je reviens avec un nouveau tuto, mais pour sinatra cette fois. Pour planter le décor, Sinatra est un framework light pour développer des applications en ruby. Je suis en train de créer une application de speech to text, c’est à dire qu’à partir d’un audio, l’application va donner la transcription en lettre et en chiffre (application qui ne fonctionnera que pour l’alphabet anglais).

Bref, une application gratuite c’est bien jolie, mais il faut quand même faire attention aux leechers qui viendront squatter votre appli à l’aide de leurs outils d’automatisation (niark niark niark se dit le leecher).

Donc, pour pouvoir proposer ce service tout en limitant l’accès à un certain nombre de requêtes quotidiennes, il faut trouver une solution.. Tadam ! Cela se fera à travers l’utilisation d’un cookie pour votre visiteur.

 

Les librairies nécessaires

require 'sinatra'
require 'sinatra/reloader' if development?
require 'sinatra/flash'
require 'rack/protection'

 

Cette première partie concerne la configuration de votre app (à paramétrer à votre choix concernant le passphrase ainsi que la durée de vie du cookie)

  configure do
    use Rack::Session::Pool, {
      :cookie_only => false, # adds request params as source for session id
      :secret => '000mysecretsaltedpassphraseforencoding000',
      :expire_after => 86400, # 1 jour, en seconde
    }
  end

 

La méthode du formulaire est form et la méthode alternative qui informera le visiteur qu’il a dépassé le maximum quotidien est limit_form. L’url http://localhost:4567/form vous amènera à votre formulaire, et suite à 5 exécutions du formulaire (pour 1 journée dans mon cas, en fonction du paramétrage de la config dans le votre), vous serez redirigé automatiquement sur la page alternative.

get '/limit_form' do
    erb :limit_form
end

get '/form' do 
  session[:count] = session[:count].to_i + 1
  if 
    session[:count] <= 5
  then
    erb :form  
  else
    flash[:alert] = session[:count]
    redirect '/limit_form'
  end
end

 

J’espère que ca vous sera utile !