Sinatra API功能开关



要点

是否有可能在Sinatra应用程序中加入类似feature-toggle的功能?

关于功能切换,以防万一;)

的故事

我已经建立了一个模块化的Sinatra项目,我倾向于为我的所有资源实现GET/POST/PUT/DELETE端点;这使得在开发过程中更容易测试应用程序和操作数据。

当我进入生产时,我不希望不需要的端点存在(例如DELETE '/users')。

我可以用某种:development标志注释方法,或者可能在前块中拦截请求?你会找帮手吗?我不确定我是否走在正确的道路上,我可能过于复杂了(?)

该怎么做呢?

如果你做过这样的事情,如果你能和全国分享你的发现,那就太好了。

您可以使用当前环境来决定是否定义操作。例如:

class MyApp < Sinatra::Application
  if settings.development?
    get '/admin' do
      'VIPs only'
    end
  end
end

如果您有很多要切换的,您可能希望将它们隔离在一个文件中,您可以决定是否需要:

# routes/init.rb
require_relative 'main'
require_relative 'debug' if settings.development?
# routes/main.rb
class MyApp < Sinatra::Application
  get '/' do
    'Hello!'
  end
end
# routes/debug.rb
class MyApp < Sinatra::Application
  get '/admin' do
    'VIPs only'
  end
end

或者如果您想在一个地方列出仅用于开发的路径,这里有一个过滤版本:

class MyApp < Sinatra::Application
  DEVELOPMENT_PATHS = %w[
    /admin
  ]
  before do
    unless settings.development? || !DEVELOPMENT_PATHS.include?(request.path)
      halt 404 
    end
  end
end

然后你还可以构建一些类似于装饰器的方法来添加到列表中:

class MyApp < Sinatra::Application
  def self.development_only(path)
    DEVELOPMENT_PATHS << path
  end
  get '/admin' do
    'VIPs only'
  end
  development_only '/admin
end

一般来说,我建议在引入在开发中运行的代码与在生产中运行的代码之间的显著差异时要谨慎。不可避免的是,开发代码要么没有经过测试,要么难以正确维护。在这种情况下,存在这样一种危险,即您错过了原本想要隐藏的路径,而它对生产中的每个人都可用。我倾向于完全不使用这些路由,并从控制台操作我的开发环境,或者一直走到另一端,并使用sinatra-authentication之类的东西构建完全测试过的和生产就绪的用户权限。

最新更新