Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby 개발자를 위한 랙 설명

모든 Rails, Sinatra 및 기타 Ruby 웹 프레임워크의 배후에서 무슨 일이 일어나고 있나요?

이를 가능하게 하는 핵심 구성요소인 랙이 답입니다.

하지만 Rack이 정확히 무엇인가요?

Rack은 프레임워크(Rails)와 애플리케이션 서버(Puma) 사이의 레이어입니다.

Ruby 개발자를 위한 랙 설명

그들이 소통할 수 있게 해주는 것은 접착제입니다.

랙을 사용하는 이유

랙을 사용하면 서로 다른 프레임워크와 서버를 교체할 수 있기 때문입니다.

플러그인할 수 있는 구성요소가 됩니다. .

즉, Rails, Sinatra 및 기타 랙 호환 프레임워크와 함께 Puma를 사용할 수 있습니다. 랙 인터페이스를 구현하는 경우 사용 중인 프레임워크나 서버는 중요하지 않습니다. .

Rack을 사용하면 모든 구성 요소가 제 역할을 하고 모두가 행복해집니다!

랙 미들웨어란 무엇입니까?

Rack은 모든 웹 요청 및 응답의 중간에 위치합니다.

결과적으로 원치 않는 요청에 대한 액세스를 거부하여 보호자 역할을 하거나 느린 응답을 추적하여 역사가 역할을 할 수 있습니다.

이것이 바로 랙 미들웨어입니다. 입니다!

요청-응답 주기의 일부로 호출되고 이를 통해 무언가를 할 수 있는 기회를 얻는 작은 Ruby 프로그램입니다.

어떤 용도로 사용되나요?

  • 로깅
  • 세션
  • 프로파일링(요청을 완료하는 데 걸리는 시간 확인)
  • 캐싱
  • 보안(IP 주소를 기반으로 요청 거부 또는 요청 횟수 제한)
  • 정적 파일(css, js, png…) 제공

이는 매우 유용하며 Rails는 미들웨어를 잘 활용하여 일부 기능을 구현합니다. .

rake middleware로 미들웨어 목록을 볼 수 있습니다. Rails 프로젝트 내부.

이제 이 랙 인터페이스 앞서 언급했습니다.

어떻게 생겼나요?

예를 들어 보여드리겠습니다...

자신만의 랙 애플리케이션을 작성하는 방법

자신의 응용 프로그램을 작성하여 Rack이 어떻게 작동하는지 배울 수 있습니다.

해보자!

Rack 애플리케이션은 call 메소드가 하나인 클래스입니다. .

이렇게 생겼어요 :

require 'rack'

handler = Rack::Handler::Thin

class RackApp
  def call(env)
    [200, {"Content-Type" => "text/plain"}, "Hello from Rack"]
  end
end

handler.run RackApp.new

이 코드는 포트 8080에서 서버를 시작합니다(시도해보세요! ).

반환되는 이 배열은 무엇입니까?

  • HTTP 상태 코드(200)
  • HTTP 헤더("콘텐츠 유형")
  • 내용("Hello from Rack")

요청 세부 정보에 액세스하려면 env를 사용할 수 있습니다. 주장.

좋아요 :

req = Rack::Request.new(env)

사용 가능한 방법 :

  • 경로 정보(/articles/1)
  • IP(사용자)
  • user_agent(Chrome, Firefox, Safari…)
  • request_method(게시/게시)
  • 본문(내용)
  • 미디어 유형(일반, json, html)

이 정보를 사용하여 랙 애플리케이션을 구축할 수 있습니다. .

예를 들어 IP 주소가 5.5.5.5인 경우 콘텐츠에 대한 액세스를 거부할 수 있습니다. .

코드는 다음과 같습니다. :

require 'rack'

handler = Rack::Handler::Thin

class RackApp
  def call(env)
    req = Rack::Request.new(env)

    if req.ip == "5.5.5.5"
      [403, {}, ""]
    else
      [200, {"Content-Type" => "text/plain"}, "Hello from Rack"]
    end
  end
end

handler.run RackApp.new

주소를 127.0.0.1로 변경할 수 있습니다. 효과를 보고 싶다면

그래도 작동하지 않으면 ::1을(를) 시도하십시오. , localhost의 IPv6 버전.

랙 미들웨어 작성 및 사용 방법

지금:

애플리케이션과 미들웨어가 함께 작동하도록 어떻게 연결합니까?

Rack::Builder 사용 .

이해하는 가장 좋은 방법은 예를 들어보는 것입니다.

랙 앱은 다음과 같습니다. :

require 'rack'

handler = Rack::Handler::Thin

class RackApp
  def call(env)
    req = Rack::Request.new(env)

    [200, {"Content-Type" => "text/plain"}, "Hello from Rack - #{req.ip}"]
  end
end

미들웨어입니다 :

class FilterLocalHost
  def initialize(app)
    @app = app
  end

  def call(env)
    req = Rack::Request.new(env)

    if req.ip == "127.0.0.1" || req.ip == "::1"
      [403, {}, ""]
    else
      @app.call(env)
    end
  end
end

이것이 우리가 함께 결합하는 방법입니다. :

app =
Rack::Builder.new do |builder|
  builder.use FilterLocalHost
  builder.run RackApp.new
end

handler.run app

이 예에는 두 개의 랙 애플리케이션이 있습니다.

  • IP 확인용(FilterLocalHost) )
  • 애플리케이션 자체가 콘텐츠를 전달하기 위한 것(HTML, JSON 등)

@app.call(env) , 이것이 FilterLocalHost를 만드는 것입니다. 미들웨어.

다음 두 가지 중 하나가 발생할 수 있음 :

  • 미들웨어 체인을 중지하는 응답을 반환합니다.
  • @app.call(env)과 함께 요청을 전달합니다. 다음 미들웨어 또는 앱 자체로

미들웨어를 포함하여 Rack 앱의 모든 부분에서 응답을 변경할 수 있습니다.

:

class UpcaseAll
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, response = @app.call(env)

    response.upcase!

    [status, headers, response]
  end
end

이것이 바로 Rack이 작동하는 방식입니다 🙂

요약

Ruby 웹 프레임워크와 서버 간의 상호 작용을 주도하는 인터페이스인 Rack에 대해 배웠습니다. 또한 자신의 Rack 애플리케이션을 작성하여 작동 방식을 이해하는 방법도 배웠습니다.

질문이나 피드백이 있는 경우 아래에 댓글을 남겨주세요.

읽어주셔서 감사합니다!