রবিতে র্যাক মিডলওয়্যার কী? "মিডওয়্যারের" দ্বারা তারা কী বোঝায় তার কোনও ভাল ব্যাখ্যা আমি পাইনি।
রবিতে র্যাক মিডলওয়্যার কী? "মিডওয়্যারের" দ্বারা তারা কী বোঝায় তার কোনও ভাল ব্যাখ্যা আমি পাইনি।
উত্তর:
র্যাক মিডলওয়্যারটি "একটি অনুরোধ এবং প্রতিক্রিয়া ফিল্টার করার উপায়" এর চেয়ে বেশি - এটি র্যাক ব্যবহার করে ওয়েব সার্ভারগুলির জন্য পাইপলাইন ডিজাইন প্যাটার্নের একটি বাস্তবায়ন ।
এটি একটি অনুরোধ প্রক্রিয়াকরণের বিভিন্ন পর্যায়ে খুব পরিষ্কারভাবে পৃথক করে - সমস্ত ভালভাবে ডিজাইন করা সফ্টওয়্যার পণ্যগুলির মূল লক্ষ্য হিসাবে উদ্বেগের বিচ্ছেদ।
উদাহরণস্বরূপ র্যাকের সাথে আমি পাইপলাইন করার পৃথক পর্যায় থাকতে পারি:
প্রমাণীকরণ : যখন অনুরোধ আসে, ব্যবহারকারীগণ লগইন বিশদ সঠিক? এই ওআউথ, এইচটিটিপি বেসিক অথেনটিকেশন, নাম / পাসওয়ার্ডকে আমি কীভাবে যাচাই করব?
অনুমোদন : "ব্যবহারকারী কি এই বিশেষ কাজটি সম্পাদনের জন্য অনুমোদিত?", অর্থাৎ ভূমিকা-ভিত্তিক সুরক্ষা।
ক্যাশিং : আমি কি এই অনুরোধটি ইতিমধ্যে প্রক্রিয়া করেছি, আমি কি ক্যাশেড ফলাফল দিতে পারি?
সজ্জা : ডাউনস্ট্রিম প্রসেসিং আরও ভাল করার জন্য আমি কীভাবে অনুরোধটি বাড়িয়ে তুলতে পারি?
পারফরম্যান্স এবং ব্যবহার নিরীক্ষণ : অনুরোধ এবং প্রতিক্রিয়া থেকে আমি কোন পরিসংখ্যান পেতে পারি?
সম্পাদন : আসলে অনুরোধটি পরিচালনা করুন এবং প্রতিক্রিয়া সরবরাহ করুন।
বিভিন্ন স্টেজে আলাদা করতে সক্ষম হওয়া (এবং optionচ্ছিকভাবে সেগুলি অন্তর্ভুক্ত করা) ভাল কাঠামোগত অ্যাপ্লিকেশনগুলির বিকাশে একটি দুর্দান্ত সহায়তা।
র্যাক মিডলওয়্যারের আশেপাশে একটি দুর্দান্ত ইকো-সিস্টেম বিকাশ রয়েছে - উপরে এবং আরও অনেকগুলি পদক্ষেপের জন্য আপনি প্রাক বিল্ট র্যাক উপাদানগুলি সন্ধান করতে সক্ষম হবেন। মিডলওয়্যারের তালিকার জন্য র্যাক গিটহাব উইকি দেখুন ।
মিডলওয়্যার একটি ভয়ঙ্কর শব্দ যা কোনও সফ্টওয়্যার উপাদান / গ্রন্থাগারকে বোঝায় যা সহায়তা করে তবে কোনও কার্য সম্পাদনে সরাসরি জড়িত থাকে না। খুব সাধারণ উদাহরণ হ'ল লগিং, প্রমাণীকরণ এবং অন্যান্য সাধারণ, অনুভূমিক প্রক্রিয়াকরণ উপাদান । এগুলি প্রত্যেকের একাধিক অ্যাপ্লিকেশন জুড়ে যে জিনিসগুলির প্রয়োজন তা হতে থাকে তবে খুব বেশি লোক নিজের তৈরি করতে আগ্রহী (বা হওয়া উচিত) নয়।
অনুরোধগুলি ফিল্টার করার উপায় হিসাবে এটি সম্পর্কে মন্তব্য সম্ভবত রেলকাস্ট পর্ব 151 থেকে এসেছে : র্যাক মিডলওয়্যার স্ক্রিন কাস্ট।
তাক মিডলওয়্যার তাক থেকে বের প্রসূত এবং সেখানে এ মহান ইন্ট্রো হয় ভূমিকা মিডলওয়্যার আলনা ।
সেখানে উইকিপিডিয়াতে মিডলওয়্যার করতে একটি ভূমিকা আছে এখানে ।
প্রথমত, র্যাক হ'ল দুটি জিনিস:
র্যাক - ওয়েব সার্ভার ইন্টারফেস
র্যাকের মূল বিষয়গুলি একটি সাধারণ সম্মেলন। প্রতিটি র্যাকের সাথে সঙ্গতিপূর্ণ ওয়েবসারভার আপনি যে কোনও বস্তু তাকে দিয়েছেন তার কাছে সবসময় একটি কল পদ্ধতি কল করবে এবং সেই পদ্ধতির ফলাফল পরিবেশন করবে। এই কল পদ্ধতিটি দেখতে কীভাবে দেখতে হবে এবং কী ফিরে আসতে হবে তা র্যাক নির্দিষ্ট করে। এটা রাক।
আসুন এটি একটি সহজ চেষ্টা দিন। আমি WEBrick কে র্যাক কমপ্লায়েন্ট ওয়েবসার্ভার হিসাবে ব্যবহার করব, তবে তাদের মধ্যে যে কেউ তা করবে। আসুন একটি সাধারণ ওয়েব অ্যাপ্লিকেশন তৈরি করি যা একটি JSON স্ট্রিং প্রদান করে। এর জন্য আমরা কনফিগার.আরউ নামে একটি ফাইল তৈরি করব। কনফিগার.আরকে স্বয়ংক্রিয়ভাবে রাক রত্নের কমান্ড রাকআপ দ্বারা ডাকা হবে যা রেক-কমপ্লায়েন্ট ওয়েবসার্ভারে কনফিগাররিউয়ের বিষয়বস্তুগুলি কেবল চালাবে। সুতরাং কনফিগার.আর ফাইলটিতে নিম্নলিখিতটি যুক্ত করা যাক:
class JSONServer
def call(env)
[200, {"Content-Type" => "application/json"}, ['{ "message" : "Hello!" }']]
end
end
map '/hello.json' do
run JSONServer.new
end
কনভেনশনটি সুনির্দিষ্টভাবে বলে যে আমাদের সার্ভারে কল নামক একটি পদ্ধতি রয়েছে যা একটি পরিবেশের হ্যাশ গ্রহণ করে এবং ওয়েবসার্ভার পরিবেশন করার জন্য [স্ট্যাটাস, শিরোনাম, বডি] ফর্মের সাথে একটি অ্যারের ফিরিয়ে দেয়। আসুন কেবল র্যাকআপ কল করে এটি ব্যবহার করে দেখুন। একটি ডিফল্ট র্যাক কমপ্লায়েন্ট সার্ভার, সম্ভবত WEBrick বা মংগ্রেল শুরু হবে এবং তত্ক্ষণাত পরিষেবা দেওয়ার অনুরোধের জন্য অপেক্ষা করবে।
$ rackup
[2012-02-19 22:39:26] INFO WEBrick 1.3.1
[2012-02-19 22:39:26] INFO ruby 1.9.3 (2012-01-17) [x86_64-darwin11.2.0]
[2012-02-19 22:39:26] INFO WEBrick::HTTPServer#start: pid=16121 port=9292
ইউআরএল http://localhost:9292/hello.json
এবং ভয়েলা কার্লিং করে বা পরিদর্শন করে আমাদের নতুন জেএসএন সার্ভারটি পরীক্ষা করি :
$ curl http://localhost:9292/hello.json
{ message: "Hello!" }
এটা কাজ করে। গ্রেট! এটি প্রতিটি ওয়েব ফ্রেমওয়ার্কের ভিত্তি, এটি রেল বা সিনেট্রা হোক। কিছু সময়ে তারা একটি কল পদ্ধতি প্রয়োগ করে, সমস্ত ফ্রেমওয়ার্ক কোডের মাধ্যমে কাজ করে এবং অবশেষে টিপিক্যাল [স্ট্যাটাস, শিরোনাম, বডি] আকারে প্রতিক্রিয়া ফিরিয়ে দেয়।
উদাহরণস্বরূপ রেল অন রুবেলে রাকের অনুরোধগুলি ক্লাসটিকে হিট করে ActionDispatch::Routing.Mapper
যা এইরকম দেখাচ্ছে:
module ActionDispatch
module Routing
class Mapper
...
def initialize(app, constraints, request)
@app, @constraints, @request = app, constraints, request
end
def matches?(env)
req = @request.new(env)
...
return true
end
def call(env)
matches?(env) ? @app.call(env) : [ 404, {'X-Cascade' => 'pass'}, [] ]
end
...
end
end
সুতরাং মূলত রেল চেকগুলি, কোনও রুটের সাথে মেলে যদি এনভি হ্যাশের উপর নির্ভর করে। যদি তাই হয় তবে এই প্রতিবেদনের গণনা করার জন্য এএনভি হ্যাশটি অ্যাপ্লিকেশনটিতে চলে যায়, অন্যথায় এটি অবিলম্বে একটি 404 এর সাথে সাড়া দেয় So সুতরাং কোনও ওয়েবসার্ভার যা র্যাক ইন্টারফেস কনভেনশনটির সাথে সম্মতিযুক্ত, একটি সম্পূর্ণরূপে বিকশিত রেল অ্যাপ্লিকেশন পরিবেশন করতে সক্ষম।
মিডলওয়্যার
র্যাক মিডলওয়্যার স্তরগুলি তৈরি করতেও সমর্থন করে। তারা মূলত একটি অনুরোধকে বাধা দেয়, এটির সাথে কিছু করুন এবং এটি পাস করুন। বহুমুখী কাজের জন্য এটি খুব দরকারী।
ধরা যাক আমরা আমাদের JSON সার্ভারে লগিং যুক্ত করতে চাই যা একটি অনুরোধটি কত সময় নেয় তাও পরিমাপ করে। আমরা কেবল একটি মিডলওয়্যার লগার তৈরি করতে পারি যা ঠিক এটি করে:
class RackLogger
def initialize(app)
@app = app
end
def call(env)
@start = Time.now
@status, @headers, @body = @app.call(env)
@duration = ((Time.now - @start).to_f * 1000).round(2)
puts "#{env['REQUEST_METHOD']} #{env['REQUEST_PATH']} - Took: #{@duration} ms"
[@status, @headers, @body]
end
end
এটি তৈরি হয়ে গেলে, এটি আসল রাক অ্যাপ্লিকেশনটির একটি অনুলিপি নিজেকে সংরক্ষণ করে। আমাদের ক্ষেত্রে এটি আমাদের JSONSverver এর উদাহরণ। মিডলওয়্যারটিতে কলটি স্বয়ংক্রিয়ভাবে কল পদ্ধতিতে কল করে এবং [status, headers, body]
আমাদের জেএসএন সার্ভারের মতো ফিরে আসার প্রত্যাশা করে ।
সুতরাং এই মিডওয়্যারটিতে স্টার্ট পয়েন্টটি নেওয়া হয়, তারপরে JSONServer এ আসল কলটি করা হয় @app.call(env)
, তারপরে লগার লগিং এন্ট্রি আউটপুট করে এবং অবশেষে প্রতিক্রিয়া হিসাবে ফিরে আসে [@status, @headers, @body]
।
আমাদের ছোট্ট rackup.ru এই মিডলওয়্যারটি ব্যবহার করতে, এটির জন্য এটির মতো একটি র্যাকলগার যুক্ত করুন:
class JSONServer
def call(env)
[200, {"Content-Type" => "application/json"}, ['{ "message" : "Hello!" }']]
end
end
class RackLogger
def initialize(app)
@app = app
end
def call(env)
@start = Time.now
@status, @headers, @body = @app.call(env)
@duration = ((Time.now - @start).to_f * 1000).round(2)
puts "#{env['REQUEST_METHOD']} #{env['REQUEST_PATH']} - Took: #{@duration} ms"
[@status, @headers, @body]
end
end
use RackLogger
map '/hello.json' do
run JSONServer.new
end
সার্ভারটি পুনরায় চালু করুন এবং ভয়েলা, এটি প্রতিটি অনুরোধে একটি লগ আউটপুট দেয়। র্যাক আপনাকে একাধিক মিডলওয়্যার যুক্ত করতে দেয় যা তাদের যুক্ত করা ক্রমে ডাকা হয়। র্যাক অ্যাপ্লিকেশনটির মূলটি পরিবর্তন না করেই কার্যকারিতা যুক্ত করার এটি দুর্দান্ত এক উপায়।
রাক - রত্ন
যদিও র্যাক - প্রথমত - এটি একটি কনভেনশন এটিও একটি রত্ন যা দুর্দান্ত কার্যকারিতা সরবরাহ করে। এর মধ্যে একটি আমরা ইতিমধ্যে আমাদের JSON সার্ভার, র্যাকআপ কমান্ডের জন্য ব্যবহার করেছি। তবে আরও আছে! রাক মণি স্ট্যাটিক ফাইল বা এমনকি পুরো ডিরেক্টরি সরবরাহ করার মতো প্রচুর ব্যবহারের ক্ষেত্রে খুব কম অ্যাপ্লিকেশন সরবরাহ করে। আসুন আমরা কীভাবে একটি সহজ ফাইল পরিবেশন করি তা উদাহরণস্বরূপ htmls / index.html এ অবস্থিত একটি খুব প্রাথমিক HTML ফাইল:
<!DOCTYPE HTML>
<html>
<head>
<title>The Index</title>
</head>
<body>
<p>Index Page</p>
</body>
</html>
আমরা সম্ভবত ওয়েবসাইটের মূল থেকে এই ফাইলটি পরিবেশন করতে চাই, সুতরাং আসুন আমাদের কনফিগারেশনগুলিতে নিম্নলিখিতগুলি যুক্ত করুন:
map '/' do
run Rack::File.new "htmls/index.html"
end
আমরা যদি ঘুরে http://localhost:9292
দেখি তবে আমাদের এইচটিএমএল ফাইলটি নিখুঁতভাবে রেন্ডার হয়েছে। এটা সহজ ছিল, তাই না?
আসুন / জাভাস্ক্রিপ্টের অধীনে কিছু জাভাস্ক্রিপ্ট ফাইল তৈরি করে এবং কনফিগারেশনে নিম্নলিখিতটি যুক্ত করে জাভাস্ক্রিপ্ট ফাইলগুলির একটি সম্পূর্ণ ডিরেক্টরি যুক্ত করব:
map '/javascripts' do
run Rack::Directory.new "javascripts"
end
সার্ভারটি পুনরায় আরম্ভ করুন এবং দেখুন http://localhost:9292/javascript
এবং আপনি যে কোনও জাভাস্ক্রিপ্ট ফাইলগুলির তালিকা দেখতে পাবেন যে কোনও জায়গা থেকে এখনই আপনি অন্তর্ভুক্ত করতে পারেন।
আমার খুব ভাল সময়ের জন্য র্যাকটি বুঝতে সমস্যা হয়েছিল। আমি নিজেই এই ক্ষুদ্র রুবি ওয়েব সার্ভারটি তৈরির কাজ করার পরে এটি পুরোপুরি বুঝতে পেরেছি । আমি আমার ব্লগে রাক (গল্পের আকারে) সম্পর্কে আমার শিক্ষাগুলি এখানে ভাগ করেছি: http://gauravchande.com/ কি-is-rack- in- ruby-rails
মতামত স্বাগত চেয়ে বেশি।
config.ru
ন্যূনতম চলমান উদাহরণ
app = Proc.new do |env|
[
200,
{
'Content-Type' => 'text/plain'
},
["main\n"]
]
end
class Middleware
def initialize(app)
@app = app
end
def call(env)
@status, @headers, @body = @app.call(env)
[@status, @headers, @body << "Middleware\n"]
end
end
use(Middleware)
run(app)
দৌড়ে rackup
গিয়ে দর্শন করুন localhost:9292
। আউটপুটটি হ'ল:
main
Middleware
সুতরাং এটি পরিষ্কার যে Middleware
মুখ্য অ্যাপ্লিকেশনটিকে মোড়ক করে এবং কল করে। সুতরাং এটি অনুরোধটি প্রাক-প্রক্রিয়া করতে এবং কোনওভাবেই প্রতিক্রিয়া পোস্ট-প্রক্রিয়া করতে সক্ষম।
যেমনটি এখানে ব্যাখ্যা করা হয়েছে: http://guides.rubyonrails.org/rails_on_rack.html#action-dispatcher-moodware-stack , রেলগুলি র্যাক মিডলওয়্যারগুলি এর কার্যকারিতার জন্য অনেকগুলি ব্যবহার করে এবং আপনি config.middleware.use
পারিবারিক পদ্ধতিতে নিজেরও যুক্ত করতে পারেন ।
মিডলওয়্যারটিতে কার্যকারিতা বাস্তবায়নের সুবিধা হ'ল আপনি এটি কোনও র্যাক ফ্রেমওয়ার্কে পুনরায় ব্যবহার করতে পারেন, এইভাবে সমস্ত বড় রুবি, কেবলমাত্র রেলগুলি নয়।
আপনার অ্যাপ্লিকেশনটিতে আসা একটি অনুরোধ এবং প্রতিক্রিয়া ফিল্টার করার জন্য র্যাক মিডলওয়্যার একটি উপায়। মিডলওয়্যার উপাদানটি ক্লায়েন্ট এবং সার্ভারের মধ্যে বসে ইনবাউন্ড অনুরোধগুলি এবং আউটবাউন্ড প্রতিক্রিয়াগুলি প্রক্রিয়া করে তবে এটি ইন্টারফেসের চেয়ে বেশি যা ওয়েব সার্ভারের সাথে কথা বলার জন্য ব্যবহৃত হতে পারে। এটি মডিউলগুলি গ্রুপ এবং অর্ডার করার জন্য ব্যবহৃত হয় যা সাধারণত রুবি ক্লাস হয় এবং তাদের মধ্যে নির্ভরতা নির্দিষ্ট করে। র্যাক মিডলওয়্যার মডিউলটি কেবলমাত্র: - কনস্ট্রাক্টর রয়েছে যা পরের অ্যাপ্লিকেশনটিকে প্যারামিটার হিসাবে গ্রহণ করে - "কল" পদ্ধতিতে প্রতিক্রিয়া জানায়, এটি প্যারামিটার হিসাবে পরিবেশ হ্যাশ নেয়। এই কলটি থেকে মান ফেরত দেওয়া একটি অ্যারে: স্থিতি কোড, পরিবেশ হ্যাশ এবং প্রতিক্রিয়া বডি।
আমি কয়েকটি সমস্যার সমাধান করতে র্যাক মিডলওয়্যার ব্যবহার করেছি:
উভয় ক্ষেত্রে এটি বেশ মার্জিত সংশোধন করেছে।
র্যাব রুবি এবং রুবি ফ্রেমওয়ার্কগুলিকে সমর্থনকারী ওয়েব সার্ভারের মধ্যে একটি ন্যূনতম ইন্টারফেস সরবরাহ করে।
র্যাক ব্যবহার করে আপনি একটি র্যাক অ্যাপ্লিকেশন লিখতে পারেন।
র্যাক আপনার র্যাক অ্যাপ্লিকেশনটিতে এনভায়রনমেন্ট হ্যাশ (একটি হ্যাশ, একটি ক্লায়েন্টের কাছ থেকে এইচটিটিপি অনুরোধের অন্তর্ভুক্ত, সিজিআই-এর মতো শিরোলেখের) প্রেরণ করবে যা এই হ্যাশের থাকা জিনিসগুলি যা খুশি তাই ব্যবহার করতে পারে।
র্যাকটি ব্যবহার করতে, আপনাকে অবশ্যই একটি 'অ্যাপ' সরবরাহ করতে হবে - এমন একটি বস্তু যা #call
পরিবেশের হ্যাশটির সাথে প্যারামিটার হিসাবে পদ্ধতিটির প্রতিক্রিয়া জানায় (সাধারণত হিসাবে সংজ্ঞায়িত হয় env
)। #call
অবশ্যই তিনটি মানের একটি অ্যারে প্রদান করতে হবে:
each
)।আপনি একটি র্যাক অ্যাপ্লিকেশন লিখতে পারেন যা এই জাতীয় অ্যারে দেয় - এটি আপনার ক্লায়েন্টকে র্যাকের মাধ্যমে একটি প্রতিক্রিয়াতে ফেরত পাঠানো হবে (এটি আসলে শ্রেণীর উদাহরণ হতে পারে Rack::Response
[ডক্সে যাওয়ার জন্য ক্লিক করুন])।
gem install rack
config.ru
ফাইল তৈরি করুন - র্যাক এটি সন্ধান করতে জানে।আমরা একটি ক্ষুদ্র তাক আবেদন করে একটি প্রতিক্রিয়া (একটি দৃষ্টান্ত ফেরৎ তৈরি করবে Rack::Response
) যিনি প্রতিক্রিয়া দেহ একটি অ্যারের একটি স্ট্রিং রয়েছে: "Hello, World!"
।
কমান্ডটি ব্যবহার করে আমরা একটি স্থানীয় সার্ভার ফায়ার করব rackup
।
আমাদের ব্রাউজারে প্রাসঙ্গিক বন্দর দেখার সময় আমরা "হ্যালো, ওয়ার্ল্ড!" দেখতে পাব ভিউপোর্টে রেন্ডার করা।
#./message_app.rb
class MessageApp
def call(env)
[200, {}, ['Hello, World!']]
end
end
#./config.ru
require_relative './message_app'
run MessageApp.new
স্থানীয় সার্ভার দিয়ে আগুন জ্বালান rackup
এবং লোকালহোস্ট দেখুন: 9292 এবং আপনার 'হ্যালো, ওয়ার্ল্ড!' দেখতে পাওয়া উচিত অনুষ্ঠিত.
এটি কোনও বিস্তৃত ব্যাখ্যা নয়, তবে মূলত এখানে যা ঘটে তা হ'ল ক্লায়েন্ট (ব্রাউজার) আপনার স্থানীয় সার্ভারের মাধ্যমে র্যাকের জন্য একটি HTTP অনুরোধ প্রেরণ করে এবং র্যাকটি ইনস্ট্যান্টিয়েট করে MessageApp
এবং চালায় call
, পদ্ধতিটিতে প্যারামিটার হিসাবে পরিবেশগত হ্যাশ পেরিয়ে যায় ( env
যুক্তি)।
র্যাকটি রিটার্ন মান (অ্যারে) নেয় এবং এটির উদাহরণ তৈরি করতে এটি ব্যবহার করে Rack::Response
এবং ক্লায়েন্টকে এটি প্রেরণ করে। ব্রাউজারটি 'হ্যালো, ওয়ার্ল্ড!' মুদ্রণের জন্য যাদু ব্যবহার করে ! পর্দায়।
ঘটনাচক্রে, যদি আপনি পরিবেশের হ্যাশ দেখতে কেমন দেখতে চান তবে কেবল puts env
নীচে রাখুন def call(env)
।
এটি যেমন ন্যূনতম, আপনি এখানে যা লিখেছেন তা একটি র্যাক অ্যাপ্লিকেশন!
আমাদের ছোট্ট র্যাক অ্যাপ্লিকেশনটিতে আমরা হ্যাশটির সাথে যোগাযোগ করতে পারি env
( এনভায়রনমেন্ট হ্যাশ সম্পর্কে আরও জানতে এখানে দেখুন)।
আমরা ব্যবহারকারীর জন্য নিজস্ব ক্যোয়ারী স্ট্রিংটি ইউআরএল-তে ইনপুট করার দক্ষতাটি প্রয়োগ করব, সুতরাং, সেই স্ট্রিংটি এইচটিটিপি অনুরোধে উপস্থিত থাকবে, পরিবেশের হ্যাশের কী / মান জোড়গুলির মধ্যে একটিতে মান হিসাবে আবদ্ধ হয়।
আমাদের র্যাক অ্যাপ্লিকেশনটি পরিবেশের হ্যাশ থেকে সেই ক্যোয়ারী স্ট্রিংটি অ্যাক্সেস করবে এবং প্রতিক্রিয়ার বডি এর মাধ্যমে ক্লায়েন্টকে (আমাদের ব্রাউজার, এই ক্ষেত্রে) ফেরত পাঠাবে case
এনভায়রনমেন্ট হ্যাশ র্যাক ডকস থেকে: "QUERY_STRING: অনুরোধ ইউআরএল এর যে অংশটি অনুসরণ করে?, যদি থাকে? খালি থাকতে পারে, তবে সর্বদা প্রয়োজন!"
#./message_app.rb
class MessageApp
def call(env)
message = env['QUERY_STRING']
[200, {}, [message]]
end
end
এখন, rackup
এবং দেখুন localhost:9292?hello
( ?hello
ক্যোয়ারী স্ট্রিং হচ্ছে) এবং আপনার ভিউপোর্টে 'হ্যালো' রেন্ডার করা উচিত।
আমরা করব:
MessageSetter
,env
,MessageSetter
একটি ঢোকাব 'MESSAGE'
env হ্যাশ মধ্যে কী, এর মান হচ্ছে 'Hello, World!'
যদি env['QUERY_STRING']
খালি; env['QUERY_STRING']
যদি না,@app.call(env)
- @app
'স্ট্যাক' থেকে পরবর্তী অ্যাপ্লিকেশন হচ্ছে: MessageApp
।প্রথমত, 'দীর্ঘ-হাত' সংস্করণ:
#./middleware/message_setter.rb
class MessageSetter
def initialize(app)
@app = app
end
def call(env)
if env['QUERY_STRING'].empty?
env['MESSAGE'] = 'Hello, World!'
else
env['MESSAGE'] = env['QUERY_STRING']
end
@app.call(env)
end
end
#./message_app.rb (same as before)
class MessageApp
def call(env)
message = env['QUERY_STRING']
[200, {}, [message]]
end
end
#config.ru
require_relative './message_app'
require_relative './middleware/message_setter'
app = Rack::Builder.new do
use MessageSetter
run MessageApp.new
end
run app
থেকে তাক :: নির্মাতা ডক্স আমরা দেখতে Rack::Builder
কার্যকরী iteratively এই কনস্ট্রাক্ট তাক অ্যাপ্লিকেশন একটি ছোট ডিএসএল। এর মূল অর্থ হল আপনি এক বা একাধিক মিডলওয়্যারের সমন্বয়ে একটি 'স্ট্যাক' এবং প্রেরণের জন্য 'নীচের স্তরের' অ্যাপ্লিকেশনটি তৈরি করতে পারেন। আপনার নীচের স্তরের অ্যাপ্লিকেশনটিতে যাবার সমস্ত অনুরোধগুলি প্রথমে আপনার মিডলওয়্যার দ্বারা প্রক্রিয়া করা হবে।
#use
স্ট্যাকে মিডলওয়্যার ব্যবহার করতে নির্দিষ্ট করে। এটি মিডলওয়্যারটিকে আর্গুমেন্ট হিসাবে গ্রহণ করে।
র্যাক মিডলওয়্যার অবশ্যই:
call
পরিবেশের হ্যাশটিকে প্যারামিটার হিসাবে গ্রহণ করে এমন পদ্ধতিতে প্রতিক্রিয়া জানান ।আমাদের ক্ষেত্রে, ' MessageSetter
মিডলওয়্যার ' হ'ল , 'কনস্ট্রাক্টর' হ'ল মেসেজশিটারের initialize
পদ্ধতি, স্ট্যাকের 'পরবর্তী অ্যাপ্লিকেশন' MessageApp
।
সুতরাং এখানে, Rack::Builder
হুডের নীচে কী করে, এর পদ্ধতির app
যুক্তিটি হ'ল ।MessageSetter
initialize
MessageApp
(এগিয়ে যাওয়ার আগে উপরের দিকে আপনার মাথা পেতে)
সুতরাং, মিডলওয়্যারের প্রতিটি টুকরাই মূলত বিদ্যমান পরিবেশ হ্যাশটিকে চেইনের পরবর্তী অ্যাপ্লিকেশনটিতে 'পাস' করে দেয় - সুতরাং স্ট্যাকের পরবর্তী অ্যাপ্লিকেশনটিতে যাওয়ার আগে মিডলওয়্যারের মধ্যে সেই পরিবেশের হ্যাশটিকে রূপান্তর করার সুযোগ আপনার রয়েছে।
#run
একটি আর্গুমেন্ট গ্রহণ করে যা এমন একটি বস্তু যা প্রতিক্রিয়া জানায় #call
এবং একটি র্যাক প্রতিক্রিয়া দেয় (একটি উদাহরণ Rack::Response
)।
ব্যবহার Rack::Builder
আপনি (, আমাদের ক্ষেত্রে Middlewares শৃঙ্খল এবং আপনার অ্যাপ্লিকেশান কোনো অনুরোধ প্রতিটি মিডলওয়্যার দ্বারা পরিশেষে স্ট্যাক চূড়ান্ত টুকরা দ্বারা প্রক্রিয়াকৃত হওয়ার আগে ঘুরে প্রক্রিয়া করা হবে গঠন করা যেতে পারে MessageApp
)। এটি অত্যন্ত কার্যকর কারণ এটি প্রক্রিয়াকরণের অনুরোধগুলির বিভিন্ন পর্যায়ে আলাদা করে দেয়। 'উদ্বেগের বিচ্ছেদ' এর বিচারে এটি আরও পরিষ্কার হতে পারে না!
আপনি বেশ কয়েকটি মিডলওয়্যারের সমন্বয়ে একটি 'অনুরোধ পাইপলাইন' তৈরি করতে পারেন যা এই জাতীয় জিনিসগুলিতে ডিল করে:
(উপরের বুলেট পয়েন্টগুলি এই থ্রেডের অন্য উত্তর থেকে)
আপনি প্রায়শই পেশাদার সিনেট্রা অ্যাপ্লিকেশনগুলিতে এটি দেখতে পাবেন। সিনাত্রা র্যাক ব্যবহার করে! দেখুন এখানে কি Sinatra, সংজ্ঞা জন্য IS !
চূড়ান্ত নোট হিসাবে, আমাদের config.ru
শর্ট-হ্যান্ড স্টাইলে লিখিত হতে পারে ঠিক একই কার্যকারিতা তৈরি করে (এবং এটিই আপনি সাধারণত দেখতে পাবেন):
require_relative './message_app'
require_relative './middleware/message_setter'
use MessageSetter
run MessageApp.new
এবং কী MessageApp
করছে তা আরও স্পষ্টভাবে দেখানোর জন্য, এটির 'লম্বা হাত' সংস্করণটি স্পষ্টভাবে দেখায় যে প্রয়োজনীয় তিনটি যুক্তি সহ #call
একটি নতুন উদাহরণ তৈরি করছে Rack::Response
।
class MessageApp
def call(env)
Rack::Response.new([env['MESSAGE']], 200, {})
end
end
রাক - ইন্টারফেস বি / ডাব্লু ওয়েব এবং অ্যাপ্লিকেশন সার্ভার
র্যাক একটি রুবি প্যাকেজ যা ওয়েব সার্ভারের সাথে অ্যাপ্লিকেশনটির সাথে যোগাযোগের জন্য একটি ইন্টারফেস সরবরাহ করে। আপনার অনুরোধ / প্রতিক্রিয়াটি যেভাবে আচরণ করে তা সংশোধন করতে ওয়েব সার্ভার এবং অ্যাপের মধ্যে মিডলওয়্যার উপাদান যুক্ত করা সহজ। মিডওয়্যার উপাদানটি ক্লায়েন্ট এবং সার্ভারের মধ্যে বসে ইনবাউন্ড অনুরোধগুলি এবং আউটবাউন্ড প্রতিক্রিয়াগুলি প্রসেস করে।
সাধারণ কথায়, এটি সার্ভার এবং একটি রেল অ্যাপ (বা অন্য কোনও রুবি ওয়েব অ্যাপ্লিকেশন) একে অপরের সাথে কীভাবে কথা বলতে হবে সে সম্পর্কে মূলত গাইডলাইনগুলির একটি সেট ।
র্যাকটি ব্যবহার করতে, একটি "অ্যাপ্লিকেশন" সরবরাহ করুন: এমন একটি বস্তু যা কল পদ্ধতির প্রতিক্রিয়া জানায়, পরিবেশ হ্যাশটিকে প্যারামিটার হিসাবে গ্রহণ করে এবং তিনটি উপাদান সহ একটি অ্যারে ফিরিয়ে দেয়:
আরও ব্যাখ্যার জন্য, আপনি নীচের লিঙ্কগুলি অনুসরণ করতে পারেন।
1. https://rack.github.io/
2. https://redpanthers.co/rack-middleware/
3. https://blog.engineyard.com/2015/understanding-rack-apps-and-middleware
4. https://guides.rubyonrails.org/rails_on_rack.html#resources
রেলগুলিতে, আমাদের একটি রেক ফাইল হিসাবে কনফিগার.আর রয়েছে, আপনি rackup
কমান্ড দিয়ে যে কোনও রেক ফাইল চালাতে পারেন । এবং এটির জন্য ডিফল্ট পোর্ট 9292
। এটি পরীক্ষা করতে, আপনি কেবল rackup
আপনার রেল ডিরেক্টরিতে চালাতে পারেন এবং ফলাফলটি দেখতে পারেন। আপনি যে পোর্টটি চালাতে চান তাও নির্ধারণ করতে পারেন। যে কোনও নির্দিষ্ট পোর্টে র্যাক ফাইল চালানোর কমান্ড
rackup -p PORT_NUMBER
রাক হ'ল একটি মণি যা এইচটিটিপি অনুরোধ / প্রতিক্রিয়া বিমূর্ত করার জন্য একটি সাধারণ ইন্টারফেস সরবরাহ করে। অ্যাডাপ্টার হিসাবে রাক ওয়েব ফ্রেমওয়ার্ক (রেলস, সিনেট্রা ইত্যাদি) এবং ওয়েব সার্ভারের (ইউনিকর্ন, পুমা) মধ্যে বসে। উপরের চিত্রটি থেকে এটি ইউনিকর্ন সার্ভারটিকে রেল এবং রেল সম্পর্কে জানা থেকে সম্পূর্ণ স্বাধীন রাখে এবং ইউনিকর্ন সম্পর্কে জানে না। এটি আলগা দম্পতি , উদ্বেগ পৃথককরণের একটি ভাল উদাহরণ ।
উপরের চিত্রটি রেল https://youtu.be/3PnUV9QzB0g এ রেল সম্মেলনের আলাপ থেকে আমি গভীর বোঝার জন্য এটি দেখার পরামর্শ দিই।