প্রতিটি রেল, সিনাত্রা এবং অন্যান্য রুবি ওয়েব ফ্রেমওয়ার্কের নেপথ্যে কী ঘটছে?
উত্তর হল র্যাক, মূল উপাদান যা এটি সম্ভব করে তোলে।
কিন্তু র্যাক আসলে কি?
র্যাক হল ফ্রেমওয়ার্ক (রেল) এবং অ্যাপ্লিকেশন সার্ভার (পুমা) এর মধ্যে একটি স্তর।
এটি সেই আঠা যা তাদের যোগাযোগ করতে দেয়।
কেন আমরা র্যাক ব্যবহার করি?
আমরা র্যাক ব্যবহার করি কারণ এটি বিভিন্ন ফ্রেমওয়ার্ক এবং সার্ভারকে বিনিময়যোগ্য হতে দেয়।
এগুলি উপাদান হয়ে ওঠে যা আপনি প্লাগ-ইন করতে পারেন৷ .
এর অর্থ হল আপনি রেল, সিনাট্রা এবং অন্য যেকোন র্যাক-সামঞ্জস্যপূর্ণ কাঠামোর সাথে পুমা ব্যবহার করতে পারেন। আপনি কোন ফ্রেমওয়ার্ক বা সার্ভার ব্যবহার করছেন তা বিবেচ্য নয় যদি তারা র্যাক ইন্টারফেস প্রয়োগ করে .
র্যাকের সাথে, প্রতিটি উপাদান তার কাজ করে এবং সবাই খুশি!
র্যাক মিডলওয়্যার কি?
র্যাক প্রতিটি ওয়েব অনুরোধ এবং প্রতিক্রিয়ার মাঝখানে বসে।
ফলস্বরূপ, এটি একটি অভিভাবক হিসাবে কাজ করতে পারে, অবাঞ্ছিত অনুরোধগুলিতে অ্যাক্সেস অস্বীকার করে, অথবা এটি ধীর প্রতিক্রিয়াগুলির ট্র্যাক রেখে ইতিহাসবিদ হিসাবে কাজ করতে পারে৷
এটাই র্যাক মিডলওয়্যার হয়!
ছোট রুবি প্রোগ্রাম যা অনুরোধ-প্রতিক্রিয়া চক্রের অংশ হিসাবে ডাকা হয় এবং এটির সাথে কিছু করার সুযোগ পায়।
এটি কোন ধরনের জিনিসের জন্য ব্যবহার করা হয়?
- লগিং
- সেশনগুলি
- প্রোফাইলিং (একটি অনুরোধ সম্পূর্ণ হতে কত সময় লাগে তা খুঁজে বের করুন)
- ক্যাশিং
- নিরাপত্তা (আইপি ঠিকানার উপর ভিত্তি করে অনুরোধ অস্বীকার করুন, বা অনুরোধের # সীমা)
- স্ট্যাটিক ফাইল পরিবেশন করা হচ্ছে (css, js, png…)
এগুলি বেশ দরকারী এবং রেলগুলি এর কিছু কার্যকারিতা বাস্তবায়নের জন্য মিডলওয়্যারের ভাল ব্যবহার করে .
আপনি rake middleware
সহ মিডলওয়্যারের একটি তালিকা দেখতে পারেন একটি রেল প্রকল্পের ভিতরে।
এখন, এই র্যাক ইন্টারফেস আমি আগে উল্লেখ করেছি৷
এটা দেখতে কেমন?
আমাকে একটি উদাহরণ সহ দেখান...
আপনার নিজের র্যাক অ্যাপ্লিকেশন কিভাবে লিখবেন
আপনি আপনার নিজের অ্যাপ্লিকেশন লিখে রাক কিভাবে কাজ করে তা শিখতে পারেন।
এটা করা যাক!
একটি র্যাক অ্যাপ্লিকেশন হল একটি পদ্ধতি সহ একটি ক্লাস: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 হেডার ("কন্টেন্ট-টাইপ")
- বিষয়বস্তু ("হ্যালো ফ্রম র্যাক")
আপনি যদি অনুরোধের বিবরণ অ্যাক্সেস করতে চান তাহলে আপনি env
ব্যবহার করতে পারেন যুক্তি।
এরকম :
req = Rack::Request.new(env)
এই পদ্ধতিগুলি উপলব্ধ৷ :
- পাথ_তথ্য (/নিবন্ধ/1)
- আইপি (ব্যবহারকারীর)
- user_agent (Chrome, Firefox, Safari…)
- request_method (পান/পোস্ট)
- শরীর (বিষয়বস্তু)
- মিডিয়া_টাইপ (প্লেইন, জেসন, এইচটিএমএল)
আপনি আপনার Rack অ্যাপ্লিকেশন তৈরি করতে এই তথ্য ব্যবহার করতে পারেন৷ .
উদাহরণস্বরূপ, যদি 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
চেষ্টা করুন , লোকালহোস্টের 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
এই উদাহরণে আমাদের দুটি র্যাক অ্যাপ্লিকেশন রয়েছে:
- আইপি চেকের জন্য একটি (
FilterLocalHost
) - কন্টেন্ট (HTML, JSON, ইত্যাদি) সরবরাহ করার জন্য অ্যাপ্লিকেশনের জন্য একটি
লক্ষ্য করুন যে @app.call(env)
, এটাই FilterLocalHost
তৈরি করে একটি মিডলওয়্যার।
দুটি জিনিসের মধ্যে একটি হতে পারে :
- আমরা একটি প্রতিক্রিয়া প্রদান করি, যা মিডলওয়্যার চেইন বন্ধ করে দেয়
- আমরা অনুরোধটি
@app.call(env)
সহ পাস করি পরবর্তী মিডলওয়্যারে, অথবা অ্যাপ নিজেই
মিডলওয়্যার সহ আপনার র্যাক অ্যাপের যেকোনো অংশের ভিতরে, আপনি প্রতিক্রিয়া পরিবর্তন করতে পারেন।
উদাহরণ :
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 সম্পর্কে শিখেছেন, ইন্টারফেস যা রুবি ওয়েব ফ্রেমওয়ার্ক এবং সার্ভারের মধ্যে মিথস্ক্রিয়া চালাচ্ছে। এটি কীভাবে কাজ করে তা বোঝার জন্য আপনি কীভাবে আপনার নিজের র্যাক অ্যাপ্লিকেশনটি লিখতে হয় তাও শিখেছেন৷
আপনার যদি কোন প্রশ্ন বা প্রতিক্রিয়া থাকে তবে নির্দ্বিধায় নীচে একটি মন্তব্য করুন৷
পড়ার জন্য ধন্যবাদ!