sinatra 1.3.0.e → 1.3.0.f
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sinatra might be problematic. Click here for more details.
- data/.travis.yml +16 -0
- data/CHANGES +77 -18
- data/Gemfile +43 -26
- data/README.de.rdoc +264 -88
- data/README.es.rdoc +241 -80
- data/README.fr.rdoc +206 -81
- data/README.hu.rdoc +2 -2
- data/README.jp.rdoc +2 -2
- data/README.pt-br.rdoc +2 -2
- data/README.pt-pt.rdoc +2 -2
- data/README.rdoc +169 -23
- data/README.ru.rdoc +373 -433
- data/README.zh.rdoc +5 -5
- data/Rakefile +8 -2
- data/lib/sinatra/base.rb +191 -46
- data/lib/sinatra/main.rb +1 -1
- data/lib/sinatra/showexceptions.rb +2 -2
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +7 -5
- data/test/contest.rb +62 -28
- data/test/filter_test.rb +2 -2
- data/test/helpers_test.rb +185 -12
- data/test/mapped_error_test.rb +25 -6
- data/test/nokogiri_test.rb +5 -6
- data/test/response_test.rb +10 -1
- data/test/result_test.rb +2 -2
- data/test/routing_test.rb +13 -0
- data/test/server_test.rb +3 -2
- data/test/settings_test.rb +98 -11
- data/test/slim_test.rb +15 -25
- data/test/static_test.rb +3 -3
- data/test/streaming_test.rb +100 -0
- metadata +82 -35
data/README.fr.rdoc
CHANGED
@@ -1,12 +1,13 @@
|
|
1
|
-
= Sinatra
|
1
|
+
= Sinatra
|
2
2
|
<i>Attention : Ce document correspond à la traduction de la version anglaise et
|
3
3
|
il n'est peut être plus à jour.</i>
|
4
4
|
|
5
|
-
Sinatra est un DSL pour créer rapidement des applications web en
|
6
|
-
|
5
|
+
Sinatra est un DSL pour créer rapidement et facilement des applications web en
|
6
|
+
Ruby :
|
7
7
|
|
8
8
|
# mon_application.rb
|
9
9
|
require 'sinatra'
|
10
|
+
|
10
11
|
get '/' do
|
11
12
|
'Bonjour le monde !'
|
12
13
|
end
|
@@ -18,14 +19,13 @@ Installez la gem et lancez avec :
|
|
18
19
|
|
19
20
|
Le résultat est visible sur : http://localhost:4567
|
20
21
|
|
21
|
-
Il est
|
22
|
-
|
22
|
+
Il est recommandé d'exécuter également <tt>gem install thin</tt>, pour que
|
23
|
+
Sinatra utilise le server Thin quand il est disponible.
|
23
24
|
|
24
25
|
== Routes
|
25
26
|
|
26
27
|
Dans Sinatra, une route est une méthode HTTP couplée à un masque (pattern)
|
27
|
-
URL.
|
28
|
-
Chaque route est associée à un bloc :
|
28
|
+
URL. Chaque route est associée à un bloc :
|
29
29
|
|
30
30
|
get '/' do
|
31
31
|
.. montrer quelque chose ..
|
@@ -51,8 +51,8 @@ Chaque route est associée à un bloc :
|
|
51
51
|
.. apaiser quelquechose ..
|
52
52
|
end
|
53
53
|
|
54
|
-
Les routes sont
|
55
|
-
route qui correspond à la requête est
|
54
|
+
Les routes sont évaluées dans l'ordre où elles ont été définies. La première
|
55
|
+
route qui correspond à la requête est appelée.
|
56
56
|
|
57
57
|
Les masques peuvent inclure des paramètres nommés, accessibles par
|
58
58
|
l'intermédiaire du hash <tt>params</tt> :
|
@@ -63,38 +63,50 @@ l'intermédiaire du hash <tt>params</tt> :
|
|
63
63
|
"Bonjour #{params[:nom]} !"
|
64
64
|
end
|
65
65
|
|
66
|
-
Vous pouvez aussi
|
67
|
-
ceci :
|
66
|
+
Vous pouvez aussi accéder aux paramètres nommés directement grâce aux
|
67
|
+
paramètres du bloc comme ceci :
|
68
68
|
|
69
69
|
get '/bonjour/:nom' do |n|
|
70
70
|
"Bonjour #{n} !"
|
71
71
|
end
|
72
72
|
|
73
73
|
Une route peut contenir un splat (caractère joker), accessible par
|
74
|
-
l'intermédiaire
|
74
|
+
l'intermédiaire du tableau <tt>params[:splat]</tt> :
|
75
75
|
|
76
76
|
get '/dire/*/a/*' do
|
77
|
-
#
|
77
|
+
# répond à /dire/bonjour/a/monde
|
78
78
|
params[:splat] # => ["bonjour", "monde"]
|
79
79
|
end
|
80
80
|
|
81
81
|
get '/telecharger/*.*' do
|
82
|
-
#
|
82
|
+
# répond à /telecharger/chemin/vers/fichier.xml
|
83
83
|
params[:splat] # => ["chemin/vers/fichier", "xml"]
|
84
84
|
end
|
85
85
|
|
86
|
-
|
86
|
+
Ou par l'intermédiaire des paramètres du bloc :
|
87
|
+
|
88
|
+
get '/telecharger/*.*' do |chemin, ext|
|
89
|
+
[chemin, ext] # => ["path/to/file", "xml"]
|
90
|
+
end
|
91
|
+
|
92
|
+
Une route peut aussi être définie par une Expression Régulière :
|
87
93
|
|
88
94
|
get %r{/bonjour/([\w]+)} do
|
89
95
|
"Bonjour, #{params[:captures].first} !"
|
90
96
|
end
|
91
97
|
|
92
|
-
Là
|
98
|
+
Là encore on peut utiliser les paramètres de bloc :
|
93
99
|
|
94
100
|
get %r{/bonjour/([\w]+)} do |c|
|
95
101
|
"Bonjour, #{c} !"
|
96
102
|
end
|
97
103
|
|
104
|
+
Les routes peuvent aussi comporter des paramètres optionnels :
|
105
|
+
|
106
|
+
get '/posts.?:format?' do
|
107
|
+
# répond à "GET /posts" et aussi à "GET /posts.json", "GET /posts.xml" etc...
|
108
|
+
end
|
109
|
+
|
98
110
|
=== Conditions
|
99
111
|
|
100
112
|
Les routes peuvent définir toutes sortes de conditions, comme par exemple le
|
@@ -134,26 +146,45 @@ Vous pouvez facilement définir vos propres conditions :
|
|
134
146
|
"Désolé, vous avez perdu."
|
135
147
|
end
|
136
148
|
|
149
|
+
Utilisez un splat (caractère joker) dans le cas d'une condition qui prend
|
150
|
+
plusieurs valeurs :
|
151
|
+
|
152
|
+
set(:auth) do |*roles| # <- ici on utilise un splat
|
153
|
+
condition do
|
154
|
+
unless logged_in? && roles.any? {|role| current_user.in_role? role }
|
155
|
+
redirect "/login/", 303
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
get "/mon/compte/", :auth => [:user, :admin] do
|
161
|
+
"Informations sur votre compte"
|
162
|
+
end
|
163
|
+
|
164
|
+
get "/reserve/aux/admins/", :auth => :admin do
|
165
|
+
"Seuls les administrateurs sont acceptés ici !"
|
166
|
+
end
|
167
|
+
|
137
168
|
=== Valeurs de retour
|
138
169
|
|
139
|
-
La valeur
|
140
|
-
réponse qui sera transmise au client HTTP ou du moins au prochain middleware
|
141
|
-
dans la pile Rack. Le plus
|
170
|
+
La valeur renvoyée par le bloc correspondant à une route constitue le corps de
|
171
|
+
la réponse qui sera transmise au client HTTP ou du moins au prochain middleware
|
172
|
+
dans la pile Rack. Le plus souvent, il s'agit d'une chaîne de caractères,
|
142
173
|
comme dans les exemples précédents. Cependant, d'autres valeurs sont
|
143
174
|
acceptées.
|
144
175
|
|
145
|
-
Vous pouvez renvoyer n'importe quel objet
|
146
|
-
corps de réponse Rack ou un code
|
176
|
+
Vous pouvez renvoyer n'importe quel objet qu'il s'agisse d'une réponse Rack
|
177
|
+
valide, d'un corps de réponse Rack ou d'un code statut HTTP :
|
147
178
|
|
148
|
-
* Un tableau de 3 éléments : <tt>[code
|
149
|
-
de réponse (répondant à #each)]</tt>
|
150
|
-
* Un tableau de 2 élements : <tt>[code
|
179
|
+
* Un tableau de 3 éléments : <tt>[code statut (Fixnum), entêtes (Hash), corps
|
180
|
+
de la réponse (répondant à #each)]</tt>
|
181
|
+
* Un tableau de 2 élements : <tt>[code statut (Fixnum), corps de la réponse
|
151
182
|
(répondant à #each)]</tt>
|
152
183
|
* Un objet qui répond à <tt>#each</tt> et qui ne transmet que des chaînes de
|
153
184
|
caractères au bloc fourni
|
154
|
-
* Un Fixnum représentant le code
|
185
|
+
* Un Fixnum représentant le code statut
|
155
186
|
|
156
|
-
|
187
|
+
Avec cela, on peut facilement implémenter un streaming par exemple :
|
157
188
|
|
158
189
|
class Stream
|
159
190
|
def each
|
@@ -163,11 +194,15 @@ Ainsi, on peut facilement implémenter un streaming par exemple :
|
|
163
194
|
|
164
195
|
get('/') { Stream.new }
|
165
196
|
|
197
|
+
Vous pouvez aussi utiliser le helper +stream+ (présenté un peu plus loin) pour
|
198
|
+
éviter la surcharge et intégrer le traitement relatif au streaming dans le bloc
|
199
|
+
de code de la route.
|
200
|
+
|
166
201
|
=== Masques de route spécifiques
|
167
202
|
|
168
|
-
Comme
|
169
|
-
masques
|
170
|
-
pour définir les routes.
|
203
|
+
Comme cela a été vu auparavant, Sinatra offre la possibilité d'utiliser des
|
204
|
+
masques sous forme de chaines de caractères ou des expressions régulières
|
205
|
+
pour définir les routes. Mais il est possible de faire bien plus. Vous pouvez
|
171
206
|
facilement définir vos propres masques :
|
172
207
|
|
173
208
|
class MasqueToutSauf
|
@@ -191,7 +226,7 @@ facilement définir vos propres masques :
|
|
191
226
|
# ...
|
192
227
|
end
|
193
228
|
|
194
|
-
Notez que l'exemple ci-dessus est bien trop compliqué et le même résultat
|
229
|
+
Notez que l'exemple ci-dessus est bien trop compliqué et que le même résultat
|
195
230
|
peut être obtenu avec :
|
196
231
|
|
197
232
|
get // do
|
@@ -207,45 +242,49 @@ Ou bien en utilisant la forme négative :
|
|
207
242
|
|
208
243
|
== Fichiers statiques
|
209
244
|
|
210
|
-
|
211
|
-
|
212
|
-
<tt>:
|
245
|
+
Les fichiers du dossier <tt>./public</tt> sont servis de façon statique. Vous
|
246
|
+
avez la possibilité d'utiliser un autre répertoire en définissant le paramètre
|
247
|
+
<tt>:public_folder</tt> :
|
213
248
|
|
214
|
-
set :
|
249
|
+
set :public_folder, File.dirname(__FILE__) + '/statique'
|
215
250
|
|
216
|
-
Notez que le nom du dossier public n'
|
217
|
-
|
251
|
+
Notez que le nom du dossier public n'apparait pas dans l'URL. Le fichier
|
252
|
+
<tt>./public/css/style.css</tt> sera appelé via l'URL :
|
253
|
+
<tt>http://exemple.com/css/style.css</tt>.
|
254
|
+
|
255
|
+
Utilisez le paramètre <tt>:static_cache_control</tt> pour ajouter l'information
|
256
|
+
d'en-tête <tt>Cache-Control</tt> (voir plus loin).
|
218
257
|
|
219
258
|
== Vues / Templates
|
220
259
|
|
221
|
-
|
222
|
-
|
260
|
+
Chaqie langage de template est disponible via sa propre méthode de rendu,
|
261
|
+
lesquelles renvoient tout simplement une chaîne de caractères.
|
223
262
|
|
224
263
|
get '/' do
|
225
264
|
erb :index
|
226
265
|
end
|
227
266
|
|
228
|
-
Ceci effectue le rendu de <tt>views/index.erb</tt>.
|
267
|
+
Ceci effectue le rendu de la vue <tt>views/index.erb</tt>.
|
229
268
|
|
230
|
-
Plutôt que le nom d'un template, vous pouvez directement passer
|
231
|
-
template :
|
269
|
+
Plutôt que d'utiliser le nom d'un template, vous pouvez directement passer
|
270
|
+
le contenu du template :
|
232
271
|
|
233
272
|
get '/' do
|
234
273
|
code = "<%= Time.now %>"
|
235
274
|
erb code
|
236
275
|
end
|
237
276
|
|
238
|
-
Les templates
|
277
|
+
Les méthodes de templates acceptent un second paramètre, un hash d'options :
|
239
278
|
|
240
279
|
get '/' do
|
241
280
|
erb :index, :layout => :post
|
242
281
|
end
|
243
282
|
|
244
|
-
|
245
|
-
<tt>views/post.erb</tt> (
|
246
|
-
|
283
|
+
Ceci effectuera le rendu de la vue <tt>views/index.erb</tt> en l'intégrant
|
284
|
+
au +layout+ <tt>views/post.erb</tt> (les vues Erb sont intégrées par défaut
|
285
|
+
au +layout+ <tt>views/layout.erb</tt> quand ce fichier existe).
|
247
286
|
|
248
|
-
Toute option que Sinatra ne
|
287
|
+
Toute option que Sinatra ne comprend pas sera passée au moteur de rendu :
|
249
288
|
|
250
289
|
get '/' do
|
251
290
|
haml :index, :format => :html5
|
@@ -280,8 +319,8 @@ Options disponibles :
|
|
280
319
|
|
281
320
|
[layout]
|
282
321
|
S'il faut ou non utiliser un +layout+ (+true+ or +false+). Indique le
|
283
|
-
template à utiliser lorsque c'est un
|
284
|
-
:layout => request.xhr?</tt>.
|
322
|
+
template à utiliser lorsque c'est un symbole. Exemple : <tt>erb :index,
|
323
|
+
:layout => !request.xhr?</tt>.
|
285
324
|
|
286
325
|
[content_type]
|
287
326
|
Content-Type que le template produit, dépend par défaut du langage de
|
@@ -302,17 +341,17 @@ Les templates sont supposés se trouver directement dans le dossier
|
|
302
341
|
|
303
342
|
set :views, settings.root + '/templates'
|
304
343
|
|
305
|
-
Il est important de
|
306
|
-
sous forme de symboles, même
|
307
|
-
cas, utilisez <tt>:'sous_repertoire/template'</tt>).
|
308
|
-
symbole car les méthodes de rendu
|
344
|
+
Il est important de se souvenir que les templates sont toujours référencés
|
345
|
+
sous forme de symboles, même lorsqu'ils sont dans un sous-répertoire (dans
|
346
|
+
ce cas, utilisez <tt>:'sous_repertoire/template'</tt>). Il faut utiliser
|
347
|
+
un symbole car les méthodes de rendu évaluent le contenu des chaînes de
|
309
348
|
caractères au lieu de les considérer comme un chemin vers un fichier.
|
310
349
|
|
311
350
|
=== Langages de template disponibles
|
312
351
|
|
313
352
|
Certains langages ont plusieurs implémentations. Pour préciser l'implémentation
|
314
|
-
à utiliser (et garantir l'aspect thread-safe), vous
|
315
|
-
|
353
|
+
à utiliser (et garantir l'aspect thread-safe), vous devez simplement l'avoir
|
354
|
+
chargée au préalable :
|
316
355
|
|
317
356
|
require 'rdiscount' # ou require 'bluecloth'
|
318
357
|
get('/') { markdown :index }
|
@@ -327,7 +366,7 @@ Exemple:: <tt>haml :index, :format => :html5</tt>
|
|
327
366
|
|
328
367
|
Dépendances:: {erubis}[http://www.kuwata-lab.com/erubis/] ou
|
329
368
|
erb (inclus avec Ruby)
|
330
|
-
Extensions de fichier:: <tt>.erb</tt>, <tt>.rhtml</tt>
|
369
|
+
Extensions de fichier:: <tt>.erb</tt>, <tt>.rhtml</tt> ou <tt>.erubis</tt>
|
331
370
|
(Erubis seulement)
|
332
371
|
Exemple:: <tt>erb :index</tt>
|
333
372
|
|
@@ -335,7 +374,7 @@ Exemple:: <tt>erb :index</tt>
|
|
335
374
|
|
336
375
|
Dépendances:: {builder}[http://builder.rubyforge.org/]
|
337
376
|
Extensions de fichier:: <tt>.builder</tt>
|
338
|
-
Exemple:: <tt>builder { |xml| xml.em "
|
377
|
+
Exemple:: <tt>builder { |xml| xml.em "salut" }</tt>
|
339
378
|
|
340
379
|
Ce moteur accepte également un bloc pour des templates en ligne (voir exemple).
|
341
380
|
|
@@ -343,7 +382,7 @@ Ce moteur accepte également un bloc pour des templates en ligne (voir exemple).
|
|
343
382
|
|
344
383
|
Dépendances:: {nokogiri}[http://nokogiri.org/]
|
345
384
|
Extensions de fichier:: <tt>.nokogiri</tt>
|
346
|
-
Exemple:: <tt>builder { |xml| xml.em "
|
385
|
+
Exemple:: <tt>builder { |xml| xml.em "salut" }</tt>
|
347
386
|
|
348
387
|
Ce moteur accepte également un bloc pour des templates en ligne (voir exemple).
|
349
388
|
|
@@ -381,10 +420,10 @@ Dépendances:: {rdiscount}[https://github.com/rtomayko/rdiscount],
|
|
381
420
|
{bluecloth}[http://deveiate.org/projects/BlueCloth],
|
382
421
|
{kramdown}[http://kramdown.rubyforge.org/] *ou*
|
383
422
|
{maruku}[http://maruku.rubyforge.org/]
|
384
|
-
Extensions de fichier:: <tt>.markdown</tt>, <tt>.mkd</tt>
|
423
|
+
Extensions de fichier:: <tt>.markdown</tt>, <tt>.mkd</tt> et <tt>.md</tt>
|
385
424
|
Exemple:: <tt>markdown :index, :layout_engine => :erb</tt>
|
386
425
|
|
387
|
-
Il n'est pas possible d'appeler des méthodes depuis markdown, ni
|
426
|
+
Il n'est pas possible d'appeler des méthodes depuis markdown, ni de lui
|
388
427
|
passer des variables locales. Par conséquent, il sera souvent utilisé en
|
389
428
|
combinaison avec un autre moteur de rendu :
|
390
429
|
|
@@ -398,8 +437,8 @@ templates :
|
|
398
437
|
|
399
438
|
Comme vous ne pouvez pas appeler de Ruby au sein de Markdown, vous ne pouvez
|
400
439
|
pas utiliser de +layouts+ écrits en Markdown. Toutefois, il est possible
|
401
|
-
d'utiliser un
|
402
|
-
utilisant l'option <tt>:layout_engine</tt>.
|
440
|
+
d'utiliser un moteur de rendu différent pour le template et pour le +layout+
|
441
|
+
en utilisant l'option <tt>:layout_engine</tt>.
|
403
442
|
|
404
443
|
=== Templates Textile
|
405
444
|
|
@@ -407,7 +446,7 @@ Dépendances:: {RedCloth}[http://redcloth.org/]
|
|
407
446
|
Extensions de fichier:: <tt>.textile</tt>
|
408
447
|
Exemple:: <tt>textile :index, :layout_engine => :erb</tt>
|
409
448
|
|
410
|
-
Il n'est pas possible d'appeler des méthodes depuis textile, ni
|
449
|
+
Il n'est pas possible d'appeler des méthodes depuis textile, ni de lui
|
411
450
|
passer des variables locales. Par conséquent, il sera souvent utilisé en
|
412
451
|
combinaison avec un autre moteur de rendu :
|
413
452
|
|
@@ -421,16 +460,16 @@ templates :
|
|
421
460
|
|
422
461
|
Comme vous ne pouvez pas appeler de Ruby au sein de Textile, vous ne pouvez
|
423
462
|
pas utiliser de +layouts+ écrits en Textile. Toutefois, il est possible
|
424
|
-
d'utiliser un
|
425
|
-
utilisant l'option <tt>:layout_engine</tt>.
|
463
|
+
d'utiliser un moteur de rendu différent pour le template et pour le +layout+
|
464
|
+
en utilisant l'option <tt>:layout_engine</tt>.
|
426
465
|
|
427
466
|
=== Templates RDoc
|
428
467
|
|
429
468
|
Dépendances:: {rdoc}[http://rdoc.rubyforge.org/]
|
430
469
|
Extensions de fichier:: <tt>.rdoc</tt>
|
431
|
-
Exemple:: <tt>
|
470
|
+
Exemple:: <tt>rdoc :README, :layout_engine => :erb</tt>
|
432
471
|
|
433
|
-
Il n'est pas possible d'appeler des méthodes depuis rdoc, ni
|
472
|
+
Il n'est pas possible d'appeler des méthodes depuis rdoc, ni de lui
|
434
473
|
passer des variables locales. Par conséquent, il sera souvent utilisé en
|
435
474
|
combinaison avec un autre moteur de rendu :
|
436
475
|
|
@@ -444,8 +483,8 @@ templates :
|
|
444
483
|
|
445
484
|
Comme vous ne pouvez pas appeler de Ruby au sein de RDoc, vous ne pouvez
|
446
485
|
pas utiliser de +layouts+ écrits en RDoc. Toutefois, il est possible
|
447
|
-
d'utiliser un
|
448
|
-
utilisant l'option <tt>:layout_engine</tt>.
|
486
|
+
d'utiliser un moteur de rendu différent pour le template et pour le +layout+
|
487
|
+
en utilisant l'option <tt>:layout_engine</tt>.
|
449
488
|
|
450
489
|
=== Templates Radius
|
451
490
|
|
@@ -454,7 +493,7 @@ Extensions de fichier:: <tt>.radius</tt>
|
|
454
493
|
Exemple:: <tt>radius :index, :locals => { :key => 'value' }</tt>
|
455
494
|
|
456
495
|
Comme vous ne pouvez pas appeler de méthodes Ruby depuis un template Radius,
|
457
|
-
vous aurez sûrement à lui passer des variables locales
|
496
|
+
vous aurez sûrement à lui passer des variables locales.
|
458
497
|
|
459
498
|
=== Templates Markaby
|
460
499
|
|
@@ -476,7 +515,7 @@ Dépendances:: {creole}[https://github.com/minad/creole]
|
|
476
515
|
Extensions de fichier:: <tt>.creole</tt>
|
477
516
|
Exemple:: <tt>creole :wiki, :layout_engine => :erb</tt>
|
478
517
|
|
479
|
-
Il n'est pas possible d'appeler des méthodes depuis creole, ni
|
518
|
+
Il n'est pas possible d'appeler des méthodes depuis creole, ni de lui
|
480
519
|
passer des variables locales. Par conséquent, il sera souvent utilisé en
|
481
520
|
combinaison avec un autre moteur de rendu :
|
482
521
|
|
@@ -490,8 +529,8 @@ templates :
|
|
490
529
|
|
491
530
|
Comme vous ne pouvez pas appeler de Ruby au sein de Creole, vous ne pouvez
|
492
531
|
pas utiliser de +layouts+ écrits en Creole. Toutefois, il est possible
|
493
|
-
d'utiliser un
|
494
|
-
utilisant l'option <tt>:layout_engine</tt>.
|
532
|
+
d'utiliser un moteur de rendu différent pour le template et pour le +layout+
|
533
|
+
en utilisant l'option <tt>:layout_engine</tt>.
|
495
534
|
|
496
535
|
=== Templates CoffeeScript
|
497
536
|
|
@@ -506,7 +545,7 @@ Exemple:: <tt>coffee :index</tt>
|
|
506
545
|
haml '%div.title Bonjour le monde'
|
507
546
|
end
|
508
547
|
|
509
|
-
Générera le template
|
548
|
+
Générera le code du template spécifié dans la chaîne de caractères.
|
510
549
|
|
511
550
|
=== Accéder aux variables dans un Template
|
512
551
|
|
@@ -718,7 +757,7 @@ Si vous souhaitez avoir plus de contrôle, vous pouvez également enregistrer un
|
|
718
757
|
|
719
758
|
set :sessions, :domain => 'foo.com'
|
720
759
|
|
721
|
-
|
760
|
+
=== Halt
|
722
761
|
|
723
762
|
Pour arrêter immédiatement la requête dans un filtre ou un gestionnaire de
|
724
763
|
route :
|
@@ -745,7 +784,7 @@ Bien sûr il est possible de combiner un template avec +halt+ :
|
|
745
784
|
|
746
785
|
halt erb(:erreur)
|
747
786
|
|
748
|
-
|
787
|
+
=== Passer
|
749
788
|
|
750
789
|
Une route peut passer le relais aux autres routes qui correspondent également
|
751
790
|
avec <tt>pass</tt> :
|
@@ -816,7 +855,7 @@ retour et les entêtes :
|
|
816
855
|
get '/foo' do
|
817
856
|
status 418
|
818
857
|
headers \
|
819
|
-
"Allow" => "BREW, POST, GET, PROPFIND, WHEN"
|
858
|
+
"Allow" => "BREW, POST, GET, PROPFIND, WHEN",
|
820
859
|
"Refresh" => "Refresh: 20; http://www.ietf.org/rfc/rfc2324.txt"
|
821
860
|
body "Je suis une théière !"
|
822
861
|
end
|
@@ -824,6 +863,56 @@ retour et les entêtes :
|
|
824
863
|
Comme +body+, +headers+ et +status+ peuvent être utilisés sans arguments
|
825
864
|
pour accéder à leurs valeurs.
|
826
865
|
|
866
|
+
=== Faire du streaming
|
867
|
+
|
868
|
+
Il y a des cas où vous voulez commencer à renvoyer des données pendant que
|
869
|
+
vous êtes en train de générer le reste de la réponse. Dans les cas les plus
|
870
|
+
extrèmes, vous souhaitez continuer à envoyer des données tant que le client
|
871
|
+
n'abandonne pas la connection. Vous pouvez alors utiliser le helper +stream+
|
872
|
+
pour éviter de créer votre propre système :
|
873
|
+
|
874
|
+
get '/' do
|
875
|
+
stream do |out|
|
876
|
+
out << "Ca va être hallu -\n"
|
877
|
+
sleep 0.5
|
878
|
+
out << " (attends la suite) \n"
|
879
|
+
sleep 1
|
880
|
+
out << "- cinant !\n"
|
881
|
+
end
|
882
|
+
end
|
883
|
+
|
884
|
+
Cela permet d'implémenter des API de streaming ou de
|
885
|
+
{Server Sent Events}[http://dev.w3.org/html5/eventsource/] et peut servir de
|
886
|
+
base pour des {WebSockets}[http://en.wikipedia.org/wiki/WebSocket]. Vous
|
887
|
+
pouvez aussi l'employer pour augmenter le débit quand une partie du contenu
|
888
|
+
provient d'une resource lente.
|
889
|
+
|
890
|
+
Le fonctionnement du streaming, notamment le nombre de requêtes simultanées,
|
891
|
+
dépend énormément du serveur web utilisé. Certains ne prennent pas du tout en
|
892
|
+
charge le streaming (WEBRick par exemple). Lorsque le serveur ne gère pas le
|
893
|
+
streaming, la partie body de la réponse sera envoyée au client en une seule
|
894
|
+
fois, après que l'exécution du bloc passé au helper +stream+ sera terminée.
|
895
|
+
|
896
|
+
En utilisant le helper +stream+ avec le paramètre +keep_open+, il n'appelera
|
897
|
+
pas la méthode +close+ du flux, vous laissant la possibilité de le fermer à
|
898
|
+
tout moment au cours de l'exécution. Ceci ne fonctionne qu'avec les serveurs
|
899
|
+
evented (ie non threadés) tels que Thin et Rainbows. Les autres serveurs
|
900
|
+
fermeront malgré tout le flux.
|
901
|
+
|
902
|
+
set :server, :thin
|
903
|
+
connections = []
|
904
|
+
|
905
|
+
get '/' do
|
906
|
+
# conserve le flux ouvert
|
907
|
+
stream(:keep_open) { |out| connections << out }
|
908
|
+
end
|
909
|
+
|
910
|
+
post '/' do
|
911
|
+
# écrit dans tous les flux ouverts
|
912
|
+
connections.each { |out| out << params[:message] << "\n" }
|
913
|
+
"message sent"
|
914
|
+
end
|
915
|
+
|
827
916
|
=== Journalisation (Logging)
|
828
917
|
|
829
918
|
Dans le contexte de la requête, la méthode utilitaire +logger+ expose une
|
@@ -911,7 +1000,7 @@ Pour passer des arguments à une redirection, ajoutez-les soit à la requête :
|
|
911
1000
|
|
912
1001
|
Ou bien utilisez une session :
|
913
1002
|
|
914
|
-
enable :
|
1003
|
+
enable :sessions
|
915
1004
|
|
916
1005
|
get '/foo' do
|
917
1006
|
session[:secret] = 'foo'
|
@@ -946,7 +1035,7 @@ Si vous utilisez la méthode +expires+ pour définir l'entête correspondant,
|
|
946
1035
|
expires 500, :public, :must_revalidate
|
947
1036
|
end
|
948
1037
|
|
949
|
-
Pour utiliser correctement les caches, vous devriez utiliser +etag+
|
1038
|
+
Pour utiliser correctement les caches, vous devriez utiliser +etag+ ou
|
950
1039
|
+last_modified+. Il est recommandé d'utiliser ces méthodes *avant* de faire
|
951
1040
|
d'importantes modifications, car elles vont immédiatement déclencher la réponse
|
952
1041
|
si le client a déjà la version courante dans son cache :
|
@@ -965,7 +1054,7 @@ Il est également possible d'utiliser un
|
|
965
1054
|
|
966
1055
|
Ces méthodes ne sont pas chargées de mettre des données en cache, mais elles
|
967
1056
|
fournissent les informations nécessaires pour votre cache. Si vous êtes à la
|
968
|
-
recherche de solutions rapides de cache, essayez
|
1057
|
+
recherche de solutions rapides pour un reverse-proxy de cache, essayez
|
969
1058
|
{rack-cache}[http://rtomayko.github.com/rack-cache/] :
|
970
1059
|
|
971
1060
|
require "rack/cache"
|
@@ -1016,7 +1105,7 @@ Si le gestionnaire Rack le supporte, d'autres moyens que le +streaming+ via le
|
|
1016
1105
|
processus Ruby seront utilisés. Si vous utilisez cette méthode, Sinatra gérera
|
1017
1106
|
automatiquement les requêtes de type +range+.
|
1018
1107
|
|
1019
|
-
|
1108
|
+
=== Accéder à l'objet requête
|
1020
1109
|
|
1021
1110
|
L'objet correspondant à la requête envoyée peut être récupéré dans le contexte
|
1022
1111
|
de la requête (filtres, routes, gestionnaires d'erreur) au moyen de la méthode
|
@@ -1090,6 +1179,38 @@ Vous pouvez également lui passer un nom de fichier :
|
|
1090
1179
|
"enregistre-le !"
|
1091
1180
|
end
|
1092
1181
|
|
1182
|
+
=== Gérer Date et Time
|
1183
|
+
|
1184
|
+
Sinatra fourni un helper +time_for+ pour convertir une valeur donnée en
|
1185
|
+
objet +Time+. Il peut aussi faire la conversion à partir d'objets +DateTime+,
|
1186
|
+
+Date+ ou de classes similaires.
|
1187
|
+
|
1188
|
+
get '/' do
|
1189
|
+
pass if Time.now > time_for('Dec 23, 2012')
|
1190
|
+
"encore temps"
|
1191
|
+
end
|
1192
|
+
|
1193
|
+
Cette méthode est utilisée en interne par +expires+, +last_modified+ et
|
1194
|
+
consorts. Par conséquent, vous pouvez très facilement étendre le
|
1195
|
+
fonctionnement de ces méthodes en surchargeant le helper +time_for+ dans
|
1196
|
+
votre application :
|
1197
|
+
|
1198
|
+
helpers do
|
1199
|
+
def time_for(value)
|
1200
|
+
case value
|
1201
|
+
when :yesterday then Time.now - 24*60*60
|
1202
|
+
when :tomorrow then Time.now + 24*60*60
|
1203
|
+
else super
|
1204
|
+
end
|
1205
|
+
end
|
1206
|
+
end
|
1207
|
+
|
1208
|
+
get '/' do
|
1209
|
+
last_modified :yesterday
|
1210
|
+
expires :tomorrow
|
1211
|
+
"salut"
|
1212
|
+
end
|
1213
|
+
|
1093
1214
|
=== Chercher les fichiers de templates
|
1094
1215
|
|
1095
1216
|
La méthode <tt>find_template</tt> est utilisée pour trouver les fichiers de
|
@@ -1243,7 +1364,7 @@ Vous pouvez accéder à ces paramètres via <tt>settings</tt> :
|
|
1243
1364
|
comportera comme <tt>redirect to('/foo')</tt>.
|
1244
1365
|
Désactivé par défaut.
|
1245
1366
|
|
1246
|
-
[
|
1367
|
+
[public_folder] dossier duquel les fichiers publics sont servis
|
1247
1368
|
|
1248
1369
|
[reload_templates] si oui ou non les templates doivent être rechargés
|
1249
1370
|
entre les requêtes. Activé en mode développement.
|
@@ -1275,6 +1396,9 @@ Vous pouvez accéder à ces paramètres via <tt>settings</tt> :
|
|
1275
1396
|
Activé par défaut pour le style classique, désactivé pour
|
1276
1397
|
le style modulaire.
|
1277
1398
|
|
1399
|
+
[threaded] à définir à +true+ pour indiquer à Thin d'utiliser
|
1400
|
+
<tt>EventMachine.defer</tt> pour traiter la requête.
|
1401
|
+
|
1278
1402
|
[views] dossier des vues.
|
1279
1403
|
|
1280
1404
|
== Gérer les erreurs
|
@@ -1585,6 +1709,7 @@ sans avoir à les assigner à une constante, vous pouvez le faire grâce à
|
|
1585
1709
|
|
1586
1710
|
L'application dont elle hérite peut être passé en argument optionnel :
|
1587
1711
|
|
1712
|
+
# config.ru
|
1588
1713
|
require 'sinatra/base'
|
1589
1714
|
|
1590
1715
|
controleur = Sinatra.new do
|