sinatra 1.4.6 → 2.0.0
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.
- checksums.yaml +4 -4
- data/AUTHORS.md +5 -2
- data/{CHANGES → CHANGELOG.md} +126 -46
- data/CONTRIBUTING.md +100 -0
- data/Gemfile +12 -17
- data/LICENSE +5 -2
- data/MAINTENANCE.md +42 -0
- data/README.de.md +711 -466
- data/README.es.md +206 -171
- data/README.fr.md +370 -344
- data/README.hu.md +44 -10
- data/README.ja.md +300 -210
- data/README.ko.md +230 -191
- data/README.md +675 -528
- data/README.pt-br.md +149 -115
- data/README.pt-pt.md +65 -65
- data/README.ru.md +198 -97
- data/README.zh.md +1943 -1237
- data/Rakefile +72 -49
- data/SECURITY.md +35 -0
- data/lib/sinatra/base.rb +141 -207
- data/lib/sinatra/indifferent_hash.rb +150 -0
- data/lib/sinatra/main.rb +1 -0
- data/lib/sinatra/show_exceptions.rb +70 -56
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +19 -7
- metadata +32 -163
- data/test/asciidoctor_test.rb +0 -72
- data/test/base_test.rb +0 -167
- data/test/builder_test.rb +0 -91
- data/test/coffee_test.rb +0 -96
- data/test/compile_test.rb +0 -183
- data/test/contest.rb +0 -91
- data/test/creole_test.rb +0 -65
- data/test/delegator_test.rb +0 -160
- data/test/encoding_test.rb +0 -20
- data/test/erb_test.rb +0 -116
- data/test/extensions_test.rb +0 -98
- data/test/filter_test.rb +0 -487
- data/test/haml_test.rb +0 -109
- data/test/helper.rb +0 -132
- data/test/helpers_test.rb +0 -1917
- data/test/integration/app.rb +0 -79
- data/test/integration_helper.rb +0 -236
- data/test/integration_test.rb +0 -104
- data/test/less_test.rb +0 -69
- data/test/liquid_test.rb +0 -77
- data/test/mapped_error_test.rb +0 -285
- data/test/markaby_test.rb +0 -80
- data/test/markdown_test.rb +0 -85
- data/test/mediawiki_test.rb +0 -68
- data/test/middleware_test.rb +0 -68
- data/test/nokogiri_test.rb +0 -67
- data/test/public/favicon.ico +0 -0
- data/test/rabl_test.rb +0 -89
- data/test/rack_test.rb +0 -45
- data/test/radius_test.rb +0 -59
- data/test/rdoc_test.rb +0 -66
- data/test/readme_test.rb +0 -130
- data/test/request_test.rb +0 -100
- data/test/response_test.rb +0 -63
- data/test/result_test.rb +0 -76
- data/test/route_added_hook_test.rb +0 -59
- data/test/routing_test.rb +0 -1412
- data/test/sass_test.rb +0 -115
- data/test/scss_test.rb +0 -88
- data/test/server_test.rb +0 -56
- data/test/settings_test.rb +0 -582
- data/test/sinatra_test.rb +0 -12
- data/test/slim_test.rb +0 -102
- data/test/static_test.rb +0 -236
- data/test/streaming_test.rb +0 -149
- data/test/stylus_test.rb +0 -90
- data/test/templates_test.rb +0 -382
- data/test/textile_test.rb +0 -65
- data/test/views/a/in_a.str +0 -1
- data/test/views/ascii.erb +0 -2
- data/test/views/b/in_b.str +0 -1
- data/test/views/calc.html.erb +0 -1
- data/test/views/error.builder +0 -3
- data/test/views/error.erb +0 -3
- data/test/views/error.haml +0 -3
- data/test/views/error.sass +0 -2
- data/test/views/explicitly_nested.str +0 -1
- data/test/views/foo/hello.test +0 -1
- data/test/views/hello.asciidoc +0 -1
- data/test/views/hello.builder +0 -1
- data/test/views/hello.coffee +0 -1
- data/test/views/hello.creole +0 -1
- data/test/views/hello.erb +0 -1
- data/test/views/hello.haml +0 -1
- data/test/views/hello.less +0 -5
- data/test/views/hello.liquid +0 -1
- data/test/views/hello.mab +0 -1
- data/test/views/hello.md +0 -1
- data/test/views/hello.mediawiki +0 -1
- data/test/views/hello.nokogiri +0 -1
- data/test/views/hello.rabl +0 -2
- data/test/views/hello.radius +0 -1
- data/test/views/hello.rdoc +0 -1
- data/test/views/hello.sass +0 -2
- data/test/views/hello.scss +0 -3
- data/test/views/hello.slim +0 -1
- data/test/views/hello.str +0 -1
- data/test/views/hello.styl +0 -2
- data/test/views/hello.test +0 -1
- data/test/views/hello.textile +0 -1
- data/test/views/hello.wlang +0 -1
- data/test/views/hello.yajl +0 -1
- data/test/views/layout2.builder +0 -3
- data/test/views/layout2.erb +0 -2
- data/test/views/layout2.haml +0 -2
- data/test/views/layout2.liquid +0 -2
- data/test/views/layout2.mab +0 -2
- data/test/views/layout2.nokogiri +0 -3
- data/test/views/layout2.rabl +0 -3
- data/test/views/layout2.radius +0 -2
- data/test/views/layout2.slim +0 -3
- data/test/views/layout2.str +0 -2
- data/test/views/layout2.test +0 -1
- data/test/views/layout2.wlang +0 -2
- data/test/views/nested.str +0 -1
- data/test/views/utf8.erb +0 -2
- data/test/wlang_test.rb +0 -87
- data/test/yajl_test.rb +0 -86
data/README.ru.md
CHANGED
@@ -1,10 +1,96 @@
|
|
1
1
|
# Sinatra
|
2
2
|
|
3
|
+
## Содержание
|
4
|
+
|
5
|
+
* [Sinatra](#sinatra)
|
6
|
+
* [Маршруты](#Маршруты)
|
7
|
+
* [Условия](#Условия)
|
8
|
+
* [Возвращаемые значения](#Возвращаемые-значения)
|
9
|
+
* [Собственные детекторы совпадений для маршрутов](#Собственные-детекторы-совпадений-для-маршрутов)
|
10
|
+
* [Статические файлы](#Статические-файлы)
|
11
|
+
* [Представления / Шаблоны](#Представления--Шаблоны)
|
12
|
+
* [Буквальные шаблоны](#Буквальные-шаблоны)
|
13
|
+
* [Доступные шаблонизаторы](#Доступные-шаблонизаторы)
|
14
|
+
* [Haml шаблоны](#haml-шаблоны)
|
15
|
+
* [Erb шаблоны](#erb-шаблоны)
|
16
|
+
* [Builder шаблоны](#builder-шаблоны)
|
17
|
+
* [Nokogiri шаблоны](#nokogiri-шаблоны)
|
18
|
+
* [Sass шаблоны](#sass-шаблоны)
|
19
|
+
* [SCSS шаблоны](#scss-шаблоны)
|
20
|
+
* [Less шаблоны](#less-шаблоны)
|
21
|
+
* [Liquid шаблоны](#liquid-шаблоны)
|
22
|
+
* [Markdown шаблоны](#markdown-шаблоны)
|
23
|
+
* [Textile шаблоны](#textile-шаблоны)
|
24
|
+
* [RDoc шаблоны](#rdoc-шаблоны)
|
25
|
+
* [AsciiDoc шаблоны](#asciidoc-шаблоны)
|
26
|
+
* [Radius шаблоны](#radius-шаблоны)
|
27
|
+
* [Markaby шаблоны](#markaby-шаблоны)
|
28
|
+
* [RABL шаблоны](#rabl-шаблоны)
|
29
|
+
* [Slim шаблоны](#slim-шаблоны)
|
30
|
+
* [Creole шаблоны](#creole-шаблоны)
|
31
|
+
* [MediaWiki шаблоны](#mediawiki-шаблоны)
|
32
|
+
* [CoffeeScript шаблоны](#coffeescript-шаблоны)
|
33
|
+
* [Stylus шаблоны](#stylus-шаблоны)
|
34
|
+
* [Yajl шаблоны](#yajl-шаблоны)
|
35
|
+
* [WLang шаблоны](#wlang-шаблоны)
|
36
|
+
* [Доступ к переменным в шаблонах](#Доступ-к-переменным-в-шаблонах)
|
37
|
+
* [Шаблоны с `yield` и вложенные раскладки (layout)](#Шаблоны-с-yield-и-вложенные-раскладки-layout)
|
38
|
+
* [Включённые шаблоны](#Включённые-шаблоны)
|
39
|
+
* [Именованные шаблоны](#Именованные-шаблоны)
|
40
|
+
* [Привязка файловых расширений](#Привязка-файловых-расширений)
|
41
|
+
* [Добавление собственного движка рендеринга](#Добавление-собственного-движка-рендеринга)
|
42
|
+
* [Фильтры](#Фильтры)
|
43
|
+
* [Методы-помощники](#Методы-помощники)
|
44
|
+
* [Использование сессий](#Использование-сессий)
|
45
|
+
* [Выбор вашей собственной "прослойки" сессии](#Выбор-вашей-собственной-прослойки-сессий)
|
46
|
+
* [Прерывание](#Прерывание)
|
47
|
+
* [Передача](#Передача)
|
48
|
+
* [Вызов другого маршрута](#Вызов-другого-маршрута)
|
49
|
+
* [Задание тела, кода и заголовков ответа](#Задание-тела-кода-и-заголовков-ответа)
|
50
|
+
* [Стриминг ответов](#Стриминг-ответов)
|
51
|
+
* [Логирование](#Логирование)
|
52
|
+
* [Mime-типы](#mime-типы)
|
53
|
+
* [Генерирование URL](#Генерирование-url)
|
54
|
+
* [Перенаправление (редирект)](#Перенаправление-редирект)
|
55
|
+
* [Управление кэшированием](#Управление-кэшированием)
|
56
|
+
* [Отправка файлов](#Отправка-файлов)
|
57
|
+
* [Доступ к объекту запроса](#Доступ-к-объекту-запроса)
|
58
|
+
* [Вложения](#Вложения)
|
59
|
+
* [Работа со временем и датами](#Работа-со-временем-и-датами)
|
60
|
+
* [Поиск шаблонов](#Поиск-шаблонов)
|
61
|
+
* [Конфигурация](#Конфигурация)
|
62
|
+
* [Настройка защиты от атак](#Настройка-защиты-от-атак)
|
63
|
+
* [Доступные настройки](#Доступные-настройки)
|
64
|
+
* [Режим, окружение](#Режим-окружение)
|
65
|
+
* [Обработка ошибок](#Обработка-ошибок)
|
66
|
+
* [Not Found](#not-found)
|
67
|
+
* [Error](#error)
|
68
|
+
* [Rack "прослойки"](#rack-прослойки)
|
69
|
+
* [Тестирование](#Тестирование)
|
70
|
+
* [Sinatra::Base — "прослойки", библиотеки и модульные приложения](#sinatrabase--прослойки-библиотеки-и-модульные-приложения)
|
71
|
+
* [Модульные приложения против классических](#Модульные-приложения-против-классических)
|
72
|
+
* [Запуск модульных приложений](#Запуск-модульных-приложений)
|
73
|
+
* [Запуск классических приложений с config.ru](#Запуск-классических-приложений-с-configru)
|
74
|
+
* [Когда использовать config.ru?](#Когда-использовать-configru)
|
75
|
+
* [Использование Sinatra в качестве "прослойки"](#Использование-sinatra-в-качестве-прослойки)
|
76
|
+
* [Создание приложений "на лету"](#Создание-приложений-на-лету)
|
77
|
+
* [Области видимости и привязка](#Области-видимости-и-привязка)
|
78
|
+
* [Область видимости приложения / класса](#Область-видимости-приложения--класса)
|
79
|
+
* [Область видимости запроса / экземпляра](#Область-видимости-запроса--экземпляра)
|
80
|
+
* [Область видимости делегирования](#Область-видимости-делегирования)
|
81
|
+
* [Командная строка](#Командная-строка)
|
82
|
+
* [Multi-threading](#multi-threading)
|
83
|
+
* [Системные требования](#Системные-требования)
|
84
|
+
* [На острие](#На-острие)
|
85
|
+
* [С помощью Bundler](#С-помощью-bundler)
|
86
|
+
* [Версии](#Версии)
|
87
|
+
* [Дальнейшее чтение](#Дальнейшее-чтение)
|
88
|
+
|
3
89
|
*Внимание: Этот документ является переводом английской версии и может быть
|
4
90
|
устаревшим*
|
5
91
|
|
6
92
|
Sinatra — это предметно-ориентированный каркас
|
7
|
-
([DSL](
|
93
|
+
([DSL](https://ru.wikipedia.org/wiki/Предметно-ориентированный_язык))
|
8
94
|
для быстрого создания функциональных веб-приложений на Ruby с минимумом усилий:
|
9
95
|
|
10
96
|
```ruby
|
@@ -18,17 +104,17 @@ end
|
|
18
104
|
|
19
105
|
Установите gem:
|
20
106
|
|
21
|
-
```
|
107
|
+
```shell
|
22
108
|
gem install sinatra
|
23
109
|
```
|
24
110
|
|
25
111
|
и запустите приложение с помощью:
|
26
112
|
|
27
|
-
```
|
113
|
+
```shell
|
28
114
|
ruby myapp.rb
|
29
115
|
```
|
30
116
|
|
31
|
-
Оцените результат: http://localhost:4567
|
117
|
+
Оцените результат: [http://localhost:4567](http://localhost:4567)
|
32
118
|
|
33
119
|
Рекомендуется также установить Thin, сделать это можно командой: `gem install
|
34
120
|
thin`. Thin — это более производительный и функциональный сервер для
|
@@ -121,7 +207,7 @@ end
|
|
121
207
|
Регулярные выражения в качестве шаблонов маршрутов:
|
122
208
|
|
123
209
|
```ruby
|
124
|
-
get
|
210
|
+
get /\/hello\/([\w]+)/ do
|
125
211
|
"Hello, #{params['captures'].first}!"
|
126
212
|
end
|
127
213
|
```
|
@@ -138,8 +224,8 @@ end
|
|
138
224
|
Шаблоны маршрутов могут иметь необязательные параметры:
|
139
225
|
|
140
226
|
```ruby
|
141
|
-
get '/posts
|
142
|
-
# соответствует "GET /posts", "GET /posts
|
227
|
+
get '/posts/:format?' do
|
228
|
+
# соответствует "GET /posts/", "GET /posts/json", "GET /posts/xml" и т.д.
|
143
229
|
end
|
144
230
|
```
|
145
231
|
|
@@ -290,7 +376,7 @@ end
|
|
290
376
|
Или с использованием негативного просмотра вперед:
|
291
377
|
|
292
378
|
```ruby
|
293
|
-
get %r{
|
379
|
+
get %r{(?!/index)} do
|
294
380
|
# ...
|
295
381
|
end
|
296
382
|
```
|
@@ -508,7 +594,7 @@ get('/') { markdown :index }
|
|
508
594
|
<table>
|
509
595
|
<tr>
|
510
596
|
<td>Зависимости</td>
|
511
|
-
<td><a href="http://nokogiri.org/" title="nokogiri">nokogiri</a></td>
|
597
|
+
<td><a href="http://www.nokogiri.org/" title="nokogiri">nokogiri</a></td>
|
512
598
|
</tr>
|
513
599
|
<tr>
|
514
600
|
<td>Расширения файлов</td>
|
@@ -561,7 +647,7 @@ get('/') { markdown :index }
|
|
561
647
|
<table>
|
562
648
|
<tr>
|
563
649
|
<td>Зависимости</td>
|
564
|
-
<td><a href="http://
|
650
|
+
<td><a href="http://lesscss.org/" title="less">less</a></td>
|
565
651
|
</tr>
|
566
652
|
<tr>
|
567
653
|
<td>Расширения файлов</td>
|
@@ -578,7 +664,7 @@ get('/') { markdown :index }
|
|
578
664
|
<table>
|
579
665
|
<tr>
|
580
666
|
<td>Зависимости</td>
|
581
|
-
<td><a href="http://
|
667
|
+
<td><a href="http://liquidmarkup.org/" title="liquid">liquid</a></td>
|
582
668
|
</tr>
|
583
669
|
<tr>
|
584
670
|
<td>Расширения файлов</td>
|
@@ -600,7 +686,7 @@ get('/') { markdown :index }
|
|
600
686
|
<td>Зависимости</td>
|
601
687
|
<td>
|
602
688
|
Любая из библиотек:
|
603
|
-
<a href="https://github.com/
|
689
|
+
<a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
|
604
690
|
<a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
|
605
691
|
<a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
|
606
692
|
<a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
|
@@ -756,7 +842,7 @@ erb :overview, :locals => { :text => rdoc(:introduction) }
|
|
756
842
|
<table>
|
757
843
|
<tr>
|
758
844
|
<td>Зависимости</td>
|
759
|
-
<td><a href="http://markaby.github.
|
845
|
+
<td><a href="http://markaby.github.io/" title="Markaby">Markaby</a></td>
|
760
846
|
</tr>
|
761
847
|
<tr>
|
762
848
|
<td>Расширения файлов</td>
|
@@ -908,7 +994,7 @@ erb :overview, :locals => { :text => mediawiki(:introduction) }
|
|
908
994
|
<tr>
|
909
995
|
<td>Зависимости</td>
|
910
996
|
<td>
|
911
|
-
<a href="https://github.com/
|
997
|
+
<a href="https://github.com/forgecrafted/ruby-stylus" title="Ruby Stylus">
|
912
998
|
Stylus
|
913
999
|
</a> и
|
914
1000
|
<a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
|
@@ -929,7 +1015,7 @@ erb :overview, :locals => { :text => mediawiki(:introduction) }
|
|
929
1015
|
Перед тем, как использовать шаблоны стилус, загрузите `stylus` и
|
930
1016
|
`stylus/tilt`:
|
931
1017
|
|
932
|
-
```
|
1018
|
+
```ruby
|
933
1019
|
require 'sinatra'
|
934
1020
|
require 'stylus'
|
935
1021
|
require 'stylus/tilt'
|
@@ -1254,25 +1340,6 @@ get '/:value' do
|
|
1254
1340
|
end
|
1255
1341
|
```
|
1256
1342
|
|
1257
|
-
Заметьте, что при использовании `enable :sessions` все данные сохраняются в
|
1258
|
-
куках (cookies). Это может быть не совсем то, что вы хотите (например,
|
1259
|
-
сохранение больших объемов данных увеличит ваш трафик). В таком случае вы
|
1260
|
-
можете использовать альтернативную Rack "прослойку" (middleware), реализующую
|
1261
|
-
механизм сессий. Для этого *не надо* вызывать `enable :sessions`, вместо этого
|
1262
|
-
следует подключить ее так же, как и любую другую "прослойку":
|
1263
|
-
|
1264
|
-
```ruby
|
1265
|
-
use Rack::Session::Pool, :expire_after => 2592000
|
1266
|
-
|
1267
|
-
get '/' do
|
1268
|
-
"value = " << session['value'].inspect
|
1269
|
-
end
|
1270
|
-
|
1271
|
-
get '/:value' do
|
1272
|
-
session['value'] = params['value']
|
1273
|
-
end
|
1274
|
-
```
|
1275
|
-
|
1276
1343
|
Для повышения безопасности данные сессии в куках подписываются секретным
|
1277
1344
|
ключом. Секретный ключ генерируется Sinatra. Тем не менее, так как этот ключ
|
1278
1345
|
будет меняться с каждым запуском приложения, вы, возможно, захотите установить
|
@@ -1293,10 +1360,44 @@ set :sessions, :domain => 'foo.com'
|
|
1293
1360
|
Чтобы сделать сессию доступной другим приложениям, размещенным на поддоменах
|
1294
1361
|
foo.com, добавьте *.* перед доменом:
|
1295
1362
|
|
1296
|
-
```
|
1363
|
+
```ruby
|
1297
1364
|
set :sessions, :domain => '.foo.com'
|
1298
1365
|
```
|
1299
1366
|
|
1367
|
+
#### Выбор вашей собственной "прослойки" сессии
|
1368
|
+
|
1369
|
+
Заметьте, что при использовании `enable :sessions` все данные сохраняются в
|
1370
|
+
куках (cookies). Это может быть не совсем то, что вы хотите (например,
|
1371
|
+
сохранение больших объемов данных увеличит ваш трафик). В таком случае вы
|
1372
|
+
можете использовать альтернативную Rack "прослойку" (middleware), реализующую
|
1373
|
+
механизм сессий. Для этого используете один из способов ниже:
|
1374
|
+
|
1375
|
+
```ruby
|
1376
|
+
enable :sessions
|
1377
|
+
set :session_store, Rack::Session::Pool
|
1378
|
+
```
|
1379
|
+
|
1380
|
+
Или установите параметры сессии с помощью хеша опций:
|
1381
|
+
|
1382
|
+
```ruby
|
1383
|
+
set :sessions, :expire_after => 2592000
|
1384
|
+
set :session_store, Rack::Session::Pool
|
1385
|
+
```
|
1386
|
+
|
1387
|
+
Вы так же можете не вызывать `enable :sessions`, а вместо этого вызывать
|
1388
|
+
необходимую вам прослойку так же, как вы это обычно делаете. Очень важно
|
1389
|
+
обратить внимание на то, что когда вы используете этот метод, основной способ
|
1390
|
+
защиты сессии **не будет включен по умолчанию**. Если вы хотите включить защиту,
|
1391
|
+
вам нужно добавить следующие строчки:
|
1392
|
+
|
1393
|
+
```ruby
|
1394
|
+
use Rack::Session::Pool, :expire_after => 2592000
|
1395
|
+
use Rack::Protection::RemoteToken
|
1396
|
+
use Rack::Protection::SessionHijacking
|
1397
|
+
```
|
1398
|
+
|
1399
|
+
Смотрите секцию "Настройка защиты от атак" для более подробной информации.
|
1400
|
+
|
1300
1401
|
### Прерывание
|
1301
1402
|
|
1302
1403
|
Чтобы незамедлительно прервать обработку запроса внутри фильтра или маршрута,
|
@@ -1439,17 +1540,17 @@ end
|
|
1439
1540
|
```
|
1440
1541
|
|
1441
1542
|
Что позволяет вам реализовать стриминговые API,
|
1442
|
-
[Server Sent Events](
|
1443
|
-
и может служить основой для [WebSockets](
|
1543
|
+
[Server Sent Events](https://w3c.github.io/eventsource/),
|
1544
|
+
и может служить основой для [WebSockets](https://en.wikipedia.org/wiki/WebSocket).
|
1444
1545
|
Также такой подход можно использовать для увеличения производительности в случае,
|
1445
1546
|
когда какая-то часть контента зависит от медленного ресурса.
|
1446
1547
|
|
1447
1548
|
Заметьте, что возможности стриминга, особенно количество одновременно
|
1448
1549
|
обслуживаемых запросов, очень сильно зависят от используемого веб-сервера.
|
1449
|
-
Некоторые
|
1450
|
-
|
1451
|
-
|
1452
|
-
|
1550
|
+
Некоторые серверы могут и вовсе не поддерживать стриминг. Если сервер не
|
1551
|
+
поддерживает стриминг, то все данные будут отправлены за один раз сразу после
|
1552
|
+
того, как блок, переданный в `stream`, завершится. Стриминг вообще не работает
|
1553
|
+
при использовании Shotgun.
|
1453
1554
|
|
1454
1555
|
Если метод используется с параметром `keep_open`, то он не будет вызывать
|
1455
1556
|
`close` у объекта потока, что позволит вам закрыть его позже в любом другом
|
@@ -1567,7 +1668,7 @@ end
|
|
1567
1668
|
|
1568
1669
|
```ruby
|
1569
1670
|
redirect to('/bar'), 303
|
1570
|
-
redirect 'http://google.com', 'wrong place, buddy'
|
1671
|
+
redirect 'http://www.google.com/', 'wrong place, buddy'
|
1571
1672
|
```
|
1572
1673
|
|
1573
1674
|
Вы также можете перенаправить пользователя обратно, на страницу, с которой он
|
@@ -1651,7 +1752,7 @@ end
|
|
1651
1752
|
```
|
1652
1753
|
|
1653
1754
|
Также вы можете использовать
|
1654
|
-
[weak ETag](
|
1755
|
+
[weak ETag](https://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation):
|
1655
1756
|
|
1656
1757
|
```ruby
|
1657
1758
|
etag @article.sha1, :weak
|
@@ -1935,7 +2036,7 @@ configure do
|
|
1935
2036
|
end
|
1936
2037
|
```
|
1937
2038
|
|
1938
|
-
Будет запущено, когда окружение (
|
2039
|
+
Будет запущено, когда окружение (APP_ENV переменная) `:production`:
|
1939
2040
|
|
1940
2041
|
```ruby
|
1941
2042
|
configure :production do
|
@@ -1968,7 +2069,7 @@ end
|
|
1968
2069
|
### Настройка защиты от атак
|
1969
2070
|
|
1970
2071
|
Sinatra использует
|
1971
|
-
[Rack::Protection](https://github.com/
|
2072
|
+
[Rack::Protection](https://github.com/sinatra/rack-protection#readme) для защиты
|
1972
2073
|
приложения от простых атак. Вы можете легко выключить эту защиту (что сделает
|
1973
2074
|
ваше приложение чрезвычайно уязвимым):
|
1974
2075
|
|
@@ -2034,8 +2135,8 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
2034
2135
|
|
2035
2136
|
<dt>environment</dt>
|
2036
2137
|
<dd>
|
2037
|
-
текущее окружение, по умолчанию, значение <tt>ENV['
|
2038
|
-
<tt>"development"</tt>, если <tt>ENV['
|
2138
|
+
текущее окружение, по умолчанию, значение <tt>ENV['APP_ENV']</tt> или
|
2139
|
+
<tt>"development"</tt>, если <tt>ENV['APP_ENV']</tt> недоступна.
|
2039
2140
|
</dd>
|
2040
2141
|
|
2041
2142
|
<dt>logging</dt>
|
@@ -2162,7 +2263,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
2162
2263
|
## Режим, окружение
|
2163
2264
|
|
2164
2265
|
Есть 3 предопределенных режима, окружения: `"development"`, `"production"` и
|
2165
|
-
`"test"`. Режим может быть задан через переменную окружения `
|
2266
|
+
`"test"`. Режим может быть задан через переменную окружения `APP_ENV`.
|
2166
2267
|
Значение по умолчанию — `"development"`. В этом режиме работы все шаблоны
|
2167
2268
|
перезагружаются между запросами. А также задаются специальные обработчики
|
2168
2269
|
`not_found` и `error`, чтобы вы могли увидеть стек вызовов. В окружениях
|
@@ -2275,7 +2376,7 @@ end
|
|
2275
2376
|
```
|
2276
2377
|
|
2277
2378
|
Семантика `use` идентична той, что определена для
|
2278
|
-
[Rack::Builder](http://rubydoc.info/github/rack/rack/master/Rack/Builder) DSL
|
2379
|
+
[Rack::Builder](http://www.rubydoc.info/github/rack/rack/master/Rack/Builder) DSL
|
2279
2380
|
(чаще всего используется в rackup файлах). Например, метод `use` принимает как
|
2280
2381
|
множественные переменные, так и блоки:
|
2281
2382
|
|
@@ -2300,7 +2401,7 @@ Rack распространяется с различными стандартн
|
|
2300
2401
|
|
2301
2402
|
Тесты для Sinatra приложений могут быть написаны с помощью библиотек,
|
2302
2403
|
фреймворков, поддерживающих тестирование Rack.
|
2303
|
-
[Rack::Test](http://
|
2404
|
+
[Rack::Test](http://www.rubydoc.info/github/brynary/rack-test/master/frames)
|
2304
2405
|
рекомендован:
|
2305
2406
|
|
2306
2407
|
```ruby
|
@@ -2325,7 +2426,7 @@ class MyAppTest < Minitest::Test
|
|
2325
2426
|
assert_equal 'Hello Frank!', last_response.body
|
2326
2427
|
end
|
2327
2428
|
|
2328
|
-
def
|
2429
|
+
def test_with_user_agent
|
2329
2430
|
get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
|
2330
2431
|
assert_equal "You're using Songbird!", last_response.body
|
2331
2432
|
end
|
@@ -2392,7 +2493,7 @@ end
|
|
2392
2493
|
logging true false
|
2393
2494
|
method_override true false
|
2394
2495
|
inline_templates true false
|
2395
|
-
static true
|
2496
|
+
static true File.exist?(public_folder)
|
2396
2497
|
|
2397
2498
|
### Запуск модульных приложений
|
2398
2499
|
|
@@ -2594,7 +2695,7 @@ end
|
|
2594
2695
|
* через объект, переданный блокам конфигурации (`configure { |c| ... }`);
|
2595
2696
|
* `settings` внутри области видимости запроса.
|
2596
2697
|
|
2597
|
-
### Область видимости
|
2698
|
+
### Область видимости запроса / экземпляра
|
2598
2699
|
|
2599
2700
|
Для каждого входящего запроса будет создан новый экземпляр вашего приложения,
|
2600
2701
|
и все блоки обработчика будут запущены в этом контексте. В этой области
|
@@ -2665,6 +2766,40 @@ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
|
|
2665
2766
|
-x # включить мьютекс-блокировку (по умолчанию выключена)
|
2666
2767
|
```
|
2667
2768
|
|
2769
|
+
### Multi-threading
|
2770
|
+
|
2771
|
+
_Данный раздел является перефразированным [ответом пользователя Konstantin][so-answer] на StackOverflow_
|
2772
|
+
|
2773
|
+
Sinatra не навязывает каких-либо моделей параллелизма, но для этих целей можно
|
2774
|
+
использовать любой Rack обработчик, например Thin, Puma или WEBrick. Сама
|
2775
|
+
по себе Sinatra потокобезопасна, поэтому нет никаких проблем в использовании
|
2776
|
+
поточной модели параллелизма в Rack обработчике. Это означает, что когда
|
2777
|
+
запускается сервер, вы должны указать правильный метод вызова для конкретного
|
2778
|
+
Rack обработчика. Пример ниже показывает, как можно запустить мультитредовый
|
2779
|
+
Thin сервер:
|
2780
|
+
|
2781
|
+
```ruby
|
2782
|
+
# app.rb
|
2783
|
+
|
2784
|
+
require 'sinatra/base'
|
2785
|
+
|
2786
|
+
class App < Sinatra::Base
|
2787
|
+
get '/' do
|
2788
|
+
"Hello, World"
|
2789
|
+
end
|
2790
|
+
end
|
2791
|
+
|
2792
|
+
App.run!
|
2793
|
+
```
|
2794
|
+
|
2795
|
+
Чтобы запустить сервер, вы должны выполнить следующую команду:
|
2796
|
+
|
2797
|
+
```shell
|
2798
|
+
thin --threaded start
|
2799
|
+
```
|
2800
|
+
|
2801
|
+
[so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
|
2802
|
+
|
2668
2803
|
## Системные требования
|
2669
2804
|
|
2670
2805
|
Следующие версии Ruby официально поддерживаются:
|
@@ -2747,7 +2882,7 @@ gem install sinatra --pre
|
|
2747
2882
|
### С помощью Bundler
|
2748
2883
|
|
2749
2884
|
Если вы хотите запускать свое приложение с последней версией Sinatra, то
|
2750
|
-
рекомендуем использовать [Bundler](http://
|
2885
|
+
рекомендуем использовать [Bundler](http://bundler.io).
|
2751
2886
|
|
2752
2887
|
Сначала установите Bundler, если у вас его еще нет:
|
2753
2888
|
|
@@ -2776,42 +2911,6 @@ Bundler автоматически скачает и добавит.
|
|
2776
2911
|
bundle exec ruby myapp.rb
|
2777
2912
|
```
|
2778
2913
|
|
2779
|
-
### Вручную
|
2780
|
-
|
2781
|
-
Создайте локальный клон репозитория и запускайте свое приложение с
|
2782
|
-
`sinatra/lib` директорией в `$LOAD_PATH`:
|
2783
|
-
|
2784
|
-
```
|
2785
|
-
cd myapp
|
2786
|
-
git clone git://github.com/sinatra/sinatra.git
|
2787
|
-
ruby -Isinatra/lib myapp.rb
|
2788
|
-
```
|
2789
|
-
|
2790
|
-
Чтобы обновить исходники Sinatra:
|
2791
|
-
|
2792
|
-
```
|
2793
|
-
cd myapp/sinatra
|
2794
|
-
git pull
|
2795
|
-
```
|
2796
|
-
|
2797
|
-
### Установка глобально
|
2798
|
-
|
2799
|
-
Вы можете самостоятельно собрать gem:
|
2800
|
-
|
2801
|
-
```
|
2802
|
-
git clone git://github.com/sinatra/sinatra.git
|
2803
|
-
cd sinatra
|
2804
|
-
rake sinatra.gemspec
|
2805
|
-
rake install
|
2806
|
-
```
|
2807
|
-
|
2808
|
-
Если вы устанавливаете пакеты (gem) от пользователя root, то вашим последним
|
2809
|
-
шагом должна быть команда
|
2810
|
-
|
2811
|
-
```
|
2812
|
-
sudo rake install
|
2813
|
-
```
|
2814
|
-
|
2815
2914
|
## Версии
|
2816
2915
|
|
2817
2916
|
Sinatra использует [Semantic Versioning](http://semver.org/), SemVer и
|
@@ -2823,13 +2922,15 @@ SemVerTag.
|
|
2823
2922
|
документация, новости и ссылки на другие ресурсы.
|
2824
2923
|
* [Участие в проекте](http://www.sinatrarb.com/contributing) — Обнаружили
|
2825
2924
|
баг? Нужна помощь? Написали патч?
|
2826
|
-
* [
|
2827
|
-
* [Twitter](
|
2925
|
+
* [Отслеживание проблем/ошибок](https://github.com/sinatra/sinatra/issues)
|
2926
|
+
* [Twitter](https://twitter.com/sinatra)
|
2828
2927
|
* [Группы рассылки](http://groups.google.com/group/sinatrarb/topics)
|
2829
|
-
* [#sinatra](irc://chat.freenode.net/#sinatra) на http://freenode.net
|
2928
|
+
* IRC: [#sinatra](irc://chat.freenode.net/#sinatra) на http://freenode.net
|
2929
|
+
* [Sinatra и Друзья](https://sinatrarb.slack.com) на Slack, а так же
|
2930
|
+
[ссылка](https://sinatra-slack.herokuapp.com/) для инвайта.
|
2830
2931
|
* [Sinatra Book](https://github.com/sinatra/sinatra-book/) учебник и сборник рецептов
|
2831
2932
|
* [Sinatra Recipes](http://recipes.sinatrarb.com/) сборник рецептов
|
2832
|
-
* API документация к [последнему релизу](http://rubydoc.info/gems/sinatra)
|
2833
|
-
или [текущему HEAD](http://rubydoc.info/github/sinatra/sinatra) на
|
2834
|
-
http://rubydoc.info
|
2835
|
-
* [Сервер непрерывной интеграции](
|
2933
|
+
* API документация к [последнему релизу](http://www.rubydoc.info/gems/sinatra)
|
2934
|
+
или [текущему HEAD](http://www.rubydoc.info/github/sinatra/sinatra) на
|
2935
|
+
http://www.rubydoc.info/
|
2936
|
+
* [Сервер непрерывной интеграции](https://travis-ci.org/sinatra/sinatra)
|