Flask একটি মাইক্রোফ্রেমওয়ার্ক (Microframework) যা Python-এ তৈরি এবং ছোট, লাইটওয়েট ওয়েব অ্যাপ্লিকেশন এবং API তৈরি করতে আদর্শ। Flask সহজে API ডেভেলপমেন্টের জন্য ব্যবহৃত হয় কারণ এটি সরল, দ্রুত এবং কাস্টমাইজেশন ফ্রেন্ডলি। Flask ব্যবহার করে RESTful API তৈরি করা খুবই সহজ এবং কার্যকর, যা ডাইনামিক ওয়েব অ্যাপ্লিকেশন বা মোবাইল অ্যাপ্লিকেশনের ব্যাকএন্ড হিসেবে কাজ করতে পারে।
Flask দিয়ে API Development
Flask একটি সিম্পল ও ওভারহেড কম ফ্রেমওয়ার্ক হওয়ায় এটি API ডেভেলপমেন্টের জন্য বেশ জনপ্রিয়। একটি API তৈরি করার জন্য Flask সাধারণত GET, POST, PUT, DELETE HTTP মেথডগুলি ব্যবহার করে। Flask JSON রেসপন্স সরবরাহ করার জন্য আদর্শ, কারণ এটি সহজেই ডাটাবেস থেকে ডেটা রিটার্ন করতে পারে এবং JSON আউটপুট পাঠাতে পারে।
১. Flask API তৈরি করা
নিচে একটি সাধারণ RESTful API তৈরি করার উদাহরণ দেওয়া হলো, যেখানে GET এবং POST মেথড ব্যবহার করা হয়েছে।
Step 1: Flask অ্যাপ তৈরি
প্রথমে Flask ইনস্টল করুন:
pip install flask
Step 2: API কোড লিখুন
from flask import Flask, jsonify, request
app = Flask(__name__)
# ডামি ডেটাবেস (JSON ফরম্যাটে)
tasks = [
{"id": 1, "title": "Buy groceries", "done": False},
{"id": 2, "title": "Read a book", "done": False}
]
# GET মেথড: সব টাস্ক দেখানো
@app.route("/tasks", methods=["GET"])
def get_tasks():
return jsonify({"tasks": tasks})
# POST মেথড: নতুন টাস্ক তৈরি
@app.route("/tasks", methods=["POST"])
def create_task():
task_data = request.get_json()
new_task = {
"id": len(tasks) + 1, # নতুন আইডি জেনারেট
"title": task_data["title"],
"done": False
}
tasks.append(new_task)
return jsonify(new_task), 201 # HTTP Status 201 (Created)
if __name__ == "__main__":
app.run(debug=True)
এখানে:
@app.route("/tasks", methods=["GET"]):/tasksURL এ GET রিকোয়েস্ট হলে সমস্ত টাস্ক ফেরত দিবে।@app.route("/tasks", methods=["POST"]):/tasksURL এ POST রিকোয়েস্ট হলে নতুন টাস্ক যোগ করবে।
Step 3: অ্যাপ চালানো
python app.py
এটি আপনার Flask অ্যাপ্লিকেশন চালু করবে এবং আপনি http://127.0.0.1:5000/tasks URL এ গিয়ে GET রিকোয়েস্ট পাঠালে সমস্ত টাস্ক দেখবেন। POST রিকোয়েস্টের মাধ্যমে নতুন টাস্কও অ্যাড করতে পারবেন।
২. Flask RESTful API এ Validation এবং Error Handling
Flask API ডেভেলপমেন্টে ইনপুট ভ্যালিডেশন এবং ত্রুটি হ্যান্ডলিং গুরুত্বপূর্ণ ভূমিকা পালন করে। এখানে আমরা Flask-WTF বা WTForms ব্যবহার না করে সরাসরি Flask এর request.get_json() মেথড দিয়ে ইনপুট ভ্যালিডেশন করব।
উদাহরণ: POST রিকোয়েস্টে ভ্যালিডেশন এবং ত্রুটি হ্যান্ডলিং
from flask import Flask, jsonify, request, abort
app = Flask(__name__)
tasks = []
@app.route("/tasks", methods=["POST"])
def create_task():
# JSON ইনপুট চেক
if not request.json or not "title" in request.json:
abort(400, description="Bad Request: 'title' is required")
task_data = request.get_json()
new_task = {
"id": len(tasks) + 1,
"title": task_data["title"],
"done": False
}
tasks.append(new_task)
return jsonify(new_task), 201
@app.errorhandler(400)
def bad_request(error):
return jsonify({"error": "Bad request", "message": error.description}), 400
if __name__ == "__main__":
app.run(debug=True)
এখানে:
abort(400, description="Bad Request": যদিtitleপ্যারামিটার অনুপস্থিত থাকে, তবে 400 স্ট্যাটাস কোড সহ ত্রুটি ফেরত দিবে।@app.errorhandler(400): ত্রুটি হ্যান্ডলিংয়ের জন্য এই ডেকোরেটর ব্যবহার করা হয়েছে।
৩. Flask API রেসপন্স এবং HTTP Status Codes
Flask API তে HTTP Status Codes ব্যবহার করা একটি ভাল অভ্যাস। HTTP Status Code সার্ভারের সাড়া (response) এবং রিকোয়েস্টের ফলাফল জানাতে সাহায্য করে।
উদাহরণ: HTTP Status Code সহ রেসপন্স
@app.route("/tasks", methods=["POST"])
def create_task():
if not request.json or not "title" in request.json:
abort(400, description="Bad Request: 'title' is required")
task_data = request.get_json()
new_task = {
"id": len(tasks) + 1,
"title": task_data["title"],
"done": False
}
tasks.append(new_task)
return jsonify(new_task), 201 # 201 Created status
এখানে:
- 201 (Created) স্ট্যাটাস কোড ব্যবহার করা হয়েছে, যা নতুন রিসোর্স সৃষ্টির সফলতা জানায়।
৪. Flask API এ PUT এবং DELETE মেথড
PUT এবং DELETE মেথড RESTful API ডেভেলপমেন্টে গুরুত্বপূর্ণ ভূমিকা পালন করে। PUT রিকোয়েস্ট ব্যবহার করা হয় রিসোর্স আপডেট করার জন্য, এবং DELETE রিকোয়েস্ট ব্যবহার করা হয় রিসোর্স মুছে ফেলার জন্য।
PUT রিকোয়েস্ট উদাহরণ:
@app.route("/tasks/<int:task_id>", methods=["PUT"])
def update_task(task_id):
task = next((t for t in tasks if t["id"] == task_id), None)
if task is None:
abort(404, description="Task not found")
task_data = request.get_json()
task["title"] = task_data.get("title", task["title"])
task["done"] = task_data.get("done", task["done"])
return jsonify(task)
DELETE রিকোয়েস্ট উদাহরণ:
@app.route("/tasks/<int:task_id>", methods=["DELETE"])
def delete_task(task_id):
task = next((t for t in tasks if t["id"] == task_id), None)
if task is None:
abort(404, description="Task not found")
tasks.remove(task)
return jsonify({"message": "Task deleted"}), 200
৫. Flask API-তে Authentication এবং Authorization
Flask API ডেভেলপমেন্টে Authentication এবং Authorization খুবই গুরুত্বপূর্ণ। সাধারণত JWT (JSON Web Tokens) বা OAuth ব্যবহৃত হয়। Flask-এ Flask-JWT-Extended লাইব্রেরি দিয়ে সহজে JWT Authentication সেটআপ করা যায়।
উদাহরণ: JWT Authentication
pip install flask-jwt-extended
from flask import Flask, jsonify, request
from flask_jwt_extended import JWTManager, jwt_required, create_access_token
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
jwt = JWTManager(app)
@app.route("/login", methods=["POST"])
def login():
username = request.json.get('username', None)
password = request.json.get('password', None)
if username != 'admin' or password != 'password':
return jsonify({"msg": "Invalid credentials"}), 401
access_token = create_access_token(identity=username)
return jsonify(access_token=access_token)
@app.route("/protected", methods=["GET"])
@jwt_required()
def protected():
return jsonify(message="This is a protected route")
if __name__ == "__main__":
app.run(debug=True)
এখানে:
create_access_token: এটি JWT তৈরি করে এবং সেটি ফ্রন্টএন্ডে পাঠিয়ে দেয়।@jwt_required(): এই ডেকোরেটরটি সুরক্ষিত রাউটগুলির জন্য JWT টোকেন যাচাই করতে ব্যবহৃত হয়।
Flask-এ API ডেভেলপমেন্ট খুবই সহজ এবং কার্যকর। Flask-এ আপনি GET, POST, PUT, DELETE HTTP মেথড ব্যবহার করে সহজেই RESTful API তৈরি করতে পারেন। Flask-WTF, Flask-JWT, এবং অন্যান্য এক্সটেনশন ব্যবহার করে আপনি ইনপুট ভ্যালিডেশন, ত্রুটি হ্যান্ডলিং এবং সুরক্ষা সহজভাবে কার্যকর করতে পারবেন। Flask একটি সহজ, লাইটওয়েট, এবং নমনীয় ফ্রেমওয়ার্ক যা API ডেভেলপমেন্টের জন্য আদর্শ।
Flask একটি মাইক্রোফ্রেমওয়ার্ক হিসেবে খুবই উপযোগী এবং এটি দ্রুত RESTful API তৈরি করার জন্য ব্যাপকভাবে ব্যবহৃত হয়। REST (Representational State Transfer) একটি আর্কিটেকচারাল স্টাইল যা ওয়েব সার্ভিসের জন্য সাধারণত HTTP প্রোটোকল ব্যবহার করে, এবং Flask খুবই সহজভাবে RESTful API তৈরি করতে সাহায্য করে।
Flask-এ RESTful API তৈরি করতে হলে আপনাকে কিছু মৌলিক HTTP মেথড (GET, POST, PUT, DELETE) ব্যবহার করতে হবে এবং রাউট (routes) সেট করতে হবে। Flask এর মধ্যে Flask-RESTful এক্সটেনশন ব্যবহার করলে API ডেভেলপমেন্ট আরও সহজ এবং দ্রুত হয়।
১. Flask RESTful API তৈরি করার জন্য প্রাথমিক সেটআপ
Flask এবং Flask-RESTful ইনস্টলেশন:
pip install flask flask-restful
Flask অ্যাপ তৈরি করা:
এখানে একটি সাধারণ Flask RESTful API তৈরি করা হয়েছে যা কিছু GET, POST, PUT, DELETE রিকোয়েস্ট গ্রহণ করবে।
from flask import Flask, request
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
# Dummy data (In-memory database)
tasks = [
{'id': 1, 'task': 'ফ্লাস্ক দিয়ে API তৈরি করা'},
{'id': 2, 'task': 'প্রোজেক্ট ডকুমেন্টেশন লেখা'}
]
class TaskList(Resource):
def get(self):
return {'tasks': tasks}, 200 # Return all tasks in the list
def post(self):
new_task = request.get_json() # Get data from the request body
new_task['id'] = len(tasks) + 1 # Generate new task ID
tasks.append(new_task)
return new_task, 201 # Return new task with status code 201
class Task(Resource):
def get(self, task_id):
task = next((task for task in tasks if task['id'] == task_id), None)
if task is None:
return {'message': 'Task not found'}, 404
return task, 200 # Return the task
def put(self, task_id):
task = next((task for task in tasks if task['id'] == task_id), None)
if task is None:
return {'message': 'Task not found'}, 404
data = request.get_json() # Get the updated task data from the request
task['task'] = data['task']
return task, 200 # Return the updated task
def delete(self, task_id):
global tasks
tasks = [task for task in tasks if task['id'] != task_id]
return {'message': 'Task deleted'}, 200 # Return success message
# Define routes
api.add_resource(TaskList, '/tasks') # Route for listing and adding tasks
api.add_resource(Task, '/tasks/<int:task_id>') # Route for accessing and modifying specific task
if __name__ == "__main__":
app.run(debug=True)
২. এটি কীভাবে কাজ করে?
- GET
/tasks: এই রাউটটি সমস্ত টাস্কের তালিকা ফেরত দেয়। এতে আপনি একটি JSON ফরম্যাটে সমস্ত টাস্ক দেখতে পারবেন। - POST
/tasks: নতুন টাস্ক তৈরি করার জন্য এই রাউটটি ব্যবহৃত হয়। এখানে আপনি নতুন টাস্কের ডেটা পাঠাতে পারবেন। - GET
/tasks/<task_id>: একটি নির্দিষ্ট টাস্কের বিস্তারিত তথ্য দেখতে পারবেন, যেখানে<task_id>হল সেই টাস্কের আইডি। - PUT
/tasks/<task_id>: একটি টাস্ক আপডেট করার জন্য এই রাউটটি ব্যবহৃত হয়। এটি সংশোধিত টাস্কের তথ্য গ্রহণ করে এবং বর্তমান টাস্কের মধ্যে আপডেট করে। - DELETE
/tasks/<task_id>: নির্দিষ্ট টাস্ক মুছে ফেলার জন্য এই রাউটটি ব্যবহৃত হয়।
৩. API টেস্টিং
API তৈরি করার পরে, আপনি curl, Postman বা Swagger UI এর মতো টুল ব্যবহার করে আপনার API টেস্ট করতে পারেন।
GET রিকোয়েস্ট:
আপনি http://127.0.0.1:5000/tasks URL এ GET রিকোয়েস্ট পাঠালে আপনি সমস্ত টাস্কের তালিকা পাবেন।
POST রিকোয়েস্ট:
আপনি http://127.0.0.1:5000/tasks URL এ JSON ডেটা পাঠিয়ে নতুন টাস্ক যোগ করতে পারেন:
{
"task": "নতুন টাস্ক তৈরি"
}
PUT রিকোয়েস্ট:
আপনি http://127.0.0.1:5000/tasks/1 URL এ PUT রিকোয়েস্ট পাঠিয়ে একটি নির্দিষ্ট টাস্ক আপডেট করতে পারেন।
DELETE রিকোয়েস্ট:
আপনি http://127.0.0.1:5000/tasks/1 URL এ DELETE রিকোয়েস্ট পাঠিয়ে একটি নির্দিষ্ট টাস্ক মুছে ফেলতে পারেন।
৪. Flask RESTful API - Response Formatting
API এর রেসপন্স সাধারণত JSON ফরম্যাটে থাকে। Flask-এ আপনি jsonify ফাংশন ব্যবহার করে JSON রেসপন্স তৈরি করতে পারেন।
উদাহরণ:
from flask import jsonify
@app.route('/tasks')
def get_tasks():
return jsonify({'tasks': tasks}), 200
এখানে jsonify() ফাংশন ডেটাকে JSON ফরম্যাটে রূপান্তর করে এবং HTTP স্ট্যাটাস কোড 200 পাঠায়।
৫. Error Handling in Flask API
Flask-এ Error Handling করা অত্যন্ত গুরুত্বপূর্ণ। আপনি যদি কোনও নির্দিষ্ট রাউটে কোনও ভুল করেন বা রিকোয়েস্টের সাথে ভুল ডেটা পাঠান, তবে আপনি উপযুক্ত HTTP স্ট্যাটাস কোড এবং ম্যাসেজ রিটার্ন করতে পারেন।
উদাহরণ:
@app.errorhandler(404)
def not_found(error):
return jsonify({"error": "Resource not found"}), 404
এটি যখন কোন রিসোর্স পাওয়া যায় না (যেমন ভুল URL) তখন 404 স্ট্যাটাস কোড সহ "Resource not found" মেসেজ রিটার্ন করবে।
৬. Flask API Security
API নিরাপত্তার জন্য বেশ কিছু ব্যবস্থা নেয়া যেতে পারে, যেমন:
- Authentication (অথেন্টিকেশন): JWT (JSON Web Tokens) বা OAuth 2.0 ব্যবহার করে API-তে নিরাপদ অথেন্টিকেশন প্রক্রিয়া তৈরি করা যায়।
- Rate Limiting: Too many requests from a single user can be blocked by implementing rate limiting using Flask-Limiter.
উদাহরণ: Flask-JWT-Extended (JWT Authentication)
pip install flask-jwt-extended
এটি API রিকোয়েস্টগুলোর নিরাপত্তা বাড়ানোর জন্য ব্যবহৃত হয়।
Flask একটি লাইটওয়েট এবং নমনীয় ফ্রেমওয়ার্ক, যা RESTful API তৈরি করতে অত্যন্ত উপযোগী। Flask-RESTful ব্যবহার করে দ্রুত API তৈরি করা যায় এবং HTTP মেথড, রাউট, এবং JSON রেসপন্সের মাধ্যমে সম্পূর্ণ API সিস্টেম নির্মাণ করা সম্ভব। API নিরাপত্তার জন্য আপনাকে যথাযথ অথেন্টিকেশন, অথোরাইজেশন এবং রেট লিমিটিং ব্যবস্থাও যোগ করতে হবে। Flask আপনাকে এ সবকিছু সহজেই করতে সহায়তা করে।
Flask-RESTful হল Flask এর জন্য একটি এক্সটেনশন যা সহজে RESTful API তৈরি করতে সহায়ক। Flask-RESTful আপনাকে HTTP রিকোয়েস্টগুলো পরিচালনা করার জন্য সহজ পদ্ধতি প্রদান করে এবং ডেটা প্রদানের জন্য JSON ফর্ম্যাট ব্যবহার করে।
এখানে Flask-RESTful ব্যবহার করে API Endpoint তৈরি করার প্রক্রিয়া ব্যাখ্যা করা হলো।
১. Flask-RESTful ইনস্টলেশন
প্রথমে, Flask-RESTful ইনস্টল করতে হবে:
pip install flask-restful
২. Flask-RESTful ব্যবহার করে API Endpoint তৈরি করা
ধাপ ১: Flask অ্যাপ সেটআপ
from flask import Flask
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
Flask: Flask অ্যাপ্লিকেশন তৈরি করে।Api: Flask-RESTful এরApiক্লাস API রাউট এবং রিসোর্স পরিচালনা করে।Resource: Flask-RESTful এরResourceক্লাস ব্যবহার করে আপনি HTTP রিকোয়েস্ট হ্যান্ডলিং ফাংশন তৈরি করতে পারেন।
ধাপ ২: Resource ক্লাস তৈরি করা
Flask-RESTful এর Resource ক্লাস ব্যবহার করে API endpoint তৈরি করা হয়। প্রতিটি রিসোর্স HTTP মেথড (GET, POST, PUT, DELETE) হ্যান্ডল করার জন্য ফাংশন থাকতে পারে।
class HelloWorld(Resource):
def get(self):
return {'message': 'Hello, World!'}
এখানে:
get(): এটি GET রিকোয়েস্ট হ্যান্ডল করবে এবং একটি JSON রেসপন্স ফিরিয়ে দিবে।{ 'message': 'Hello, World!' }
ধাপ ৩: API Endpoint যোগ করা
API endpoint যোগ করার জন্য api.add_resource() মেথড ব্যবহার করা হয়:
api.add_resource(HelloWorld, '/')
এটি HelloWorld রিসোর্সকে / রুটে মাপা করবে। এখন, এই API তে GET রিকোয়েস্ট করলে { 'message': 'Hello, World!' } রেসপন্স পাওয়া যাবে।
ধাপ ৪: অ্যাপ চালানো
if __name__ == "__main__":
app.run(debug=True)
এটি Flask অ্যাপ চালু করবে এবং http://127.0.0.1:5000/ URL এ API রেসপন্স পাওয়া যাবে।
৩. Multiple API Endpoints
একাধিক API endpoint তৈরি করার জন্য একাধিক Resource ক্লাস ব্যবহার করা যায়। এখানে দুইটি আলাদা endpoint তৈরি করা হলো:
class HelloWorld(Resource):
def get(self):
return {'message': 'Hello, World!'}
class GreetUser(Resource):
def get(self, username):
return {'message': f'Hello, {username}!'}
api.add_resource(HelloWorld, '/')
api.add_resource(GreetUser, '/greet/<string:username>')
এখানে:
/:HelloWorldরিসোর্সের জন্য GET রিকোয়েস্ট হ্যান্ডল করবে।/greet/<string:username>:GreetUserরিসোর্সের জন্য ডাইনামিকusernameপ্যারামিটার গ্রহণ করবে এবং রেসপন্সে ব্যবহারকারীর নাম দেখাবে।
উদাহরণ:
http://127.0.0.1:5000/greet/john- রেসপন্স:
{ "message": "Hello, john!" }
- রেসপন্স:
৪. POST, PUT, DELETE মেথড হ্যান্ডলিং
Flask-RESTful এ POST, PUT, DELETE মেথডও খুব সহজে হ্যান্ডল করা যায়। প্রতিটি HTTP মেথডের জন্য একটি ফাংশন তৈরি করা হয়।
উদাহরণ:
class Item(Resource):
items = {}
def get(self, name):
if name in self.items:
return {name: self.items[name]}
return {'message': 'Item not found'}, 404
def post(self, name):
self.items[name] = f"Details about {name}"
return {name: self.items[name]}, 201
def put(self, name):
self.items[name] = f"Updated details about {name}"
return {name: self.items[name]}
def delete(self, name):
if name in self.items:
del self.items[name]
return {'message': f'{name} deleted'}
return {'message': 'Item not found'}, 404
api.add_resource(Item, '/item/<string:name>')
এখানে:
- GET:
nameনামে একটি আইটেম পেলে তা রিটার্ন করবে। - POST: একটি নতুন আইটেম তৈরি করবে এবং তাকে
nameদিয়ে যুক্ত করবে। - PUT: একটি বিদ্যমান আইটেম আপডেট করবে।
- DELETE: একটি আইটেম মুছে ফেলবে।
টেস্ট:
http://127.0.0.1:5000/item/laptopURL দিয়ে GET, POST, PUT, DELETE রিকোয়েস্ট পাঠানো যেতে পারে।
৫. Request and Input Validation
Flask-RESTful-এ ইনপুট ভ্যালিডেশন করা খুবই সহজ। আপনি reqparse ব্যবহার করে ইনপুট প্যারামিটার ভ্যালিডেট করতে পারেন।
উদাহরণ:
from flask_restful import reqparse
parser = reqparse.RequestParser()
parser.add_argument('name', type=str, required=True, help="Name cannot be blank")
parser.add_argument('price', type=float, required=True, help="Price cannot be blank")
class Product(Resource):
def post(self):
args = parser.parse_args()
return {'name': args['name'], 'price': args['price']}, 201
api.add_resource(Product, '/product')
এখানে:
reqparseএর মাধ্যমেnameএবংpriceপ্যারামিটারগুলো যাচাই করা হচ্ছে। যদি এটি না পাওয়া যায়, তবে একটি ত্রুটি বার্তা ফিরিয়ে দেওয়া হবে।
৬. JSON রেসপন্স এবং Error Handling
Flask-RESTful আপনাকে সহজে JSON রেসপন্স এবং Error Handling পরিচালনা করার সুযোগ দেয়। আপনি abort() ফাংশন ব্যবহার করে রিকোয়েস্টে ত্রুটি ঘটালে তা হ্যান্ডেল করতে পারেন।
from flask_restful import abort
class Item(Resource):
def get(self, name):
if name not in self.items:
abort(404, message="Item not found")
return {name: self.items[name]}
এখানে, যদি আইটেম না পাওয়া যায়, তবে abort() ফাংশন 404 ত্রুটি বার্তা সহ ফিরিয়ে দেবে।
Flask-RESTful এর মাধ্যমে সহজেই API Endpoint তৈরি করা যায়, যা RESTful API ডিজাইনকে দ্রুত এবং কার্যকর করে তোলে। আপনি HTTP মেথড (GET, POST, PUT, DELETE) হ্যান্ডলিং, ডাইনামিক URL, ইনপুট ভ্যালিডেশন এবং ত্রুটি হ্যান্ডলিংসহ সম্পূর্ণ একটি API তৈরি করতে পারেন। Flask-RESTful এর সাহায্যে ছোট থেকে মাঝারি আকারের API খুব দ্রুত এবং কার্যকরভাবে তৈরি করা সম্ভব।
Flask অ্যাপ্লিকেশন তৈরির সময় JSON Response এবং Error Handling ব্যবস্থাপনাটি অত্যন্ত গুরুত্বপূর্ণ, বিশেষত যখন আপনি API তৈরি করছেন। Flask অ্যাপ্লিকেশনে ডেটা প্রেরণ এবং ত্রুটি (error) হ্যান্ডলিংয়ের জন্য নির্দিষ্ট পদ্ধতি এবং টুলস রয়েছে, যা আপনার অ্যাপ্লিকেশনকে আরও কার্যকরী এবং ব্যবহারকারীর জন্য উপযুক্ত করে তোলে।
১. Flask JSON Response
Flask অ্যাপ্লিকেশনে JSON ফর্ম্যাটে ডেটা রেসপন্স পাঠানো খুব সহজ। Flask-এ jsonify() ফাংশন ব্যবহৃত হয় JSON রেসপন্স তৈরির জন্য, যা একটি ডিকশনারি বা অন্যান্য ডেটা স্ট্রাকচারকে সঠিকভাবে JSON আউটপুটে রূপান্তর করে।
উদাহরণ: JSON Response পাঠানো
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/api/data")
def get_data():
data = {
"name": "Flask",
"version": "2.0",
"status": "active"
}
return jsonify(data) # jsonify() ফাংশন ব্যবহার করে JSON রেসপন্স পাঠানো
if __name__ == "__main__":
app.run(debug=True)
এখানে:
jsonify(): এই ফাংশন Flask অ্যাপ্লিকেশনকে একটি ডিকশনারি (বা লিস্ট) কে JSON ফর্ম্যাটে রূপান্তরিত করে রেসপন্স হিসেবে ফেরত পাঠায়।/api/dataURL এ গেলে একটি JSON রেসপন্স পাওয়া যাবে:{ "name": "Flask", "version": "2.0", "status": "active" }
JSON Response-এ HTTP Status Code সেট করা
আপনি JSON রেসপন্সের সাথে HTTP Status Code নির্ধারণ করতে পারেন:
@app.route("/api/success")
def success():
data = {
"message": "Request was successful"
}
return jsonify(data), 200 # 200 OK status code সহ রেসপন্স
এখানে:
200: এটি HTTP স্ট্যাটাস কোড যা সফল রিকোয়েস্ট নির্দেশ করে।
২. Error Handling in Flask
Flask-এ Error Handling এমন একটি গুরুত্বপূর্ণ বিষয় যা অ্যাপ্লিকেশনের ত্রুটি সমূহ (যেমন 404 বা 500 ত্রুটি) যথাযথভাবে পরিচালনা করতে সাহায্য করে। Flask আপনাকে বিভিন্ন ধরনের ত্রুটির জন্য কাস্টম হ্যান্ডলার তৈরি করতে দেয়।
২.১ 404 Error (Page Not Found) Handling
আপনি কাস্টম 404 ত্রুটি হ্যান্ডলার তৈরি করতে পারেন, যাতে ব্যবহারকারী যদি কোনো অবৈধ URL অ্যাক্সেস করে তবে একটি কাস্টম মেসেজ বা পৃষ্ঠা দেখানো হয়।
@app.errorhandler(404)
def page_not_found(error):
return jsonify({"error": "Page not found"}), 404
এখানে:
@app.errorhandler(404): এটি 404 ত্রুটি (যখন পৃষ্ঠা পাওয়া যায় না) হ্যান্ডল করতে ব্যবহৃত হয়।jsonify(): এটি কাস্টম JSON রেসপন্স তৈরি করে, যেখানে "Page not found" মেসেজটি পাঠানো হয়।
২.২ 500 Error (Internal Server Error) Handling
Flask 500 ত্রুটি (যেমন সার্ভার ভুল) কাস্টমভাবে হ্যান্ডল করতে পারেন:
@app.errorhandler(500)
def internal_error(error):
return jsonify({"error": "Internal server error"}), 500
এখানে:
@app.errorhandler(500): এটি 500 ত্রুটি হ্যান্ডল করতে ব্যবহৃত হয়, যা সাধারণত সার্ভারের অভ্যন্তরীণ ত্রুটি নির্দেশ করে।
২.৩ Custom Error Responses with JSON
আপনি কাস্টম ত্রুটি রেসপন্সও তৈরি করতে পারেন, যেমন 403 (Forbidden) বা 401 (Unauthorized) এর জন্য:
@app.errorhandler(403)
def forbidden_error(error):
return jsonify({"error": "Forbidden, you don't have permission"}), 403
@app.errorhandler(401)
def unauthorized_error(error):
return jsonify({"error": "Unauthorized, please login first"}), 401
এখানে:
- 403: এটি নিষিদ্ধ (Forbidden) ত্রুটি নির্দেশ করে।
- 401: এটি অনুমোদনহীন (Unauthorized) ত্রুটি নির্দেশ করে।
৩. Flask-এ Custom Error Messages
কখনো কখনো আপনি নির্দিষ্ট ত্রুটির জন্য কাস্টম মেসেজ বা কাস্টম ফিল্ড পাঠাতে চাইতে পারেন। আপনি এমনকি স্ট্যাটাস কোড, ডেটা, এবং মেসেজ সহ JSON রেসপন্স তৈরি করতে পারেন।
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/api/not_found")
def not_found():
return jsonify({
"status": "error",
"message": "The resource you requested could not be found"
}), 404 # 404 status code with custom error message
@app.route("/api/unauthorized")
def unauthorized():
return jsonify({
"status": "error",
"message": "You need to log in to access this resource"
}), 401 # 401 status code with custom error message
if __name__ == "__main__":
app.run(debug=True)
এখানে:
- 404 এবং 401 ত্রুটির জন্য কাস্টম মেসেজ এবং JSON ফর্ম্যাটে রেসপন্স দেওয়া হয়েছে।
৪. Flask Debug Mode এবং Error Handling
Flask-এ Debug Mode সক্রিয় থাকলে আপনি ত্রুটির স্ট্যাক ট্রেস দেখতে পারবেন যা ডেভেলপমেন্টের জন্য সহায়ক। এটি কেবল ডেভেলপমেন্ট পরিবেশে ব্যবহৃত উচিত, কারণ প্রোডাকশনে এটি নিরাপত্তার জন্য অনিরাপদ হতে পারে।
if __name__ == "__main__":
app.run(debug=True) # Debug mode সক্রিয়
এখন, যদি কোন ত্রুটি ঘটে, Flask তা টার্মিনালে দেখাবে এবং আপনি কোডের কোথায় ত্রুটি ঘটেছে তা দেখতে পারবেন।
৫. Flask API Error Handling with JSON
Flask অ্যাপ্লিকেশনে API তৈরি করার সময় ত্রুটি হ্যান্ডলিং একটি গুরুত্বপূর্ণ অংশ, বিশেষত যখন ক্লায়েন্ট JSON রেসপন্স আশা করে। এ জন্য আপনি কাস্টম JSON error রেসপন্স তৈরি করতে পারেন।
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route("/api/resource", methods=["POST"])
def create_resource():
if not request.json:
return jsonify({
"status": "error",
"message": "Bad request, JSON data expected"
}), 400 # 400 Bad Request
data = request.get_json() # JSON ডেটা প্রাপ্তি
return jsonify({
"status": "success",
"data": data
}), 201 # 201 Created
if __name__ == "__main__":
app.run(debug=True)
এখানে:
- 400 (Bad Request): যদি ক্লায়েন্ট সঠিক JSON ডেটা না পাঠায়, তবে আমরা একটি কাস্টম JSON ত্রুটি রেসপন্স ফিরিয়ে দিচ্ছি।
Flask-এ JSON Response এবং Error Handling ব্যবহার করে আপনি সহজেই API বা ওয়েব অ্যাপ্লিকেশনে ত্রুটি পরিচালনা করতে পারেন এবং সঠিক রেসপন্স প্রদান করতে পারেন। jsonify() ফাংশন এবং errorhandler ডেকোরেটর ব্যবহার করে আপনি কাস্টম ত্রুটি মেসেজ এবং JSON রেসপন্স তৈরি করতে পারেন, যা ডেভেলপারদের জন্য ডিবাগ এবং ব্যবহারকারীদের জন্য পরিষ্কার মেসেজ প্রদান করে।
Flask-Marshmallow হলো Flask অ্যাপ্লিকেশনে Data Serialization এবং Deserialization পরিচালনা করার জন্য একটি জনপ্রিয় এক্সটেনশন। এটি বিশেষভাবে JSON ডেটা নিয়ে কাজ করার জন্য ব্যবহৃত হয়। Flask-Marshmallow ব্যবহার করে আপনি সহজেই Python অবজেক্টগুলোকে JSON ফর্ম্যাটে রূপান্তর (Serialization) এবং JSON ডেটাকে Python অবজেক্টে রূপান্তর (Deserialization) করতে পারেন।
এটি Flask অ্যাপ্লিকেশনে API ডেভেলপমেন্টের জন্য অত্যন্ত কার্যকরী। Marshmallow লাইব্রেরি আপনার ডেটার জন্য স্কিমা (Schema) তৈরি করতে সাহায্য করে, যা JSON ফর্ম্যাটে ডেটা রূপান্তর এবং ভ্যালিডেশন পরিচালনা করতে সক্ষম।
১. Flask-Marshmallow ইনস্টলেশন
প্রথমে, Flask-Marshmallow ইনস্টল করতে হবে। এটি Marshmallow এবং Flask দুইটি লাইব্রেরি একসাথে সরবরাহ করে।
pip install flask-marshmallow
এছাড়া, Marshmallow এবং Flask-SQLAlchemy ইনস্টল করতে হতে পারে, যদি আপনি ডাটাবেস ব্যবহার করতে চান।
pip install marshmallow flask-sqlalchemy
২. Flask-Marshmallow সেটআপ
Flask অ্যাপ তৈরি করা
from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
# Flask অ্যাপ এবং Marshmallow সেটআপ
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
db = SQLAlchemy(app)
ma = Marshmallow(app)
এখানে:
SQLAlchemy: ডাটাবেস পরিচালনার জন্য ব্যবহার করা হচ্ছে।Marshmallow: ডেটা সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন কাজের জন্য ব্যবহৃত হচ্ছে।
৩. Database Model তৈরি করা (Flask-SQLAlchemy)
Flask-SQLAlchemy ব্যবহার করে ডাটাবেস মডেল তৈরি করা যেতে পারে। উদাহরণস্বরূপ, একটি User মডেল তৈরি করা হলো।
# ডাটাবেস মডেল
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
email = db.Column(db.String(100), unique=True, nullable=False)
def __init__(self, name, email):
self.name = name
self.email = email
এখানে User মডেলটি একটি টেবিলের মতো কাজ করবে, যেখানে id, name, এবং email নামক কলাম থাকবে।
৪. Flask-Marshmallow Schema তৈরি করা
Flask-Marshmallow দিয়ে ডেটার স্কিমা (Schema) তৈরি করতে হয়, যা ডেটাকে JSON ফরম্যাটে রূপান্তর করতে সাহায্য করে। উদাহরণস্বরূপ, UserSchema নামের একটি স্কিমা তৈরি করা হলো:
# Marshmallow স্কিমা
class UserSchema(ma.SQLAlchemyAutoSchema):
class Meta:
model = User
load_instance = True # ইনস্ট্যান্স লোড করার জন্য
এখানে:
SQLAlchemyAutoSchemaব্যবহার করা হয়েছে যাতে Marshmallow সরাসরি SQLAlchemy মডেলের ভিত্তিতে স্কিমা তৈরি করতে পারে।load_instance = Trueসেট করা হলে Marshmallow ডেসিরিয়ালাইজেশন (Deserialization) এর সময় SQLAlchemy মডেল অবজেক্ট লোড করতে পারবে।
৫. Serialization (ডেটা রূপান্তর করা)
Flask-Marshmallow ব্যবহার করে Serialization বা ডেটা রূপান্তর খুবই সহজ। Marshmallow স্কিমা ব্যবহার করে ডাটাবেস থেকে প্রাপ্ত Python অবজেক্টকে JSON ফরম্যাটে রূপান্তর করা হয়।
# ইউজার ডেটা সিরিয়ালাইজ করা
@app.route('/user/<id>', methods=['GET'])
def get_user(id):
user = User.query.get(id) # ডাটাবেস থেকে ইউজার অনুসন্ধান করা
user_schema = UserSchema()
return user_schema.jsonify(user) # JSON ফরম্যাটে রিটার্ন
এখানে:
user_schema.jsonify(user): এটিuserঅবজেক্টকে JSON ফরম্যাটে রূপান্তর করবে এবং রেসপন্স হিসেবে পাঠাবে।
৬. Deserialization (ডেটা গ্রহণ করা)
Deserialization হলো JSON ডেটাকে Python অবজেক্টে রূপান্তর করার প্রক্রিয়া। Marshmallow স্কিমা ব্যবহার করে আপনি JSON ডেটা গ্রহণ করে তা Python অবজেক্টে রূপান্তর করতে পারেন।
# নতুন ইউজার তৈরি করা
@app.route('/user', methods=['POST'])
def add_user():
name = request.json['name']
email = request.json['email']
new_user = User(name, email)
db.session.add(new_user)
db.session.commit()
user_schema = UserSchema()
return user_schema.jsonify(new_user) # JSON ফরম্যাটে রিটার্ন
এখানে:
request.json['name']: এটি JSON রিকোয়েস্ট বডি থেকেnameপ্যারামিটার নেয়।user_schema.jsonify(new_user): এটি নতুনuserঅবজেক্টকে JSON রেসপন্স হিসেবে রিটার্ন করে।
৭. Multiple Data Serialization
যখন অনেকগুলো অবজেক্ট সিরিয়ালাইজ করতে হয়, তখন একটি many=True প্যারামিটার ব্যবহার করা হয়।
# একাধিক ইউজারের ডেটা সিরিয়ালাইজ করা
@app.route('/users', methods=['GET'])
def get_users():
users = User.query.all() # সকল ইউজার প্রাপ্তি
users_schema = UserSchema(many=True)
return users_schema.jsonify(users) # একাধিক ইউজার JSON ফরম্যাটে রিটার্ন
এখানে:
many=Trueব্যবহার করলে একটি তালিকা (list) বা একাধিক অবজেক্টকে JSON এ রূপান্তর করা যাবে।
৮. Error Handling
Flask-Marshmallow ব্যবহার করে সহজেই ত্রুটি পরিচালনা করা যায়। উদাহরণস্বরূপ, যদি কোনো ইউজার পাওয়া না যায় তবে একটি ত্রুটি রিটার্ন করা যায়:
@app.route('/user/<id>', methods=['GET'])
def get_user(id):
user = User.query.get(id)
if user is None:
return jsonify({"error": "User not found"}), 404
user_schema = UserSchema()
return user_schema.jsonify(user)
এখানে:
- যদি
userনা পাওয়া যায়, তবে404 Not Foundএর সাথে একটি ত্রুটি মেসেজ পাঠানো হবে।
Flask-Marshmallow একটি শক্তিশালী টুল যা Flask অ্যাপ্লিকেশনগুলিতে Data Serialization এবং Deserialization সহজ করে তোলে। Flask-Marshmallow ব্যবহার করে আপনি সহজে ডেটা ফরম্যাট যেমন JSON-এ রূপান্তর এবং গ্রহণ করতে পারেন, যা API ডেভেলপমেন্টে অত্যন্ত কার্যকর। Marshmallow স্কিমা ব্যবহারের মাধ্যমে আপনি ডেটার কাঠামো নির্ধারণ করতে পারেন এবং সহজে ডেটা ভ্যালিডেশন করতে পারেন।
Read more