sinatra 2.0.0 → 2.0.1.rc1
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 +1 -0
- data/CHANGELOG.md +22 -2
- data/CONTRIBUTING.md +6 -0
- data/Gemfile +2 -1
- data/README.es.md +728 -347
- data/README.md +62 -49
- data/README.ru.md +546 -292
- data/README.zh.md +77 -15
- data/VERSION +1 -0
- data/lib/sinatra/base.rb +8 -6
- data/lib/sinatra/show_exceptions.rb +43 -11
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +2 -1
- metadata +8 -7
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Sinatra
|
2
2
|
|
3
|
-
[![Build Status](https://secure.travis-ci.org/sinatra/sinatra.svg)](
|
3
|
+
[![Build Status](https://secure.travis-ci.org/sinatra/sinatra.svg)](https://travis-ci.org/sinatra/sinatra)
|
4
4
|
|
5
5
|
Sinatra is a [DSL](https://en.wikipedia.org/wiki/Domain-specific_language) for
|
6
6
|
quickly creating web applications in Ruby with minimal effort:
|
@@ -28,6 +28,10 @@ ruby myapp.rb
|
|
28
28
|
|
29
29
|
View at: [http://localhost:4567](http://localhost:4567)
|
30
30
|
|
31
|
+
The code you changed will not take effect until you restart the server.
|
32
|
+
Please restart the server every time you change or use
|
33
|
+
[sinatra/reloader](http://www.sinatrarb.com/contrib/reloader).
|
34
|
+
|
31
35
|
It is recommended to also run `gem install thin`, which Sinatra will
|
32
36
|
pick up if available.
|
33
37
|
|
@@ -75,9 +79,9 @@ pick up if available.
|
|
75
79
|
* [Filters](#filters)
|
76
80
|
* [Helpers](#helpers)
|
77
81
|
* [Using Sessions](#using-sessions)
|
78
|
-
|
79
|
-
|
80
|
-
|
82
|
+
* [Session Secret Security](#session-secret-security)
|
83
|
+
* [Session Config](#session-config)
|
84
|
+
* [Choosing Your Own Session Middleware](#choosing-your-own-session-middleware)
|
81
85
|
* [Halting](#halting)
|
82
86
|
* [Passing](#passing)
|
83
87
|
* [Triggering Another Route](#triggering-another-route)
|
@@ -253,11 +257,11 @@ end
|
|
253
257
|
```
|
254
258
|
|
255
259
|
By the way, unless you disable the path traversal attack protection (see
|
256
|
-
below), the request path might be modified before
|
257
|
-
routes.
|
260
|
+
[below](#configuring-attack-protection)), the request path might be modified before
|
261
|
+
matching against your routes.
|
258
262
|
|
259
|
-
You may customize the Mustermann
|
260
|
-
`:mustermann_opts` hash:
|
263
|
+
You may customize the [Mustermann](https://github.com/sinatra/mustermann#readme)
|
264
|
+
options used for a given route by passing in a `:mustermann_opts` hash:
|
261
265
|
|
262
266
|
```ruby
|
263
267
|
get '\A/posts\z', :mustermann_opts => { :type => :regexp, :check_anchors => false } do
|
@@ -365,7 +369,7 @@ end
|
|
365
369
|
get('/') { Stream.new }
|
366
370
|
```
|
367
371
|
|
368
|
-
You can also use the `stream` helper method (described below) to reduce
|
372
|
+
You can also use the `stream` helper method ([described below](#streaming-responses)) to reduce
|
369
373
|
boiler plate and embed the streaming logic in the route.
|
370
374
|
|
371
375
|
## Custom Route Matchers
|
@@ -428,7 +432,7 @@ Note that the public directory name is not included in the URL. A file
|
|
428
432
|
`./public/css/style.css` is made available as
|
429
433
|
`http://example.com/css/style.css`.
|
430
434
|
|
431
|
-
Use the `:static_cache_control` setting (see below) to add
|
435
|
+
Use the `:static_cache_control` setting (see [below](#cache-control)) to add
|
432
436
|
`Cache-Control` header info.
|
433
437
|
|
434
438
|
## Views / Templates
|
@@ -638,7 +642,7 @@ get('/') { markdown :index }
|
|
638
642
|
</tr>
|
639
643
|
</table>
|
640
644
|
|
641
|
-
It also takes a block for inline templates (see example).
|
645
|
+
It also takes a block for inline templates (see [example](#inline-templates)).
|
642
646
|
|
643
647
|
#### Nokogiri Templates
|
644
648
|
|
@@ -657,14 +661,14 @@ It also takes a block for inline templates (see example).
|
|
657
661
|
</tr>
|
658
662
|
</table>
|
659
663
|
|
660
|
-
It also takes a block for inline templates (see example).
|
664
|
+
It also takes a block for inline templates (see [example](#inline-templates)).
|
661
665
|
|
662
666
|
#### Sass Templates
|
663
667
|
|
664
668
|
<table>
|
665
669
|
<tr>
|
666
670
|
<td>Dependency</td>
|
667
|
-
<td><a href="
|
671
|
+
<td><a href="https://sass-lang.com/" title="sass">sass</a></td>
|
668
672
|
</tr>
|
669
673
|
<tr>
|
670
674
|
<td>File Extension</td>
|
@@ -681,7 +685,7 @@ It also takes a block for inline templates (see example).
|
|
681
685
|
<table>
|
682
686
|
<tr>
|
683
687
|
<td>Dependency</td>
|
684
|
-
<td><a href="
|
688
|
+
<td><a href="https://sass-lang.com/" title="sass">sass</a></td>
|
685
689
|
</tr>
|
686
690
|
<tr>
|
687
691
|
<td>File Extension</td>
|
@@ -739,8 +743,8 @@ template, you almost always want to pass locals to it.
|
|
739
743
|
Anyone of:
|
740
744
|
<a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
|
741
745
|
<a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
|
742
|
-
<a href="
|
743
|
-
<a href="
|
746
|
+
<a href="https://github.com/ged/bluecloth" title="BlueCloth">BlueCloth</a>,
|
747
|
+
<a href="https://kramdown.gettalong.org/" title="kramdown">kramdown</a>,
|
744
748
|
<a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
|
745
749
|
</td>
|
746
750
|
</tr>
|
@@ -890,7 +894,7 @@ almost always want to pass locals to it.
|
|
890
894
|
<table>
|
891
895
|
<tr>
|
892
896
|
<td>Dependency</td>
|
893
|
-
<td><a href="
|
897
|
+
<td><a href="https://markaby.github.io/" title="Markaby">Markaby</a></td>
|
894
898
|
</tr>
|
895
899
|
<tr>
|
896
900
|
<td>File Extension</td>
|
@@ -902,7 +906,7 @@ almost always want to pass locals to it.
|
|
902
906
|
</tr>
|
903
907
|
</table>
|
904
908
|
|
905
|
-
It also takes a block for inline templates (see example).
|
909
|
+
It also takes a block for inline templates (see [example](#inline-templates)).
|
906
910
|
|
907
911
|
#### RABL Templates
|
908
912
|
|
@@ -1019,7 +1023,7 @@ template than for the layout by passing the `:layout_engine` option.
|
|
1019
1023
|
<a href="https://github.com/josh/ruby-coffee-script" title="Ruby CoffeeScript">
|
1020
1024
|
CoffeeScript
|
1021
1025
|
</a> and a
|
1022
|
-
<a href="https://github.com/sstephenson/execjs
|
1026
|
+
<a href="https://github.com/sstephenson/execjs" title="ExecJS">
|
1023
1027
|
way to execute javascript
|
1024
1028
|
</a>
|
1025
1029
|
</td>
|
@@ -1043,7 +1047,7 @@ template than for the layout by passing the `:layout_engine` option.
|
|
1043
1047
|
<a href="https://github.com/forgecrafted/ruby-stylus" title="Ruby Stylus">
|
1044
1048
|
Stylus
|
1045
1049
|
</a> and a
|
1046
|
-
<a href="https://github.com/sstephenson/execjs
|
1050
|
+
<a href="https://github.com/sstephenson/execjs" title="ExecJS">
|
1047
1051
|
way to execute javascript
|
1048
1052
|
</a>
|
1049
1053
|
</td>
|
@@ -1117,7 +1121,7 @@ present(resource);
|
|
1117
1121
|
<table>
|
1118
1122
|
<tr>
|
1119
1123
|
<td>Dependency</td>
|
1120
|
-
<td><a href="https://github.com/blambeau/wlang
|
1124
|
+
<td><a href="https://github.com/blambeau/wlang" title="WLang">WLang</a></td>
|
1121
1125
|
</tr>
|
1122
1126
|
<tr>
|
1123
1127
|
<td>File Extension</td>
|
@@ -1273,8 +1277,8 @@ get '/' do
|
|
1273
1277
|
end
|
1274
1278
|
```
|
1275
1279
|
|
1276
|
-
Renders `./views/index.myat`.
|
1277
|
-
|
1280
|
+
Renders `./views/index.myat`. Learn more about
|
1281
|
+
[Tilt](https://github.com/rtomayko/tilt#readme).
|
1278
1282
|
|
1279
1283
|
### Using Custom Logic for Template Lookup
|
1280
1284
|
|
@@ -1435,8 +1439,8 @@ $ ruby -e "require 'securerandom'; puts SecureRandom.hex(64)"
|
|
1435
1439
|
|
1436
1440
|
**Session Secret Generation (Bonus Points)**
|
1437
1441
|
|
1438
|
-
Use the [sysrandom gem](https://github.com/cryptosphere/sysrandom) to
|
1439
|
-
use of system RNG facilities to generate random values instead of
|
1442
|
+
Use the [sysrandom gem](https://github.com/cryptosphere/sysrandom#readme) to
|
1443
|
+
prefer use of system RNG facilities to generate random values instead of
|
1440
1444
|
userspace `OpenSSL` which MRI Ruby currently defaults to:
|
1441
1445
|
|
1442
1446
|
```text
|
@@ -1466,7 +1470,7 @@ Setup your app config to fail-safe to a secure random secret
|
|
1466
1470
|
if the `SESSION_SECRET` environment variable is not available.
|
1467
1471
|
|
1468
1472
|
For bonus points use the [sysrandom
|
1469
|
-
gem](https://github.com/cryptosphere/sysrandom) here as well:
|
1473
|
+
gem](https://github.com/cryptosphere/sysrandom#readme) here as well:
|
1470
1474
|
|
1471
1475
|
```ruby
|
1472
1476
|
require 'securerandom'
|
@@ -1523,7 +1527,7 @@ use Rack::Protection::RemoteToken
|
|
1523
1527
|
use Rack::Protection::SessionHijacking
|
1524
1528
|
```
|
1525
1529
|
|
1526
|
-
See 'Configuring attack protection' for more information.
|
1530
|
+
See '[Configuring attack protection](#configuring-attack-protection)' for more information.
|
1527
1531
|
|
1528
1532
|
### Halting
|
1529
1533
|
|
@@ -1625,7 +1629,7 @@ end
|
|
1625
1629
|
```
|
1626
1630
|
|
1627
1631
|
It is also possible to pass a block to `body`, which will be executed by the
|
1628
|
-
Rack handler (this can be used to implement streaming, see "Return Values").
|
1632
|
+
Rack handler (this can be used to implement streaming, [see "Return Values"](#return-values)).
|
1629
1633
|
|
1630
1634
|
Similar to the body, you can also set the status code and headers:
|
1631
1635
|
|
@@ -1634,7 +1638,7 @@ get '/foo' do
|
|
1634
1638
|
status 418
|
1635
1639
|
headers \
|
1636
1640
|
"Allow" => "BREW, POST, GET, PROPFIND, WHEN",
|
1637
|
-
"Refresh" => "Refresh: 20;
|
1641
|
+
"Refresh" => "Refresh: 20; https://ietf.org/rfc/rfc2324.txt"
|
1638
1642
|
body "I'm a tea pot!"
|
1639
1643
|
end
|
1640
1644
|
```
|
@@ -1773,7 +1777,7 @@ Haml:
|
|
1773
1777
|
|
1774
1778
|
It takes reverse proxies and Rack routers into account, if present.
|
1775
1779
|
|
1776
|
-
This method is also aliased to `to` (see below for an example).
|
1780
|
+
This method is also aliased to `to` (see [below](#browser-redirect) for an example).
|
1777
1781
|
|
1778
1782
|
### Browser Redirect
|
1779
1783
|
|
@@ -1881,7 +1885,7 @@ etag @article.sha1, :weak
|
|
1881
1885
|
These helpers will not do any caching for you, but rather feed the necessary
|
1882
1886
|
information to your cache. If you are looking for a quick
|
1883
1887
|
reverse-proxy caching solution, try
|
1884
|
-
[rack-cache](https://github.com/rtomayko/rack-cache):
|
1888
|
+
[rack-cache](https://github.com/rtomayko/rack-cache#readme):
|
1885
1889
|
|
1886
1890
|
```ruby
|
1887
1891
|
require "rack/cache"
|
@@ -1896,7 +1900,7 @@ get '/' do
|
|
1896
1900
|
end
|
1897
1901
|
```
|
1898
1902
|
|
1899
|
-
Use the `:static_cache_control` setting (see below) to add
|
1903
|
+
Use the `:static_cache_control` setting (see [below](#cache-control)) to add
|
1900
1904
|
`Cache-Control` header info to static files.
|
1901
1905
|
|
1902
1906
|
According to RFC 2616, your application should behave differently if the
|
@@ -2208,7 +2212,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
2208
2212
|
```
|
2209
2213
|
|
2210
2214
|
By default, Sinatra will only set up session based protection if `:sessions`
|
2211
|
-
have been enabled. See 'Using Sessions'. Sometimes you may want to set up
|
2215
|
+
have been enabled. See '[Using Sessions](#using-sessions)'. Sometimes you may want to set up
|
2212
2216
|
sessions "outside" of the Sinatra app, such as in the config.ru or with a
|
2213
2217
|
separate `Rack::Builder` instance. In that case you can still set up session
|
2214
2218
|
based protection by passing the `:session` option:
|
@@ -2353,6 +2357,16 @@ set :protection, :session => true
|
|
2353
2357
|
priority, default depends on Ruby implementation.
|
2354
2358
|
</dd>
|
2355
2359
|
|
2360
|
+
<dt>server_settings</dt>
|
2361
|
+
<dd>
|
2362
|
+
If you are using a WEBrick web server, presumably for your development
|
2363
|
+
environment, you can pass a hash of options to <tt>server_settings</tt>,
|
2364
|
+
such as <tt>SSLEnable</tt> or <tt>SSLVerifyClient</tt>. However, web
|
2365
|
+
servers such as Puma and Thin do not support this, so you can set
|
2366
|
+
<tt>server_settings</tt> by defining it as a method when you call
|
2367
|
+
<tt>configure</tt>.
|
2368
|
+
</dd>
|
2369
|
+
|
2356
2370
|
<dt>sessions</dt>
|
2357
2371
|
<dd>
|
2358
2372
|
Enable cookie-based sessions support using
|
@@ -2531,7 +2545,7 @@ and additional debugging information in your browser.
|
|
2531
2545
|
|
2532
2546
|
## Rack Middleware
|
2533
2547
|
|
2534
|
-
Sinatra rides on [Rack](
|
2548
|
+
Sinatra rides on [Rack](https://rack.github.io/), a minimal standard
|
2535
2549
|
interface for Ruby web frameworks. One of Rack's most interesting
|
2536
2550
|
capabilities for application developers is support for "middleware" --
|
2537
2551
|
components that sit between the server and your application monitoring
|
@@ -2571,7 +2585,7 @@ typically don't have to `use` them explicitly.
|
|
2571
2585
|
|
2572
2586
|
You can find useful middleware in
|
2573
2587
|
[rack](https://github.com/rack/rack/tree/master/lib/rack),
|
2574
|
-
[rack-contrib](https://github.com/rack/rack-contrib#
|
2588
|
+
[rack-contrib](https://github.com/rack/rack-contrib#readme),
|
2575
2589
|
or in the [Rack wiki](https://github.com/rack/rack/wiki/List-of-Middleware).
|
2576
2590
|
|
2577
2591
|
## Testing
|
@@ -2995,7 +3009,9 @@ Options are:
|
|
2995
3009
|
|
2996
3010
|
### Multi-threading
|
2997
3011
|
|
2998
|
-
_Paraphrasing from
|
3012
|
+
_Paraphrasing from
|
3013
|
+
[this StackOverflow answer](https://stackoverflow.com/a/6282999/5245129)
|
3014
|
+
by Konstantin_
|
2999
3015
|
|
3000
3016
|
Sinatra doesn't impose any concurrency model, but leaves that to the
|
3001
3017
|
underlying Rack handler (server) like Thin, Puma or WEBrick. Sinatra
|
@@ -3026,9 +3042,6 @@ To start the server, the command would be:
|
|
3026
3042
|
thin --threaded start
|
3027
3043
|
```
|
3028
3044
|
|
3029
|
-
|
3030
|
-
[so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
|
3031
|
-
|
3032
3045
|
## Requirement
|
3033
3046
|
|
3034
3047
|
The following Ruby versions are officially supported:
|
@@ -3097,7 +3110,7 @@ to get some of the latest features.
|
|
3097
3110
|
### With Bundler
|
3098
3111
|
|
3099
3112
|
If you want to run your application with the latest Sinatra, using
|
3100
|
-
[Bundler](
|
3113
|
+
[Bundler](https://bundler.io) is the recommended way.
|
3101
3114
|
|
3102
3115
|
First, install bundler, if you haven't:
|
3103
3116
|
|
@@ -3127,7 +3140,7 @@ bundle exec ruby myapp.rb
|
|
3127
3140
|
|
3128
3141
|
## Versioning
|
3129
3142
|
|
3130
|
-
Sinatra follows [Semantic Versioning](
|
3143
|
+
Sinatra follows [Semantic Versioning](https://semver.org/), both SemVer and
|
3131
3144
|
SemVerTag.
|
3132
3145
|
|
3133
3146
|
## Further Reading
|
@@ -3138,14 +3151,14 @@ SemVerTag.
|
|
3138
3151
|
help? Have a patch?
|
3139
3152
|
* [Issue tracker](https://github.com/sinatra/sinatra/issues)
|
3140
3153
|
* [Twitter](https://twitter.com/sinatra)
|
3141
|
-
* [Mailing List](
|
3142
|
-
* IRC: [#sinatra](irc://chat.freenode.net/#sinatra) on
|
3143
|
-
* [Sinatra & Friends](https://sinatrarb.slack.com) on Slack
|
3144
|
-
[
|
3145
|
-
* [Sinatra Book](https://github.com/sinatra/sinatra-book
|
3146
|
-
* [Sinatra Recipes](http://recipes.sinatrarb.com/) Community
|
3147
|
-
|
3154
|
+
* [Mailing List](https://groups.google.com/forum/#!forum/sinatrarb)
|
3155
|
+
* IRC: [#sinatra](irc://chat.freenode.net/#sinatra) on [Freenode](https://freenode.net)
|
3156
|
+
* [Sinatra & Friends](https://sinatrarb.slack.com) on Slack
|
3157
|
+
([get an invite](https://sinatra-slack.herokuapp.com/))
|
3158
|
+
* [Sinatra Book](https://github.com/sinatra/sinatra-book) - Cookbook Tutorial
|
3159
|
+
* [Sinatra Recipes](http://recipes.sinatrarb.com/) - Community contributed
|
3160
|
+
recipes
|
3148
3161
|
* API documentation for the [latest release](http://www.rubydoc.info/gems/sinatra)
|
3149
3162
|
or the [current HEAD](http://www.rubydoc.info/github/sinatra/sinatra) on
|
3150
|
-
http://www.rubydoc.info/
|
3163
|
+
[RubyDoc](http://www.rubydoc.info/)
|
3151
3164
|
* [CI server](https://travis-ci.org/sinatra/sinatra)
|
data/README.ru.md
CHANGED
@@ -1,12 +1,49 @@
|
|
1
1
|
# Sinatra
|
2
2
|
|
3
|
+
[![Build Status](https://secure.travis-ci.org/sinatra/sinatra.svg)](http://travis-ci.org/sinatra/sinatra)
|
4
|
+
|
5
|
+
*Внимание: Этот документ является переводом английской версии и может быть
|
6
|
+
устаревшим*
|
7
|
+
|
8
|
+
Sinatra — это предметно-ориентированный каркас
|
9
|
+
([DSL](https://ru.wikipedia.org/wiki/Предметно-ориентированный_язык))
|
10
|
+
для быстрого создания функциональных веб-приложений на Ruby с минимумом усилий:
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
# myapp.rb
|
14
|
+
require 'sinatra'
|
15
|
+
|
16
|
+
get '/' do
|
17
|
+
'Hello world!'
|
18
|
+
end
|
19
|
+
```
|
20
|
+
|
21
|
+
Установите gem:
|
22
|
+
|
23
|
+
```shell
|
24
|
+
gem install sinatra
|
25
|
+
```
|
26
|
+
|
27
|
+
и запустите приложение с помощью:
|
28
|
+
|
29
|
+
```shell
|
30
|
+
ruby myapp.rb
|
31
|
+
```
|
32
|
+
|
33
|
+
Оцените результат: [http://localhost:4567](http://localhost:4567)
|
34
|
+
|
35
|
+
Рекомендуется также установить Thin, сделать это можно командой: `gem install
|
36
|
+
thin`. Thin — это более производительный и функциональный сервер для
|
37
|
+
разработки приложений на Sinatra.
|
38
|
+
|
3
39
|
## Содержание
|
4
40
|
|
5
41
|
* [Sinatra](#sinatra)
|
42
|
+
* [Содержание](#Содержание)
|
6
43
|
* [Маршруты](#Маршруты)
|
7
|
-
|
8
|
-
|
9
|
-
|
44
|
+
* [Условия](#Условия)
|
45
|
+
* [Возвращаемые значения](#Возвращаемые-значения)
|
46
|
+
* [Собственные детекторы совпадений для маршрутов](#Собственные-детекторы-совпадений-для-маршрутов)
|
10
47
|
* [Статические файлы](#Статические-файлы)
|
11
48
|
* [Представления / Шаблоны](#Представления--Шаблоны)
|
12
49
|
* [Буквальные шаблоны](#Буквальные-шаблоны)
|
@@ -39,14 +76,17 @@
|
|
39
76
|
* [Именованные шаблоны](#Именованные-шаблоны)
|
40
77
|
* [Привязка файловых расширений](#Привязка-файловых-расширений)
|
41
78
|
* [Добавление собственного движка рендеринга](#Добавление-собственного-движка-рендеринга)
|
79
|
+
* [Использование пользовательской логики для поиска шаблона](#Использование-пользовательской-логики-для-поиска-шаблона)
|
42
80
|
* [Фильтры](#Фильтры)
|
43
81
|
* [Методы-помощники](#Методы-помощники)
|
44
82
|
* [Использование сессий](#Использование-сессий)
|
83
|
+
* [Секретная безопасность сессии](#Секретная-безопасность-сессии)
|
84
|
+
* [Конфигурация сессии](#Конфигурация-сессии)
|
45
85
|
* [Выбор вашей собственной "прослойки" сессии](#Выбор-вашей-собственной-прослойки-сессий)
|
46
86
|
* [Прерывание](#Прерывание)
|
47
87
|
* [Передача](#Передача)
|
48
88
|
* [Вызов другого маршрута](#Вызов-другого-маршрута)
|
49
|
-
* [Задание тела, кода и заголовков ответа](
|
89
|
+
* [Задание тела, статус кода и заголовков ответа](#Задание-тела-статуса-кода-и-заголовков-ответа)
|
50
90
|
* [Стриминг ответов](#Стриминг-ответов)
|
51
91
|
* [Логирование](#Логирование)
|
52
92
|
* [Mime-типы](#mime-типы)
|
@@ -79,47 +119,13 @@
|
|
79
119
|
* [Область видимости запроса / экземпляра](#Область-видимости-запроса--экземпляра)
|
80
120
|
* [Область видимости делегирования](#Область-видимости-делегирования)
|
81
121
|
* [Командная строка](#Командная-строка)
|
82
|
-
* [
|
122
|
+
* [Многопоточность](#Многопоточность)
|
83
123
|
* [Системные требования](#Системные-требования)
|
84
124
|
* [На острие](#На-острие)
|
85
125
|
* [С помощью Bundler](#С-помощью-bundler)
|
86
126
|
* [Версии](#Версии)
|
87
127
|
* [Дальнейшее чтение](#Дальнейшее-чтение)
|
88
128
|
|
89
|
-
*Внимание: Этот документ является переводом английской версии и может быть
|
90
|
-
устаревшим*
|
91
|
-
|
92
|
-
Sinatra — это предметно-ориентированный каркас
|
93
|
-
([DSL](https://ru.wikipedia.org/wiki/Предметно-ориентированный_язык))
|
94
|
-
для быстрого создания функциональных веб-приложений на Ruby с минимумом усилий:
|
95
|
-
|
96
|
-
```ruby
|
97
|
-
# myapp.rb
|
98
|
-
require 'sinatra'
|
99
|
-
|
100
|
-
get '/' do
|
101
|
-
'Hello world!'
|
102
|
-
end
|
103
|
-
```
|
104
|
-
|
105
|
-
Установите gem:
|
106
|
-
|
107
|
-
```shell
|
108
|
-
gem install sinatra
|
109
|
-
```
|
110
|
-
|
111
|
-
и запустите приложение с помощью:
|
112
|
-
|
113
|
-
```shell
|
114
|
-
ruby myapp.rb
|
115
|
-
```
|
116
|
-
|
117
|
-
Оцените результат: [http://localhost:4567](http://localhost:4567)
|
118
|
-
|
119
|
-
Рекомендуется также установить Thin, сделать это можно командой: `gem install
|
120
|
-
thin`. Thin — это более производительный и функциональный сервер для
|
121
|
-
разработки приложений на Sinatra.
|
122
|
-
|
123
129
|
## Маршруты
|
124
130
|
|
125
131
|
В Sinatra маршрут — это пара: <HTTP метод> и <шаблон URL>. Каждый маршрут
|
@@ -151,32 +157,43 @@ options '/' do
|
|
151
157
|
end
|
152
158
|
|
153
159
|
link '/' do
|
154
|
-
.. что-то подключить ..
|
160
|
+
# .. что-то подключить ..
|
155
161
|
end
|
156
162
|
|
157
163
|
unlink '/' do
|
158
|
-
.. что-то отключить ..
|
164
|
+
# .. что-то отключить ..
|
159
165
|
end
|
160
166
|
```
|
161
167
|
|
162
168
|
Маршруты сверяются с запросом в порядке очередности их записи в файле
|
163
169
|
приложения. Первый же совпавший с запросом маршрут и будет вызван.
|
164
170
|
|
171
|
+
Маршруты с конечным слэшем отличаются от маршрутов без него:
|
172
|
+
|
173
|
+
```ruby
|
174
|
+
get '/foo' do
|
175
|
+
# не соответствует "GET /foo/"
|
176
|
+
end
|
177
|
+
```
|
178
|
+
|
165
179
|
Шаблоны маршрутов могут включать в себя именованные параметры, доступные в xэше
|
166
180
|
`params`:
|
167
181
|
|
168
182
|
```ruby
|
169
183
|
get '/hello/:name' do
|
170
184
|
# соответствует "GET /hello/foo" и "GET /hello/bar",
|
171
|
-
# где params['name'] 'foo' или 'bar'
|
185
|
+
# где params['name'] - это 'foo' или 'bar'
|
172
186
|
"Hello #{params['name']}!"
|
173
187
|
end
|
174
188
|
```
|
175
189
|
|
176
|
-
Также можно
|
190
|
+
Также можно получить доступ к именованным параметрам через параметры блока:
|
177
191
|
|
178
192
|
```ruby
|
179
193
|
get '/hello/:name' do |n|
|
194
|
+
# соответствует "GET /hello/foo" и "GET /hello/bar",
|
195
|
+
# где params['name'] - это 'foo' или 'bar'
|
196
|
+
# n хранит params['name']
|
180
197
|
"Hello #{n}!"
|
181
198
|
end
|
182
199
|
```
|
@@ -215,7 +232,7 @@ end
|
|
215
232
|
Или с параметром блока:
|
216
233
|
|
217
234
|
```ruby
|
218
|
-
#
|
235
|
+
# Соответствует "GET /meta/hello/world", "GET /hello/world/1234" и т.д.
|
219
236
|
get %r{/hello/([\w]+)} do |c|
|
220
237
|
"Hello, #{c}!"
|
221
238
|
end
|
@@ -229,10 +246,33 @@ get '/posts/:format?' do
|
|
229
246
|
end
|
230
247
|
```
|
231
248
|
|
249
|
+
Маршруты также могут использовать параметры запроса:
|
250
|
+
|
251
|
+
```ruby
|
252
|
+
get '/posts' do
|
253
|
+
# соответствует "GET /posts?title=foo&author=bar"
|
254
|
+
title = params['title']
|
255
|
+
author = params['author']
|
256
|
+
# используются переменные title и author; запрос не обязателен для маршрута /posts
|
257
|
+
end
|
258
|
+
```
|
259
|
+
|
232
260
|
Кстати, если вы не отключите защиту от обратного пути в директориях (path
|
233
261
|
traversal, см. ниже), путь запроса может быть изменен до начала поиска
|
234
262
|
подходящего маршрута.
|
235
263
|
|
264
|
+
Вы можете настроить Mustermann опции, используемые для данного маршрута, путём передачи в `:mustermann_opts` хэш:
|
265
|
+
|
266
|
+
```ruby
|
267
|
+
get '\A/posts\z', :mustermann_opts => { :type => :regexp, :check_anchors => false } do
|
268
|
+
# в точности соответствует /posts, с явной привязкой
|
269
|
+
"If you match an anchored pattern clap your hands!"
|
270
|
+
end
|
271
|
+
```
|
272
|
+
|
273
|
+
Это похоже на [условие](#Условия), но это не так! Эти опции будут объеденины в глобальный `:mustermann_opts` хэш, описанный
|
274
|
+
[ниже](#Доступные-настройки).
|
275
|
+
|
236
276
|
### Условия
|
237
277
|
|
238
278
|
Маршруты могут включать различные условия совпадений, например, клиентское
|
@@ -263,6 +303,7 @@ get '/', :provides => ['rss', 'atom', 'xml'] do
|
|
263
303
|
builder :feed
|
264
304
|
end
|
265
305
|
```
|
306
|
+
`provides` ищет заголовок запроса `Accept`.
|
266
307
|
|
267
308
|
Вы можете задать собственные условия:
|
268
309
|
|
@@ -306,7 +347,7 @@ end
|
|
306
347
|
другие значения.
|
307
348
|
|
308
349
|
Вы можете вернуть любой объект, который будет либо корректным Rack ответом,
|
309
|
-
объектом Rack body, либо кодом состояния HTTP:
|
350
|
+
либо объектом Rack body, либо кодом состояния HTTP:
|
310
351
|
|
311
352
|
* массив с тремя переменными: `[код (Fixnum), заголовки (Hash), тело ответа
|
312
353
|
(должно отвечать на #each)]`;
|
@@ -330,8 +371,8 @@ get('/') { Stream.new }
|
|
330
371
|
```
|
331
372
|
|
332
373
|
Вы также можете использовать метод `stream` (описываемый ниже), чтобы
|
333
|
-
уменьшить количество
|
334
|
-
|
374
|
+
уменьшить количество шаблонного кода и встраивать поточную логику прямо в
|
375
|
+
маршрут.
|
335
376
|
|
336
377
|
### Собственные детекторы совпадений для маршрутов
|
337
378
|
|
@@ -497,6 +538,12 @@ end
|
|
497
538
|
лэйаутов. По умолчанию: тот же шаблонизатор, что используется и для самого
|
498
539
|
шаблона. Пример: <tt>set :rdoc, :layout_engine => :erb</tt>
|
499
540
|
</dd>
|
541
|
+
|
542
|
+
<dt>layout_options</dt>
|
543
|
+
<dd>
|
544
|
+
Специальные опции, используемые только для рендеринга лэйаута. Например:
|
545
|
+
<tt>set :rdoc, :layout_options => { :views => 'views/layouts' }</tt>
|
546
|
+
</dd>
|
500
547
|
</dl>
|
501
548
|
|
502
549
|
По умолчанию считается, что шаблоны находятся в директории `./views`. Чтобы
|
@@ -519,7 +566,15 @@ get '/' do
|
|
519
566
|
end
|
520
567
|
```
|
521
568
|
|
522
|
-
Отобразит шаблон, переданный строкой.
|
569
|
+
Отобразит шаблон, переданный строкой. Опционально, можно задать `:path` и
|
570
|
+
`:line` для более понятного бэктрейса, в случае, если существует путь к
|
571
|
+
файловой системе и линия, которые ассоциируются с этой строкой:
|
572
|
+
|
573
|
+
```ruby
|
574
|
+
get '/' do
|
575
|
+
haml '%div.title Hello World', :path => 'examples/file.haml', :line => 3
|
576
|
+
end
|
577
|
+
```
|
523
578
|
|
524
579
|
### Доступные шаблонизаторы
|
525
580
|
|
@@ -1117,9 +1172,9 @@ end
|
|
1117
1172
|
как описано выше, либо он может быть дополнен блоком:
|
1118
1173
|
|
1119
1174
|
```ruby
|
1120
|
-
|
1121
|
-
|
1122
|
-
|
1175
|
+
erb :post, :layout => false do
|
1176
|
+
erb :index
|
1177
|
+
end
|
1123
1178
|
```
|
1124
1179
|
|
1125
1180
|
Эти инструкции в основном эквивалентны `erb :index, :layout => :post`.
|
@@ -1128,19 +1183,19 @@ end
|
|
1128
1183
|
создания вложенных раскладок:
|
1129
1184
|
|
1130
1185
|
```ruby
|
1131
|
-
|
1132
|
-
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1186
|
+
erb :main_layout, :layout => false do
|
1187
|
+
erb :admin_layout do
|
1188
|
+
erb :user
|
1189
|
+
end
|
1190
|
+
end
|
1136
1191
|
```
|
1137
1192
|
|
1138
1193
|
Это же самое может быть сделано короче:
|
1139
1194
|
|
1140
1195
|
```ruby
|
1141
|
-
|
1142
|
-
|
1143
|
-
|
1196
|
+
erb :admin_layout, :layout => :main_layout do
|
1197
|
+
erb :user
|
1198
|
+
end
|
1144
1199
|
```
|
1145
1200
|
|
1146
1201
|
В настоящее время, следующие интерпретирующие шаблоны методы
|
@@ -1232,6 +1287,23 @@ end
|
|
1232
1287
|
Отобразит `./views/index.myat`. Чтобы узнать больше о Tilt, смотрите
|
1233
1288
|
https://github.com/rtomayko/tilt
|
1234
1289
|
|
1290
|
+
### Использование пользовательской логики для поиска шаблона
|
1291
|
+
|
1292
|
+
Для того, чтобы реализовать свой собственный механизм поиска шаблона,
|
1293
|
+
необходимо написать свой собственный `#find_template` метод:
|
1294
|
+
|
1295
|
+
```ruby
|
1296
|
+
configure do
|
1297
|
+
set :views [ './views/a', './views/b' ]
|
1298
|
+
end
|
1299
|
+
|
1300
|
+
def find_template(views, name, engine, &block)
|
1301
|
+
Array(views).each do |v|
|
1302
|
+
super(v, name, engine, &block)
|
1303
|
+
end
|
1304
|
+
end
|
1305
|
+
```
|
1306
|
+
|
1235
1307
|
## Фильтры
|
1236
1308
|
|
1237
1309
|
`before`-фильтры выполняются перед каждым запросом в том же контексте, что и
|
@@ -1274,7 +1346,7 @@ before '/protected/*' do
|
|
1274
1346
|
end
|
1275
1347
|
|
1276
1348
|
after '/create/:slug' do |slug|
|
1277
|
-
session[
|
1349
|
+
session[:last_slug] = slug
|
1278
1350
|
end
|
1279
1351
|
```
|
1280
1352
|
|
@@ -1292,8 +1364,8 @@ end
|
|
1292
1364
|
|
1293
1365
|
## Методы-помощники
|
1294
1366
|
|
1295
|
-
Используйте метод `helpers`, чтобы определить
|
1296
|
-
|
1367
|
+
Используйте высокоуровневый метод `helpers`, чтобы определить
|
1368
|
+
методы-помощники для использования в обработчиках маршрутов и шаблонах:
|
1297
1369
|
|
1298
1370
|
```ruby
|
1299
1371
|
helpers do
|
@@ -1332,7 +1404,7 @@ helpers FooUtils, BarUtils
|
|
1332
1404
|
enable :sessions
|
1333
1405
|
|
1334
1406
|
get '/' do
|
1335
|
-
"value = " << session[
|
1407
|
+
"value = " << session[:value].inspect
|
1336
1408
|
end
|
1337
1409
|
|
1338
1410
|
get '/:value' do
|
@@ -1340,16 +1412,83 @@ get '/:value' do
|
|
1340
1412
|
end
|
1341
1413
|
```
|
1342
1414
|
|
1343
|
-
|
1344
|
-
|
1345
|
-
|
1346
|
-
|
1347
|
-
|
1415
|
+
### Секретная безопасность сессии
|
1416
|
+
|
1417
|
+
Чтобы повысить безопасность, данные сессии в файле 'cookie' подписываются
|
1418
|
+
ключом сессии с использованием `HMAC-SHA1`. Этот ключ сессии должен быть
|
1419
|
+
оптимальным криптографическим 'secure random' значением соответствующей
|
1420
|
+
длины, которая для `HMAC-SHA1` больше или равна 64 байтам (512 бит, 128
|
1421
|
+
шестнадцатеричных символов). Не рекомендуется использовать ключ, длина
|
1422
|
+
которого менее 32 байт (256 бит, 64 шестнадцатеричных символа). Поэтому
|
1423
|
+
**очень важно**, чтобы вы не просто составили значение ключа, а использовали
|
1424
|
+
генератор 'secure random' чисел для его создания. Люди очень плохо генерируют
|
1425
|
+
случайные значения.
|
1426
|
+
|
1427
|
+
По умолчанию, Sinatra создаёт для вас 'secure random' ключ сессии из 32 байт,
|
1428
|
+
но он будет меняться при каждом перезапуске приложения. Если у вас есть
|
1429
|
+
несколько экземпляров вашего приложения, и вы позволяете чтобы Sinatra
|
1430
|
+
генерировала ключ, то каждый экземпляр будет иметь отличный ключ сессии,
|
1431
|
+
который, вероятно, не тот, который вы хотите.
|
1432
|
+
|
1433
|
+
Для лучшей безопасности и удобства использования
|
1434
|
+
[рекомендуется](https://12factor.net/config) генерировать 'secure random'
|
1435
|
+
ключ и хранить его в переменной среды на каждом хосте, на котором запущено
|
1436
|
+
приложение, чтобы все экземпляры вашего приложения использовали один и тот
|
1437
|
+
же ключ. Вы должны периодически менять значение ключа сессии.
|
1438
|
+
Вот несколько примеров того, как вы можете создать ключ на 64 байта
|
1439
|
+
и установить его:
|
1440
|
+
|
1441
|
+
**Генерация ключа сессии**
|
1442
|
+
|
1443
|
+
```text
|
1444
|
+
$ ruby -e "require 'securerandom'; puts SecureRandom.hex(64)"
|
1445
|
+
99ae8af...snip...ec0f262ac
|
1446
|
+
```
|
1447
|
+
|
1448
|
+
**Генерация ключа сессии (бонусные пункты)**
|
1449
|
+
|
1450
|
+
Используйте [гем 'sysrandom'](https://github.com/cryptosphere/sysrandom)
|
1451
|
+
Предпочтительнее использовать системные средства RNG для генерации случайных
|
1452
|
+
значений вместо пространства пользователя `OpenSSL`, для которого в данный
|
1453
|
+
момент по умолчанию используется MRI Ruby:
|
1454
|
+
|
1455
|
+
```text
|
1456
|
+
$ gem install sysrandom
|
1457
|
+
Создание собственных расширений. Это может занять некоторое время...
|
1458
|
+
Успешно установлен sysrandom-1.x
|
1459
|
+
1 gem установлен
|
1460
|
+
|
1461
|
+
$ ruby -e "require 'sysrandom/securerandom'; puts SecureRandom.hex(64)"
|
1462
|
+
99ae8af...snip...ec0f262ac
|
1463
|
+
```
|
1464
|
+
|
1465
|
+
**Переменная среды `SESSION_SECRET`**
|
1466
|
+
|
1467
|
+
Задайте переменной среды для Sinatra `SESSION_SECRET` значение, которое вы
|
1468
|
+
сгенерировали. Сделайте это значение постоянным при перезагрузке вашего
|
1469
|
+
хоста. Поскольку метод для генерации будет различным в разных системах,
|
1470
|
+
то код ниже приведён только в качестве примера:
|
1471
|
+
|
1472
|
+
```bash
|
1473
|
+
# echo "export SESSION_SECRET=99ae8af...snip...ec0f262ac" >> ~/.bashrc
|
1474
|
+
```
|
1475
|
+
|
1476
|
+
**Конфигурация приложения**
|
1477
|
+
|
1478
|
+
Настройте конфигурацию вашего приложения в безопасном режиме для
|
1479
|
+
'secure random' ключа если переменная среды `SESSION_SECRET` не доступна.
|
1480
|
+
|
1481
|
+
В качестве бонусных пунктов здесь тоже используйте
|
1482
|
+
[гем 'sysrandom'gem](https://github.com/cryptosphere/sysrandom) :
|
1348
1483
|
|
1349
1484
|
```ruby
|
1350
|
-
|
1485
|
+
require 'securerandom'
|
1486
|
+
# -или- require 'sysrandom/securerandom'
|
1487
|
+
set :session_secret, ENV.fetch('SESSION_SECRET') { SecureRandom.hex(64) }
|
1351
1488
|
```
|
1352
1489
|
|
1490
|
+
#### Конфигурация сессии
|
1491
|
+
|
1353
1492
|
Если вы хотите больше настроек для сессий, вы можете задать их, передав хеш
|
1354
1493
|
опций в параметр `sessions`:
|
1355
1494
|
|
@@ -1385,10 +1524,12 @@ set :session_store, Rack::Session::Pool
|
|
1385
1524
|
```
|
1386
1525
|
|
1387
1526
|
Вы так же можете не вызывать `enable :sessions`, а вместо этого вызывать
|
1388
|
-
необходимую вам прослойку так же, как вы это обычно делаете.
|
1389
|
-
|
1390
|
-
|
1391
|
-
|
1527
|
+
необходимую вам прослойку так же, как вы это обычно делаете.
|
1528
|
+
|
1529
|
+
Очень важно обратить внимание на то, что когда вы используете этот метод,
|
1530
|
+
основной способ защиты сессии **не будет включен по умолчанию**.
|
1531
|
+
|
1532
|
+
Если вы хотите включить защиту, вам нужно добавить следующие строчки:
|
1392
1533
|
|
1393
1534
|
```ruby
|
1394
1535
|
use Rack::Session::Pool, :expire_after => 2592000
|
@@ -1477,8 +1618,8 @@ end
|
|
1477
1618
|
производительность, перенеся `"bar"` в метод-помощник, используемый и в
|
1478
1619
|
`/foo`, и в `/bar`.
|
1479
1620
|
|
1480
|
-
Если вы хотите, чтобы запрос был отправлен в тот же экземпляр приложения,
|
1481
|
-
в его копию, используйте `call!` вместо `call`.
|
1621
|
+
Если вы хотите, чтобы запрос был отправлен в тот же экземпляр приложения,
|
1622
|
+
а не в его копию, используйте `call!` вместо `call`.
|
1482
1623
|
|
1483
1624
|
Если хотите узнать больше о `call`, смотрите спецификацию Rack.
|
1484
1625
|
|
@@ -1564,20 +1705,20 @@ set :server, :thin
|
|
1564
1705
|
connections = []
|
1565
1706
|
|
1566
1707
|
get '/subscribe' do
|
1567
|
-
# регистрация клиента
|
1708
|
+
# регистрация клиента в событиях сервера
|
1568
1709
|
stream(:keep_open) do |out|
|
1569
|
-
connections << out
|
1710
|
+
connections << out
|
1570
1711
|
# удаление "мертвых клиентов"
|
1571
1712
|
connections.reject!(&:closed?)
|
1572
1713
|
end
|
1573
1714
|
end
|
1574
1715
|
|
1575
|
-
post '
|
1716
|
+
post '/:message' do
|
1576
1717
|
connections.each do |out|
|
1577
1718
|
# уведомить клиента о новом сообщении
|
1578
1719
|
out << params['message'] << "\n"
|
1579
1720
|
|
1580
|
-
#
|
1721
|
+
# указать клиенту на необходимость снова соединиться
|
1581
1722
|
out.close
|
1582
1723
|
end
|
1583
1724
|
|
@@ -1586,6 +1727,9 @@ post '/message' do
|
|
1586
1727
|
end
|
1587
1728
|
```
|
1588
1729
|
|
1730
|
+
Также клиент может закрыть соединение при попытке записи в сокет. В связи с
|
1731
|
+
этим рекомендуется проверить `out.closed?` прежде, чем пытаться записать.
|
1732
|
+
|
1589
1733
|
### Логирование
|
1590
1734
|
|
1591
1735
|
В области видимости запроса метод `logger` предоставляет доступ к экземпляру
|
@@ -1671,7 +1815,7 @@ redirect to('/bar'), 303
|
|
1671
1815
|
redirect 'http://www.google.com/', 'wrong place, buddy'
|
1672
1816
|
```
|
1673
1817
|
|
1674
|
-
Вы также можете перенаправить пользователя
|
1818
|
+
Вы также можете перенаправить пользователя обратно на страницу, с которой он
|
1675
1819
|
пришел, с помощью `redirect back`:
|
1676
1820
|
|
1677
1821
|
```ruby
|
@@ -1698,12 +1842,12 @@ redirect to('/bar?sum=42')
|
|
1698
1842
|
enable :sessions
|
1699
1843
|
|
1700
1844
|
get '/foo' do
|
1701
|
-
session[
|
1845
|
+
session[:secret] = 'foo'
|
1702
1846
|
redirect to('/bar')
|
1703
1847
|
end
|
1704
1848
|
|
1705
1849
|
get '/bar' do
|
1706
|
-
session[
|
1850
|
+
session[:secret]
|
1707
1851
|
end
|
1708
1852
|
```
|
1709
1853
|
|
@@ -1743,7 +1887,7 @@ end
|
|
1743
1887
|
немедленно отправят ответ клиенту, если текущая версия уже есть в их кэше:
|
1744
1888
|
|
1745
1889
|
```ruby
|
1746
|
-
get
|
1890
|
+
get "/article/:id" do
|
1747
1891
|
@article = Article.find params['id']
|
1748
1892
|
last_modified @article.updated_at
|
1749
1893
|
etag @article.sha1
|
@@ -1763,8 +1907,8 @@ etag @article.sha1, :weak
|
|
1763
1907
|
кэширования, попробуйте [rack-cache](https://github.com/rtomayko/rack-cache):
|
1764
1908
|
|
1765
1909
|
```ruby
|
1766
|
-
require
|
1767
|
-
require
|
1910
|
+
require "rack/cache"
|
1911
|
+
require "sinatra"
|
1768
1912
|
|
1769
1913
|
use Rack::Cache
|
1770
1914
|
|
@@ -1820,32 +1964,33 @@ send_file 'foo.png', :type => :jpg
|
|
1820
1964
|
|
1821
1965
|
<dl>
|
1822
1966
|
<dt>filename</dt>
|
1823
|
-
|
1967
|
+
<dd>имя файла, по умолчанию: реальное имя файла.</dd>
|
1824
1968
|
|
1825
1969
|
<dt>last_modified</dt>
|
1826
|
-
|
1827
|
-
|
1970
|
+
<dd>значение для заголовка Last-Modified, по умолчанию: mtime (время
|
1971
|
+
изменения) файла.</dd>
|
1828
1972
|
|
1829
1973
|
<dt>type</dt>
|
1830
|
-
|
1974
|
+
<dd>тип файла, по умолчанию: определяется по расширению файла.</dd>
|
1831
1975
|
|
1832
1976
|
<dt>disposition</dt>
|
1833
|
-
|
1834
|
-
|
1977
|
+
<dd>
|
1978
|
+
используется для заголовка Content-Disposition, возможные значения: <tt>nil</tt>
|
1979
|
+
(по умолчанию), <tt>:attachment</tt> и <tt>:inline</tt>
|
1980
|
+
</dd>
|
1835
1981
|
|
1836
1982
|
<dt>length</dt>
|
1837
|
-
|
1983
|
+
<dd>значения для заголовка Content-Length, по умолчанию: размер файла.</dd>
|
1838
1984
|
|
1839
1985
|
<dt>status</dt>
|
1840
|
-
|
1841
|
-
|
1986
|
+
<dd>
|
1987
|
+
Код ответа. Полезно, когда отсылается статический файл в качестве страницы с
|
1988
|
+
сообщением об ошибке. Если поддерживается обработчик Rack, будут использоваться
|
1989
|
+
другие средства, кроме потоковой передачи из процесса Ruby. Если вы используете
|
1990
|
+
этот вспомогательный метод, Sinatra автоматически обрабатывает запросы диапазона.
|
1991
|
+
</dd>
|
1842
1992
|
</dl>
|
1843
1993
|
|
1844
|
-
Этот метод будет использовать возможности Rack сервера для отправки файлов,
|
1845
|
-
если они доступны, в противном случае будет напрямую отдавать файл из Ruby
|
1846
|
-
процесса. Метод `send_file` также обеспечивает автоматическую обработку
|
1847
|
-
частичных (range) запросов с помощью Sinatra.
|
1848
|
-
|
1849
1994
|
### Доступ к объекту запроса
|
1850
1995
|
|
1851
1996
|
Объект входящего запроса доступен на уровне обработки запроса (в фильтрах,
|
@@ -1934,7 +2079,7 @@ Sinatra предлагает метод-помощник `time_for`, котор
|
|
1934
2079
|
|
1935
2080
|
```ruby
|
1936
2081
|
get '/' do
|
1937
|
-
pass if Time.now > time_for('Dec 23,
|
2082
|
+
pass if Time.now > time_for('Dec 23, 2016')
|
1938
2083
|
"still time"
|
1939
2084
|
end
|
1940
2085
|
```
|
@@ -2007,10 +2152,10 @@ end
|
|
2007
2152
|
Заметьте, что `find_template` не проверяет, существует ли файл на самом деле,
|
2008
2153
|
а вызывает заданный блок для всех возможных путей. Дело тут не в
|
2009
2154
|
производительности, дело в том, что `render` вызовет `break`, как только файл
|
2010
|
-
|
2011
|
-
|
2012
|
-
|
2013
|
-
|
2155
|
+
будет найден. Содержимое и местонахождение шаблонов будет закэшировано, если
|
2156
|
+
приложение запущено не в режиме разработки (`set :environment, :development`).
|
2157
|
+
Вы должны помнить об этих нюансах, если пишите по-настоящему "сумасшедший"
|
2158
|
+
метод.
|
2014
2159
|
|
2015
2160
|
## Конфигурация
|
2016
2161
|
|
@@ -2036,7 +2181,7 @@ configure do
|
|
2036
2181
|
end
|
2037
2182
|
```
|
2038
2183
|
|
2039
|
-
Будет запущено, когда окружение (APP_ENV переменная) `:production`:
|
2184
|
+
Будет запущено, когда окружение (`APP_ENV` переменная) `:production`:
|
2040
2185
|
|
2041
2186
|
```ruby
|
2042
2187
|
configure :production do
|
@@ -2090,174 +2235,217 @@ set :protection, :except => :path_traversal
|
|
2090
2235
|
set :protection, :except => [:path_traversal, :session_hijacking]
|
2091
2236
|
```
|
2092
2237
|
|
2238
|
+
По умолчанию Sinatra будет устанавливать `session based` защиту только если
|
2239
|
+
включена опция `:sessions`. См. 'Использование сессий'. Иногда вы захотите
|
2240
|
+
настроить сессии "вне" приложения Sinatra, например, в config.ru или с помощью
|
2241
|
+
отдельного экземпляра `Rack::Builder`. В этом случае вы также можете настроить
|
2242
|
+
`session based` защиту, передав опцию `:session`:
|
2243
|
+
|
2244
|
+
```ruby
|
2245
|
+
set :protection, :session => true
|
2246
|
+
```
|
2247
|
+
|
2093
2248
|
### Доступные настройки
|
2094
2249
|
|
2095
2250
|
<dl>
|
2096
2251
|
<dt>absolute_redirects</dt>
|
2097
|
-
|
2098
|
-
|
2099
|
-
|
2100
|
-
|
2101
|
-
|
2102
|
-
|
2103
|
-
|
2104
|
-
|
2105
|
-
|
2106
|
-
|
2107
|
-
|
2108
|
-
|
2252
|
+
<dd>
|
2253
|
+
если отключено, то Sinatra будет позволять использование относительных
|
2254
|
+
перенаправлений, но при этом перестанет соответствовать RFC 2616 (HTTP
|
2255
|
+
1.1), который разрешает только абсолютные перенаправления.
|
2256
|
+
</dd>
|
2257
|
+
<dd>
|
2258
|
+
включайте эту опцию, если ваше приложение работает за обратным прокси,
|
2259
|
+
который настроен не совсем корректно. Обратите внимание, метод <tt>url</tt> все
|
2260
|
+
равно будет генерировать абсолютные URL, если вы не передадите <tt>false</tt>
|
2261
|
+
вторым аргументом.
|
2262
|
+
</dd>
|
2263
|
+
<dd>отключено по умолчанию.</dd>
|
2109
2264
|
|
2110
2265
|
<dt>add_charset</dt>
|
2111
|
-
|
2112
|
-
|
2113
|
-
|
2114
|
-
|
2115
|
-
|
2266
|
+
<dd>
|
2267
|
+
mime-типы, к которым метод <tt>content_type</tt> будет автоматически добавлять
|
2268
|
+
информацию о кодировке. Вам следует добавлять значения к этой опции
|
2269
|
+
вместо ее переопределения: <tt>settings.add_charset << "application/foobar"</tt>
|
2270
|
+
</dd>
|
2116
2271
|
|
2117
2272
|
<dt>app_file</dt>
|
2118
|
-
|
2119
|
-
|
2120
|
-
|
2121
|
-
|
2122
|
-
|
2273
|
+
<dd>
|
2274
|
+
путь к главному файлу приложения, используется для нахождения корневой
|
2275
|
+
директории проекта, директорий с шаблонами и статическими файлами,
|
2276
|
+
вложенных шаблонов.
|
2277
|
+
</dd>
|
2123
2278
|
|
2124
2279
|
<dt>bind</dt>
|
2125
|
-
|
2126
|
-
|
2127
|
-
|
2128
|
-
|
2280
|
+
<dd>
|
2281
|
+
используемый IP-адрес (по умолчанию: <tt>0.0.0.0</tt> <em>или</em>
|
2282
|
+
<tt>localhost</tt> если ваша `environment` настроена на разработку).
|
2283
|
+
Используется только встроенным сервером.
|
2284
|
+
</dd>
|
2129
2285
|
|
2130
2286
|
<dt>default_encoding</dt>
|
2131
|
-
|
2287
|
+
<dd>кодировка, если неизвестна (по умолчанию: <tt>"utf-8"</tt>).</dd>
|
2132
2288
|
|
2133
2289
|
<dt>dump_errors</dt>
|
2134
|
-
|
2290
|
+
<dd>отображать ошибки в логе.</dd>
|
2135
2291
|
|
2136
2292
|
<dt>environment</dt>
|
2137
|
-
|
2138
|
-
|
2139
|
-
|
2140
|
-
|
2293
|
+
<dd>
|
2294
|
+
текущее окружение, по умолчанию, значение <tt>ENV['APP_ENV']</tt> или
|
2295
|
+
<tt>"development"</tt>, если <tt>ENV['APP_ENV']</tt> недоступна.
|
2296
|
+
</dd>
|
2141
2297
|
|
2142
2298
|
<dt>logging</dt>
|
2143
|
-
|
2299
|
+
<dd>использовать логер.</dd>
|
2144
2300
|
|
2145
2301
|
<dt>lock</dt>
|
2146
|
-
|
2147
|
-
|
2148
|
-
|
2302
|
+
<dd>
|
2303
|
+
создает блокировку для каждого запроса, которая гарантирует обработку
|
2304
|
+
только одного запроса в текущий момент времени в Ruby процессе.
|
2305
|
+
</dd>
|
2306
|
+
<dd>
|
2307
|
+
включайте, если ваше приложение не потоко-безопасно (thread-safe).
|
2308
|
+
Отключено по умолчанию.
|
2149
2309
|
</dd>
|
2150
|
-
<dd>
|
2151
|
-
Включайте, если ваше приложение не потоко-безопасно (thread-safe).
|
2152
|
-
Отключено по умолчанию.</dd>
|
2153
2310
|
|
2154
2311
|
<dt>method_override</dt>
|
2155
|
-
|
2156
|
-
|
2157
|
-
|
2158
|
-
|
2312
|
+
<dd>
|
2313
|
+
использовать "магический" параметр <tt>_method</tt>, для поддержки
|
2314
|
+
PUT/DELETE форм в браузерах, которые не поддерживают эти методы.
|
2315
|
+
</dd>
|
2316
|
+
|
2317
|
+
<dt>mustermann_opts</dt>
|
2318
|
+
<dd>
|
2319
|
+
хэш настроек по умолчанию для перехода к Mustermann.new при компиляции
|
2320
|
+
маршрутов маршрутизации.
|
2321
|
+
</dd>
|
2159
2322
|
|
2160
2323
|
<dt>port</dt>
|
2161
|
-
|
2162
|
-
|
2163
|
-
|
2164
|
-
|
2324
|
+
<dd>
|
2325
|
+
порт, на котором будет работать сервер.
|
2326
|
+
Используется только встроенным сервером.
|
2327
|
+
</dd>
|
2165
2328
|
|
2166
2329
|
<dt>prefixed_redirects</dt>
|
2167
|
-
|
2168
|
-
|
2169
|
-
|
2170
|
-
|
2171
|
-
|
2330
|
+
<dd>
|
2331
|
+
добавлять или нет параметр <tt>request.script_name</tt> к редиректам, если не
|
2332
|
+
задан абсолютный путь. Таким образом, <tt>redirect '/foo'</tt> будет вести себя
|
2333
|
+
как <tt>redirect to('/foo')</tt>. Отключено по умолчанию.
|
2334
|
+
</dd>
|
2172
2335
|
|
2173
2336
|
<dt>protection</dt>
|
2174
|
-
|
2337
|
+
<dd>включена или нет защита от атак. Смотрите секцию защиты от атак выше.</dd>
|
2175
2338
|
|
2176
2339
|
<dt>public_dir</dt>
|
2177
|
-
|
2340
|
+
<dd>алиас для <tt>public_folder</tt>.</dd>
|
2178
2341
|
|
2179
2342
|
<dt>public_folder</dt>
|
2180
|
-
|
2181
|
-
|
2182
|
-
|
2183
|
-
|
2184
|
-
|
2343
|
+
<dd>
|
2344
|
+
путь к общедоступной директории, откуда будут раздаваться файлы.
|
2345
|
+
Используется, только если включена раздача статических файлов
|
2346
|
+
(см. опцию <tt>static</tt> ниже). Берётся из настройки <tt>app_file</tt>,
|
2347
|
+
если не установлена.
|
2348
|
+
</dd>
|
2349
|
+
|
2350
|
+
<dt>quiet</dt>
|
2351
|
+
<dd>
|
2352
|
+
отключает журналы, созданные командами запуска и остановки Sinatra.
|
2353
|
+
<tt>false</tt> по умолчанию.
|
2354
|
+
</dd>
|
2185
2355
|
|
2186
2356
|
<dt>reload_templates</dt>
|
2187
|
-
|
2188
|
-
|
2189
|
-
|
2190
|
-
|
2357
|
+
<dd>
|
2358
|
+
перезагружать или нет шаблоны на каждый запрос. Включено в режиме
|
2359
|
+
разработки.
|
2360
|
+
</dd>
|
2191
2361
|
|
2192
2362
|
<dt>root</dt>
|
2193
|
-
|
2363
|
+
<dd>
|
2364
|
+
путь к корневой директории проекта. Берётся из настройки <tt>app_file</tt>,
|
2365
|
+
если не установлен.
|
2366
|
+
</dd>
|
2194
2367
|
|
2195
2368
|
<dt>raise_errors</dt>
|
2196
|
-
|
2197
|
-
|
2198
|
-
|
2199
|
-
|
2369
|
+
<dd>
|
2370
|
+
выбрасывать исключения (будет останавливать приложение).
|
2371
|
+
По умолчанию включено только в окружении <tt>"test"</tt>.
|
2372
|
+
</dd>
|
2200
2373
|
|
2201
2374
|
<dt>run</dt>
|
2202
|
-
|
2203
|
-
|
2204
|
-
|
2205
|
-
|
2375
|
+
<dd>
|
2376
|
+
если включено, Sinatra будет самостоятельно запускать веб-сервер. Не
|
2377
|
+
включайте, если используете rackup или аналогичные средства.
|
2378
|
+
</dd>
|
2206
2379
|
|
2207
2380
|
<dt>running</dt>
|
2208
|
-
|
2381
|
+
<dd>работает ли сейчас встроенный сервер? Не меняйте эту опцию!</dd>
|
2209
2382
|
|
2210
2383
|
<dt>server</dt>
|
2211
|
-
|
2212
|
-
|
2213
|
-
|
2214
|
-
|
2384
|
+
<dd>
|
2385
|
+
сервер или список серверов, которые следует использовать в качестве
|
2386
|
+
встроенного сервера. Порядок задает приоритет, по умолчанию зависит
|
2387
|
+
от реализации Ruby.
|
2388
|
+
</dd>
|
2215
2389
|
|
2216
2390
|
<dt>sessions</dt>
|
2217
|
-
|
2218
|
-
|
2391
|
+
<dd>
|
2392
|
+
включить сессии на основе кук (cookie) на базе <tt>Rack::Session::Cookie</tt>.
|
2393
|
+
Смотрите секцию "Использование сессий" выше.
|
2394
|
+
</dd>
|
2395
|
+
|
2396
|
+
<dt>session_store</dt>
|
2397
|
+
<dd>
|
2398
|
+
используется Rack "прослойка" сессии. По умолчанию <tt>Rack::Session::Cookie</tt>.
|
2219
2399
|
Смотрите секцию "Использование сессий" выше.
|
2220
|
-
|
2400
|
+
</dd>
|
2221
2401
|
|
2222
2402
|
<dt>show_exceptions</dt>
|
2223
|
-
|
2224
|
-
|
2225
|
-
|
2226
|
-
|
2227
|
-
|
2228
|
-
|
2229
|
-
|
2230
|
-
|
2231
|
-
</dd>
|
2403
|
+
<dd>
|
2404
|
+
показывать исключения/стек вызовов (stack trace) в браузере. По умолчанию
|
2405
|
+
включено только в окружении <tt>"development"</tt>.
|
2406
|
+
</dd>
|
2407
|
+
<dd>
|
2408
|
+
может также быть установлено в <tt>:after_handler</tt> для запуска специфичной
|
2409
|
+
для приложения обработки ошибок, перед показом трассировки стека в браузере.
|
2410
|
+
</dd>
|
2232
2411
|
|
2233
2412
|
<dt>static</dt>
|
2234
|
-
|
2235
|
-
|
2236
|
-
|
2237
|
-
|
2413
|
+
<dd>должна ли Sinatra осуществлять раздачу статических файлов.</dd>
|
2414
|
+
<dd>Отключите, когда используете какой-либо веб-сервер для этой цели.</dd>
|
2415
|
+
<dd>Отключение значительно улучшит производительность приложения.</dd>
|
2416
|
+
<dd>По умолчанию включено в классических и отключено в модульных приложениях.</dd>
|
2238
2417
|
|
2239
2418
|
<dt>static_cache_control</dt>
|
2240
|
-
|
2241
|
-
|
2242
|
-
|
2243
|
-
|
2244
|
-
|
2245
|
-
|
2246
|
-
|
2247
|
-
|
2248
|
-
|
2419
|
+
<dd>
|
2420
|
+
когда Sinatra отдает статические файлы, используйте эту опцию, чтобы
|
2421
|
+
добавить им заголовок <tt>Cache-Control</tt>. Для этого используется
|
2422
|
+
метод-помощник <tt>cache_control</tt>. По умолчанию отключено.
|
2423
|
+
</dd>
|
2424
|
+
<dd>
|
2425
|
+
используйте массив, когда надо задать несколько значений:
|
2426
|
+
<tt>set :static_cache_control, [:public, :max_age => 300]</tt>
|
2427
|
+
</dd>
|
2249
2428
|
|
2250
2429
|
<dt>threaded</dt>
|
2251
|
-
|
2252
|
-
|
2253
|
-
|
2254
|
-
|
2430
|
+
<dd>
|
2431
|
+
если включено, то Thin будет использовать <tt>EventMachine.defer</tt> для
|
2432
|
+
обработки запросов.
|
2433
|
+
</dd>
|
2255
2434
|
|
2256
2435
|
<dt>traps</dt>
|
2257
|
-
|
2436
|
+
<dd>должна ли Sinatra обрабатывать системные сигналы или нет.</tt></dd>
|
2258
2437
|
|
2259
2438
|
<dt>views</dt>
|
2260
|
-
|
2439
|
+
<dd>
|
2440
|
+
путь к директории с шаблонами. Берётся из настройки <tt>app_file</tt>,
|
2441
|
+
если не установлен.
|
2442
|
+
</dd>
|
2443
|
+
|
2444
|
+
<dt>x_cascade</dt>
|
2445
|
+
<dd>
|
2446
|
+
Установлен ли заголовок X-Cascade если никакие маршруты не совпадают.
|
2447
|
+
<tt>true</tt> по умолчанию.
|
2448
|
+
</dd>
|
2261
2449
|
</dl>
|
2262
2450
|
|
2263
2451
|
## Режим, окружение
|
@@ -2269,14 +2457,25 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
2269
2457
|
`not_found` и `error`, чтобы вы могли увидеть стек вызовов. В окружениях
|
2270
2458
|
`"production"` и `"test"` шаблоны по умолчанию кэшируются.
|
2271
2459
|
|
2272
|
-
Для запуска приложения в определенном окружении
|
2460
|
+
Для запуска приложения в определенном окружении установите переменную
|
2461
|
+
окружения `APP_ENV`:
|
2273
2462
|
|
2274
|
-
```
|
2275
|
-
ruby my_app.rb
|
2463
|
+
```shell
|
2464
|
+
APP_ENV=production ruby my_app.rb
|
2276
2465
|
```
|
2277
2466
|
|
2278
2467
|
Вы можете использовать предопределенные методы `development?`, `test?` и
|
2279
|
-
|
2468
|
+
`production?`, чтобы определить текущее окружение.
|
2469
|
+
|
2470
|
+
```ruby
|
2471
|
+
get '/' do
|
2472
|
+
if settings.development?
|
2473
|
+
"development!"
|
2474
|
+
else
|
2475
|
+
"not development!"
|
2476
|
+
end
|
2477
|
+
end
|
2478
|
+
```
|
2280
2479
|
|
2281
2480
|
## Обработка ошибок
|
2282
2481
|
|
@@ -2298,8 +2497,15 @@ end
|
|
2298
2497
|
### Error
|
2299
2498
|
|
2300
2499
|
Обработчик ошибок `error` будет вызван, когда исключение выброшено из блока
|
2301
|
-
маршрута, либо из фильтра.
|
2302
|
-
|
2500
|
+
маршрута, либо из фильтра. Но заметьте, что в режиме разработки он будет
|
2501
|
+
запускаться, только если вы установите опцию "show exceptions"
|
2502
|
+
на `: after_handler`:
|
2503
|
+
|
2504
|
+
```ruby
|
2505
|
+
set :show_exceptions, :after_handler
|
2506
|
+
```
|
2507
|
+
|
2508
|
+
Объект-исключение доступен как переменная `sinatra.error` в Rack:
|
2303
2509
|
|
2304
2510
|
```ruby
|
2305
2511
|
error do
|
@@ -2350,9 +2556,11 @@ end
|
|
2350
2556
|
```
|
2351
2557
|
|
2352
2558
|
Sinatra устанавливает специальные `not_found` и `error` обработчики, когда
|
2353
|
-
приложение запущено в режиме разработки (окружение `:development`)
|
2559
|
+
приложение запущено в режиме разработки (окружение `:development`) чтобы
|
2560
|
+
отображать хорошие трассировки стека и дополнительную информацию об отладке
|
2561
|
+
в вашем браузере.
|
2354
2562
|
|
2355
|
-
## Rack "
|
2563
|
+
## Rack "прослойка"
|
2356
2564
|
|
2357
2565
|
Sinatra использует [Rack](http://rack.github.io/), минимальный стандартный
|
2358
2566
|
интерфейс для веб-фреймворков на Ruby. Одной из самых интересных для
|
@@ -2433,16 +2641,18 @@ class MyAppTest < Minitest::Test
|
|
2433
2641
|
end
|
2434
2642
|
```
|
2435
2643
|
|
2644
|
+
Примечание: если вы используете Sinatra в модульном стиле, замените
|
2645
|
+
`Sinatra::Application` в примере выше выше на имя класса вашего приложения.
|
2646
|
+
|
2436
2647
|
## Sinatra::Base — "прослойки", библиотеки и модульные приложения
|
2437
2648
|
|
2438
|
-
Описание
|
2439
|
-
|
2440
|
-
|
2441
|
-
|
2442
|
-
|
2443
|
-
|
2444
|
-
|
2445
|
-
расширений Sinatra. И тут на помощь приходит `Sinatra::Base`:
|
2649
|
+
Описание вашего приложения на верхнем уровне хорошо работает для микроприложений,
|
2650
|
+
но имеет значительные недостатки при создании многоразовых компонентов, таких как
|
2651
|
+
Rack "прослойка", Rails metal, простые библиотеки с серверным компонентом или
|
2652
|
+
даже расширения Sinatra. Верхний уровень предполагает конфигурацию стиля
|
2653
|
+
микроприложений (например, одиночный файл приложения, `./public` и `./views`,
|
2654
|
+
каталоги, логгирование, страницу подробных сведений об исключениях и т.д.).
|
2655
|
+
И тут на помощь приходит `Sinatra::Base`:
|
2446
2656
|
|
2447
2657
|
```ruby
|
2448
2658
|
require 'sinatra/base'
|
@@ -2461,16 +2671,29 @@ end
|
|
2461
2671
|
приложениям в DSL верхнего уровня. Большинство таких приложений могут быть
|
2462
2672
|
конвертированы в `Sinatra::Base` компоненты с помощью двух модификаций:
|
2463
2673
|
|
2464
|
-
* Вы должны подключать `sinatra/base` вместо `sinatra`, иначе все методы,
|
2674
|
+
* Вы должны подключать `sinatra/base` вместо `sinatra`, иначе все DSL методы,
|
2465
2675
|
предоставляемые Sinatra, будут импортированы в глобальное пространство
|
2466
2676
|
имен.
|
2467
2677
|
* Поместите все маршруты, обработчики ошибок, фильтры и опции в подкласс
|
2468
2678
|
`Sinatra::Base`.
|
2469
2679
|
|
2470
2680
|
`Sinatra::Base` — это чистый лист. Большинство опций, включая встроенный
|
2471
|
-
сервер, по умолчанию отключены. Смотрите
|
2472
|
-
[Опции и конфигурация](http://www.sinatrarb.com/configuration.html)
|
2473
|
-
для детальной информации об опциях и их поведении.
|
2681
|
+
сервер, по умолчанию отключены. Смотрите
|
2682
|
+
[Опции и конфигурация](http://www.sinatrarb.com/configuration.html)
|
2683
|
+
для детальной информации об опциях и их поведении. Если вы хотите, чтобы
|
2684
|
+
поведение было более похоже на то, когда вы определяете свое приложение
|
2685
|
+
на верхнем уровне (также известно как классический стиль), вы можете
|
2686
|
+
подклассифицировать `Sinatra::Application`:
|
2687
|
+
|
2688
|
+
```ruby
|
2689
|
+
require 'sinatra/base'
|
2690
|
+
|
2691
|
+
class MyApp < Sinatra::Application
|
2692
|
+
get '/' do
|
2693
|
+
'Hello world!'
|
2694
|
+
end
|
2695
|
+
end
|
2696
|
+
```
|
2474
2697
|
|
2475
2698
|
### Модульные приложения против классических
|
2476
2699
|
|
@@ -2486,14 +2709,56 @@ end
|
|
2486
2709
|
Переходя с одного стиля на другой, примите во внимание следующие изменения в
|
2487
2710
|
настройках:
|
2488
2711
|
|
2489
|
-
|
2712
|
+
<table>
|
2713
|
+
<tr>
|
2714
|
+
<th>Опция</th>
|
2715
|
+
<th>Классический</th>
|
2716
|
+
<th>Модульный</th>
|
2717
|
+
<th>Модульный</th>
|
2718
|
+
</tr>
|
2719
|
+
|
2720
|
+
<tr>
|
2721
|
+
<td>app_file</td>
|
2722
|
+
<td>файл с приложением</td>
|
2723
|
+
<td>файл с подклассом Sinatra::Base</td>
|
2724
|
+
<td>файл с подклассом Sinatra::Application</td>
|
2725
|
+
</tr>
|
2726
|
+
|
2727
|
+
<tr>
|
2728
|
+
<td>run</td>
|
2729
|
+
<td>$0 == app_file</td>
|
2730
|
+
<td>false</td>
|
2731
|
+
<td>false</td>
|
2732
|
+
</tr>
|
2733
|
+
|
2734
|
+
<tr>
|
2735
|
+
<td>logging</td>
|
2736
|
+
<td>true</td>
|
2737
|
+
<td>false</td>
|
2738
|
+
<td>true</td>
|
2739
|
+
</tr>
|
2740
|
+
|
2741
|
+
<tr>
|
2742
|
+
<td>method_override</td>
|
2743
|
+
<td>true</td>
|
2744
|
+
<td>false</td>
|
2745
|
+
<td>true</td>
|
2746
|
+
</tr>
|
2747
|
+
|
2748
|
+
<tr>
|
2749
|
+
<td>inline_templates</td>
|
2750
|
+
<td>true</td>
|
2751
|
+
<td>false</td>
|
2752
|
+
<td>true</td>
|
2753
|
+
</tr>
|
2490
2754
|
|
2491
|
-
|
2492
|
-
|
2493
|
-
|
2494
|
-
|
2495
|
-
|
2496
|
-
|
2755
|
+
<tr>
|
2756
|
+
<td>static</td>
|
2757
|
+
<td>true</td>
|
2758
|
+
<td>File.exist?(public_folder)</td>
|
2759
|
+
<td>true</td>
|
2760
|
+
</tr>
|
2761
|
+
</table>
|
2497
2762
|
|
2498
2763
|
### Запуск модульных приложений
|
2499
2764
|
|
@@ -2514,7 +2779,7 @@ end
|
|
2514
2779
|
|
2515
2780
|
Затем:
|
2516
2781
|
|
2517
|
-
```
|
2782
|
+
```shell
|
2518
2783
|
ruby my_app.rb
|
2519
2784
|
```
|
2520
2785
|
|
@@ -2522,14 +2787,14 @@ ruby my_app.rb
|
|
2522
2787
|
использовать любой Rack-совместимый сервер приложений.
|
2523
2788
|
|
2524
2789
|
```ruby
|
2525
|
-
# config.ru
|
2790
|
+
# config.ru (запускается с помощью Rackup)
|
2526
2791
|
require './my_app'
|
2527
2792
|
run MyApp
|
2528
2793
|
```
|
2529
2794
|
|
2530
2795
|
Запускаем:
|
2531
2796
|
|
2532
|
-
```
|
2797
|
+
```shell
|
2533
2798
|
rackup -p 4567
|
2534
2799
|
```
|
2535
2800
|
|
@@ -2573,7 +2838,7 @@ run Sinatra::Application
|
|
2573
2838
|
Не только сама Sinatra может использовать "прослойки" Rack, но и любое Sinatra
|
2574
2839
|
приложение само может быть добавлено к любому Rack endpoint в качестве
|
2575
2840
|
"прослойки". Этим endpoint (конечной точкой) может быть другое Sinatra
|
2576
|
-
приложение, или приложение, основанное на Rack (Rails/
|
2841
|
+
приложение, или приложение, основанное на Rack (Rails/Hamami/Roda/...):
|
2577
2842
|
|
2578
2843
|
```ruby
|
2579
2844
|
require 'sinatra/base'
|
@@ -2621,7 +2886,7 @@ my_app.run!
|
|
2621
2886
|
наследоваться:
|
2622
2887
|
|
2623
2888
|
```ruby
|
2624
|
-
# config.ru
|
2889
|
+
# config.ru (запускается с помощью Rackup)
|
2625
2890
|
require 'sinatra/base'
|
2626
2891
|
|
2627
2892
|
controller = Sinatra.new do
|
@@ -2723,8 +2988,8 @@ end
|
|
2723
2988
|
|
2724
2989
|
У вас будет область видимости запроса в:
|
2725
2990
|
|
2726
|
-
* get
|
2727
|
-
* before
|
2991
|
+
* get, head, post, put, delete, options, patch, link и unlink блоках;
|
2992
|
+
* before и after фильтрах;
|
2728
2993
|
* методах-помощниках;
|
2729
2994
|
* шаблонах/отображениях.
|
2730
2995
|
|
@@ -2740,7 +3005,7 @@ end
|
|
2740
3005
|
|
2741
3006
|
У вас будет контекст делегирования внутри:
|
2742
3007
|
|
2743
|
-
* привязки верхнего уровня, если вы сделали `require
|
3008
|
+
* привязки верхнего уровня, если вы сделали `require "sinatra"`;
|
2744
3009
|
* объекта, расширенного с помощью `Sinatra::Delegator`.
|
2745
3010
|
|
2746
3011
|
Посмотрите сами в код: вот
|
@@ -2751,8 +3016,8 @@ end
|
|
2751
3016
|
|
2752
3017
|
Sinatra приложения могут быть запущены напрямую:
|
2753
3018
|
|
2754
|
-
```
|
2755
|
-
ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
|
3019
|
+
```shell
|
3020
|
+
ruby myapp.rb [-h] [-x] [-q] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
|
2756
3021
|
```
|
2757
3022
|
|
2758
3023
|
Опции включают:
|
@@ -2763,6 +3028,7 @@ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
|
|
2763
3028
|
-o # указание хоста (по умолчанию 0.0.0.0)
|
2764
3029
|
-e # указание окружения, режима (по умолчанию development)
|
2765
3030
|
-s # указание rack сервера/обработчика (по умолчанию thin)
|
3031
|
+
-q # включить тихий режим для сервера (по умолчанию выключен)
|
2766
3032
|
-x # включить мьютекс-блокировку (по умолчанию выключена)
|
2767
3033
|
```
|
2768
3034
|
|
@@ -2790,6 +3056,7 @@ class App < Sinatra::Base
|
|
2790
3056
|
end
|
2791
3057
|
|
2792
3058
|
App.run!
|
3059
|
+
|
2793
3060
|
```
|
2794
3061
|
|
2795
3062
|
Чтобы запустить сервер, вы должны выполнить следующую команду:
|
@@ -2798,48 +3065,35 @@ App.run!
|
|
2798
3065
|
thin --threaded start
|
2799
3066
|
```
|
2800
3067
|
|
3068
|
+
|
2801
3069
|
[so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
|
2802
3070
|
|
2803
3071
|
## Системные требования
|
2804
3072
|
|
2805
3073
|
Следующие версии Ruby официально поддерживаются:
|
2806
|
-
|
2807
3074
|
<dl>
|
2808
|
-
<dt>Ruby
|
2809
|
-
<dd>
|
2810
|
-
|
2811
|
-
|
2812
|
-
|
2813
|
-
возможно, поддержка не будет прекращена. <b>Ruby 1.8.6 больше не
|
2814
|
-
поддерживается.</b> Если вы хотите использовать 1.8.6, откатитесь до Sinatra
|
2815
|
-
1.2, которая будет получать все исправления ошибок до тех пор, пока не
|
2816
|
-
будет выпущена Sinatra 1.4.0.</dd>
|
2817
|
-
|
2818
|
-
<dt>Ruby 1.9.2</dt>
|
2819
|
-
<dd>1.9.2 полностью поддерживается и рекомендована к использованию.
|
2820
|
-
Не используйте 1.9.2p0,
|
2821
|
-
известно, что эта версия очень нестабильна при использовании Sinatra. Эта
|
2822
|
-
версия будет поддерживаться по крайней мере до выхода Ruby 1.9.4/2.0, а
|
2823
|
-
поддержка последней версии 1.9 будет осуществляться до тех пор, пока она
|
2824
|
-
поддерживается командой разработчиков Ruby.</dd>
|
2825
|
-
|
2826
|
-
<dt>Ruby 1.9.3</dt>
|
2827
|
-
<dd>1.9.3 полностью поддерживается. Заметьте, что переход на 1.9.3 с
|
2828
|
-
ранних версий сделает недействительными все сессии.</dd>
|
3075
|
+
<dt>Ruby 2.2</dt>
|
3076
|
+
<dd>
|
3077
|
+
2.2 полностью поддерживается и рекомендуется. В настоящее время нет
|
3078
|
+
планов отказаться от официальной поддержки.
|
3079
|
+
</dd>
|
2829
3080
|
|
2830
3081
|
<dt>Rubinius</dt>
|
2831
|
-
<dd>
|
2832
|
-
|
3082
|
+
<dd>
|
3083
|
+
Rubinius официально поддерживается (Rubinius >= 2.x). Рекомендуется
|
3084
|
+
выполнить <tt>gem install puma</tt>.
|
3085
|
+
</dd>
|
2833
3086
|
|
2834
3087
|
<dt>JRuby</dt>
|
2835
|
-
<dd>
|
2836
|
-
|
2837
|
-
|
2838
|
-
|
2839
|
-
|
2840
|
-
Redcarpet и RedCloth.</dd>
|
3088
|
+
<dd>
|
3089
|
+
Официально поддерживается последний стабильный релиз JRuby. Не
|
3090
|
+
рекомендуется использовать расширений на C в JRuby. Рекомендуется
|
3091
|
+
выполнить <tt>gem install trinidad</tt>.
|
3092
|
+
</dd>
|
2841
3093
|
</dl>
|
2842
3094
|
|
3095
|
+
Версии Ruby старше 2.2.2 больше не поддерживаются в Sinatra 2.0.
|
3096
|
+
|
2843
3097
|
Мы также следим за предстоящими к выходу версиями Ruby.
|
2844
3098
|
|
2845
3099
|
Следующие реализации Ruby не поддерживаются официально, но известно, что на
|
@@ -2854,16 +3108,17 @@ thin --threaded start
|
|
2854
3108
|
работает на этой версии, а на поддерживаемой работает — это не наша проблема,
|
2855
3109
|
а их.
|
2856
3110
|
|
2857
|
-
Мы также запускаем наши CI-тесты на версии
|
2858
|
-
|
2859
|
-
|
2860
|
-
поддерживаться.
|
3111
|
+
Мы также запускаем наши CI-тесты на ruby-head (будущие версии MRI), но мы не
|
3112
|
+
можем ничего гарантировать, так как ведётся постоянная разработка.
|
3113
|
+
Предполагается, что предстоящие релизы 2.x будут полностью поддерживаться.
|
2861
3114
|
|
2862
3115
|
Sinatra должна работать на любой операционной системе, в которой есть одна из
|
2863
3116
|
указанных выше версий Ruby.
|
2864
3117
|
|
3118
|
+
Если вы запускаете MacRuby, вы должны выполнить `gem install control_tower`.
|
3119
|
+
|
2865
3120
|
Пока невозможно запустить Sinatra на Cardinal, SmallRuby, BlueRuby и на любой
|
2866
|
-
версии Ruby
|
3121
|
+
версии Ruby старше 2.2.
|
2867
3122
|
|
2868
3123
|
## На острие
|
2869
3124
|
|
@@ -2873,7 +3128,7 @@ Sinatra должна работать на любой операционной
|
|
2873
3128
|
Мы также время от времени выпускаем предварительные версии, так что вы можете
|
2874
3129
|
делать так:
|
2875
3130
|
|
2876
|
-
```
|
3131
|
+
```shell
|
2877
3132
|
gem install sinatra --pre
|
2878
3133
|
```
|
2879
3134
|
|
@@ -2886,28 +3141,27 @@ gem install sinatra --pre
|
|
2886
3141
|
|
2887
3142
|
Сначала установите Bundler, если у вас его еще нет:
|
2888
3143
|
|
2889
|
-
```
|
3144
|
+
```shell
|
2890
3145
|
gem install bundler
|
2891
3146
|
```
|
2892
3147
|
|
2893
3148
|
Затем создайте файл `Gemfile` в директории вашего проекта:
|
2894
3149
|
|
2895
3150
|
```ruby
|
2896
|
-
source
|
2897
|
-
gem 'sinatra', :
|
3151
|
+
source 'https://rubygems.org'
|
3152
|
+
gem 'sinatra', :github => 'sinatra/sinatra'
|
2898
3153
|
|
2899
3154
|
# другие зависимости
|
2900
3155
|
gem 'haml' # например, если используете haml
|
2901
|
-
gem 'activerecord', '~> 3.0' # может быть, вам нужен и ActiveRecord 3.x
|
2902
3156
|
```
|
2903
3157
|
|
2904
3158
|
Обратите внимание, вам нужно будет указывать все зависимости вашего приложения
|
2905
|
-
в
|
3159
|
+
в `Gemfile`. Однако, непосредственные зависимости Sinatra (Rack и Tilt)
|
2906
3160
|
Bundler автоматически скачает и добавит.
|
2907
3161
|
|
2908
3162
|
Теперь вы можете запускать свое приложение так:
|
2909
3163
|
|
2910
|
-
```
|
3164
|
+
```shell
|
2911
3165
|
bundle exec ruby myapp.rb
|
2912
3166
|
```
|
2913
3167
|
|