在 Sinatra 中绕过 not_found 过滤器
Bypass not_found filter in Sinatra
我正在尝试将 Sinatra 配置为
- 在所有未找到的请求中显示一个简单的 404 字符串。
- 当路由无法满足请求时,在一个路由中发送自定义 404 视频文件。
显示问题的最少代码:
# somefile.txt
some content
# server.rb
require 'sinatra'
require 'sinatra/reloader'
set :bind, '0.0.0.0'
set :port, 3000
not_found do
content_type :text
"404 Not Found"
end
get '/test' do
# in reality this is a video file, not a text file.
# .. do some work here, and if failed, send 404 file ...
# this does not work, since it triggers the not_found filter above
send_file "somefile.txt", type: :text, status: 404
# this works, but with 200 instead of 404
# send_file "somefile.txt", type: :text
end
not_found
过滤器捕获一切,甚至 send_file ... status: 404
对我来说,这似乎有点像 send_file
中的错误,但也许我错了。
有没有办法说明 "skip the not_found filter" 或任何其他更合适的方法来实现这一点?
请记住,实际上,此服务器应该 return 一个未找到的视频文件,而不是文本文件。为了简单起见,我在这里使用了文本。
这不是错误,正如 documentation 所述,
When a Sinatra::NotFound
exception is raised, or the response’s status code is 404, the not_found
handler is invoked:
我想您可以通过将 not_found
覆盖替换为这样的错误处理来解决问题:
error Sinatra::NotFound do
content_type :text
"404 Not Found"
end
这应该只在错误时触发,而不是在响应代码时触发。
我正在尝试将 Sinatra 配置为
- 在所有未找到的请求中显示一个简单的 404 字符串。
- 当路由无法满足请求时,在一个路由中发送自定义 404 视频文件。
显示问题的最少代码:
# somefile.txt
some content
# server.rb
require 'sinatra'
require 'sinatra/reloader'
set :bind, '0.0.0.0'
set :port, 3000
not_found do
content_type :text
"404 Not Found"
end
get '/test' do
# in reality this is a video file, not a text file.
# .. do some work here, and if failed, send 404 file ...
# this does not work, since it triggers the not_found filter above
send_file "somefile.txt", type: :text, status: 404
# this works, but with 200 instead of 404
# send_file "somefile.txt", type: :text
end
not_found
过滤器捕获一切,甚至 send_file ... status: 404
对我来说,这似乎有点像 send_file
中的错误,但也许我错了。
有没有办法说明 "skip the not_found filter" 或任何其他更合适的方法来实现这一点?
请记住,实际上,此服务器应该 return 一个未找到的视频文件,而不是文本文件。为了简单起见,我在这里使用了文本。
这不是错误,正如 documentation 所述,
When a
Sinatra::NotFound
exception is raised, or the response’s status code is 404, thenot_found
handler is invoked:
我想您可以通过将 not_found
覆盖替换为这样的错误处理来解决问题:
error Sinatra::NotFound do
content_type :text
"404 Not Found"
end
这应该只在错误时触发,而不是在响应代码时触发。