Flask-এ Middleware এমন একটি প্রক্রিয়া যা অ্যাপ্লিকেশনের রিকোয়েস্ট এবং রেসপন্স সাইকেলের মধ্যে কোনো কাজ সম্পাদন করার জন্য ব্যবহৃত হয়। এটি অ্যাপ্লিকেশন লজিকের উপর নির্ভরশীল না হয়ে, HTTP রিকোয়েস্ট গ্রহণের আগে এবং রেসপন্স পাঠানোর আগে কিছু অতিরিক্ত ফিচার বা কার্যকলাপ যুক্ত করতে সাহায্য করে।
Flask-এ সাধারণত Middleware তৈরি করতে before_request এবং after_request হ্যান্ডলার ব্যবহার করা হয়। তবে Flask-এ কাস্টম Middleware তৈরি করার জন্য আপনাকে একটি Wsgi Middleware ক্লাস তৈরি করতে হয়, যা Flask অ্যাপ্লিকেশন চলার সময় বিভিন্ন ধরনের ম্যানিপুলেশন করতে সক্ষম।
১. Flask Middleware কী?
Flask অ্যাপ্লিকেশনে Middleware এমন একটি উপাদান যা অ্যাপ্লিকেশনের রিকোয়েস্ট/রেসপন্স সাইকেলকে প্রসেস করার সময় অতিরিক্ত কাজ বা যাচাই (validation), লগিং (logging), বা অন্যান্য কার্যক্রম সম্পাদন করতে ব্যবহৃত হয়। Flask নেটিভভাবে WSGI middleware সাপোর্ট করে, যা Flask অ্যাপ্লিকেশন চলানোর জন্য ব্যবহৃত হয়।
২. Flask-এ Custom Middleware তৈরি করা
Flask-এ Custom Middleware তৈরি করতে আপনি একটি কাস্টম ক্লাস তৈরি করতে পারেন, যেটি WSGI অ্যাপ্লিকেশনের মধ্যে ইনটেরসেপ্ট করে এবং রিকোয়েস্ট এবং রেসপন্সের সাথে কাজ করে। Flask-এ Middleware কনফিগার করা হয় অ্যাপ্লিকেশনের __call__ মেথডের মাধ্যমে।
উদাহরণ: Custom Middleware তৈরি করা
from flask import Flask, request, jsonify
import time
app = Flask(__name__)
# Custom Middleware তৈরি করা
class CustomMiddleware:
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
# রিকোয়েস্টের সময় নোট করা (Request Time)
start_time = time.time()
def custom_start_response(status, headers, exc_info=None):
# রেসপন্সের সময় বের করা (Response Time)
end_time = time.time()
elapsed_time = end_time - start_time
# এক্সট্রা হেডার যোগ করা
headers.append(('X-Processing-Time', str(elapsed_time)))
return start_response(status, headers, exc_info)
return self.app(environ, custom_start_response)
# Middleware অ্যাপ্লিকেশনের সাথে যুক্ত করা
app.wsgi_app = CustomMiddleware(app.wsgi_app)
@app.route("/")
def home():
return jsonify({"message": "Hello, Flask!"})
if __name__ == "__main__":
app.run(debug=True)
এখানে:
CustomMiddlewareক্লাস একটি কাস্টম WSGI middleware তৈরি করেছে।__call__মেথডের মাধ্যমে রিকোয়েস্ট আসার সময় এবং রেসপন্স ফেরত দেওয়ার সময় হিসাব করা হচ্ছে।X-Processing-Timeহেডার রেসপন্সে যোগ করা হচ্ছে, যা HTTP রেসপন্সের প্রসেসিং টাইম জানাবে।
এই কোডটি চালানোর পরে:
- আপনি যদি ব্রাউজারে বা API ক্লায়েন্টে রিকোয়েস্ট করেন, তাহলে রেসপন্সের সাথে একটি কাস্টম হেডার
X-Processing-Timeথাকবে যা প্রসেসিং টাইম দেখাবে।
৩. Flask Middleware Using before_request and after_request
Flask তে before_request এবং after_request ডেকোরেটর ব্যবহার করে খুব সহজে কাস্টম Middleware তৈরি করা যায়। এখানে before_request রিকোয়েস্ট আসার আগে কার্যকর হয়, এবং after_request রিকোয়েস্ট সম্পন্ন হওয়ার পরে কার্যকর হয়।
উদাহরণ: before_request এবং after_request ব্যবহার করা
from flask import Flask, request, jsonify
app = Flask(__name__)
# before_request middleware
@app.before_request
def before_request_func():
print(f"Request Method: {request.method}, Request URL: {request.url}")
# after_request middleware
@app.after_request
def after_request_func(response):
print(f"Response Status: {response.status}")
return response
@app.route("/")
def home():
return jsonify({"message": "Hello from Flask!"})
if __name__ == "__main__":
app.run(debug=True)
এখানে:
before_request_func(): এটি প্রতিটি রিকোয়েস্ট আসার আগে চালিত হবে, এবং রিকোয়েস্টের তথ্য যেমনrequest.methodএবংrequest.urlলগ করবে।after_request_func(): এটি প্রতিটি রিকোয়েস্ট শেষে চালিত হবে এবং রেসপন্সের স্ট্যাটাস কোডresponse.statusলগ করবে।
ফলস্বরূপ:
before_requestএবংafter_requestউভয় ফাংশন রিকোয়েস্ট এবং রেসপন্স সাইকেল সম্পর্কে তথ্য সংগ্রহ করবে।
৪. Flask Middleware ব্যবহারের সুবিধা
- গ্লোবাল কার্যকলাপ: Middleware অ্যাপ্লিকেশনের গ্লোবাল কার্যকলাপ যেমন লগিং, সিকিউরিটি চেক, অথবা অথেনটিকেশন কার্যকর করার জন্য ব্যবহৃত হতে পারে।
- কাস্টম হেডার যোগ করা: Middleware ব্যবহার করে আপনি HTTP রেসপন্সে কাস্টম হেডার যোগ করতে পারেন।
- প্রোফাইলিং এবং টাইমিং: অ্যাপ্লিকেশনের পারফরম্যান্স ট্র্যাক করতে এবং রিকোয়েস্ট/রেসপন্সের জন্য সময় গণনা করতে Middleware ব্যবহার করা যেতে পারে।
- অথেনটিকেশন এবং অথোরাইজেশন: Middleware এর মাধ্যমে প্রি-অথেনটিকেশন বা অথোরাইজেশন চেক করা যেতে পারে।
৫. Flask Middleware Error Handling
Middleware ব্যবহার করে আপনি ত্রুটি হ্যান্ডলিংও করতে পারেন। যেমন, যদি কোনো রিকোয়েস্টের জন্য অ্যানথেন্টিকেশন বা অথোরাইজেশন চেক করতে চান, তবে আপনি Middleware ব্যবহার করে ত্রুটি হ্যান্ডল করতে পারবেন।
from flask import Flask, jsonify
app = Flask(__name__)
class AuthMiddleware:
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
if environ.get('HTTP_AUTHORIZATION') is None:
start_response('401 Unauthorized', [('Content-Type', 'application/json')])
return [b'{"error": "Unauthorized"}']
return self.app(environ, start_response)
app.wsgi_app = AuthMiddleware(app.wsgi_app)
@app.route("/")
def home():
return jsonify({"message": "Hello, you are authorized!"})
if __name__ == "__main__":
app.run(debug=True)
এখানে:
AuthMiddlewareকাস্টম Middleware যা চেক করে যদিAuthorizationহেডার উপস্থিত না থাকে তবে 401 Unauthorized রেসপন্স পাঠানো হবে।
Flask-এ Custom Middleware তৈরি এবং ব্যবহার করা খুবই সহজ এবং শক্তিশালী। আপনি Flask-এ before_request এবং after_request ডেকোরেটর ব্যবহার করে সহজ Middleware তৈরি করতে পারেন, অথবা কাস্টম WSGI Middleware তৈরি করতে পারেন যা রিকোয়েস্ট এবং রেসপন্স সাইকেলে অতিরিক্ত কার্যকলাপ সম্পাদন করতে পারে। Middleware ব্যবহারের মাধ্যমে আপনি লগিং, অথেনটিকেশন, পারফরম্যান্স প্রোফাইলিং, ত্রুটি হ্যান্ডলিং ইত্যাদি কার্যক্রম সহজে করতে পারেন।