پروژه عملی با Flask: ساخت یک REST API ساده

فهرست مطالب

“`html

پروژه عملی با Flask: ساخت یک REST API ساده

در این مقاله، یک پروژه عملی را برای ساخت یک REST API ساده با استفاده از Flask، یک میکرو فریم‌ورک پایتون، بررسی خواهیم کرد. هدف از این پروژه، ارائه یک راهنمای گام به گام برای درک مفاهیم اساسی REST API و نحوه پیاده‌سازی آن‌ها با Flask است. این راهنما برای توسعه‌دهندگانی که با پایتون آشنایی دارند و می‌خواهند وارد دنیای توسعه API شوند، مناسب است. با ما همراه باشید!

REST API چیست و چرا از Flask استفاده کنیم؟

REST مخفف Representational State Transfer است و یک معماری نرم‌افزاری است که برای ساخت سرویس‌های وب استفاده می‌شود. یک REST API از درخواست‌های HTTP برای دسترسی و دستکاری منابع استفاده می‌کند. این منابع می‌توانند داده‌ها، تصاویر، یا هر نوع محتوای دیگری باشند. Flask یک میکرو فریم‌ورک پایتون است که به دلیل سادگی، انعطاف‌پذیری و قابلیت گسترش، برای ساخت REST API بسیار مناسب است. Flask به شما امکان می‌دهد تا API خود را به سرعت و با حداقل کد، پیاده‌سازی کنید. برخی از مزایای استفاده از Flask عبارتند از:

  • سادگی: Flask یک فریم‌ورک سبک و آسان برای یادگیری است.
  • انعطاف‌پذیری: Flask به شما آزادی عمل زیادی در انتخاب ابزارها و کتابخانه‌های مورد نیاز می‌دهد.
  • قابلیت گسترش: Flask با استفاده از افزونه‌ها، قابلیت‌های بیشتری را ارائه می‌دهد.
  • جامعه بزرگ: Flask دارای یک جامعه فعال از توسعه‌دهندگان است که پشتیبانی و منابع فراوانی را ارائه می‌دهند.

پیش‌نیازها

قبل از شروع این پروژه، مطمئن شوید که پیش‌نیازهای زیر را دارید:

  • پایتون: پایتون 3.6 یا بالاتر
  • pip: ابزار مدیریت بسته پایتون
  • ویرایشگر کد: یک ویرایشگر کد مانند VS Code, Sublime Text, یا PyCharm

مراحل ساخت REST API با Flask

در این بخش، مراحل ساخت یک REST API ساده را با Flask به صورت گام به گام بررسی خواهیم کرد.

گام 1: ایجاد یک محیط مجازی

ایجاد یک محیط مجازی (Virtual Environment) برای جداسازی وابستگی‌های پروژه از سایر پروژه‌های پایتون، یک اقدام ضروری است. برای ایجاد یک محیط مجازی، از دستور زیر استفاده کنید:

python3 -m venv venv

سپس، محیط مجازی را فعال کنید:

  • در ویندوز: venv\Scripts\activate
  • در macOS و Linux: source venv/bin/activate

گام 2: نصب Flask

پس از فعال‌سازی محیط مجازی، Flask را با استفاده از pip نصب کنید:

pip install Flask

گام 3: ایجاد فایل اصلی برنامه

یک فایل پایتون به نام app.py ایجاد کنید. این فایل، نقطه ورود برنامه Flask شما خواهد بود.

# app.py
 from flask import Flask, jsonify, request

 app = Flask(__name__)

 # Sample data (replace with database later)
 tasks = [
  {
   'id': 1,
   'title': 'Buy groceries',
   'description': 'Milk, Cheese, Pizza, Fruit',
   'done': False
  },
  {
   'id': 2,
   'title': 'Learn Python',
   'description': 'Need to find a good Python tutorial on the web',
   'done': False
  }
 ]

 # Routes will be defined here

 if __name__ == '__main__':
  app.run(debug=True)
 

در این کد، ابتدا Flask را ایمپورت کرده و یک نمونه از کلاس Flask ایجاد می‌کنیم. سپس، یک لیست به نام tasks را به عنوان داده نمونه ایجاد می‌کنیم. در نهایت، برنامه Flask را در حالت debug اجرا می‌کنیم.

گام 4: تعریف مسیرها (Routes)

مسیرها (Routes) مشخص می‌کنند که چگونه برنامه Flask به درخواست‌های HTTP مختلف پاسخ می‌دهد. در این بخش، مسیرهای CRUD (Create, Read, Update, Delete) را برای مدیریت وظایف تعریف خواهیم کرد.

دریافت همه وظایف (GET /tasks)

این مسیر، لیستی از همه وظایف را برمی‌گرداند.

# GET /tasks
 @app.route('/tasks', methods=['GET'])
 def get_tasks():
  return jsonify({'tasks': tasks})
 

در این کد، از دکوراتور @app.route برای تعریف مسیر /tasks با متد GET استفاده می‌کنیم. تابع get_tasks لیست وظایف را به فرمت JSON تبدیل کرده و برمی‌گرداند.

دریافت یک وظیفه خاص (GET /tasks/<int:task_id>)

این مسیر، یک وظیفه خاص را بر اساس ID آن برمی‌گرداند.

# GET /tasks/<int:task_id>
 @app.route('/tasks/<int:task_id>', methods=['GET'])
 def get_task(task_id):
  task = [task for task in tasks if task['id'] == task_id]
  if len(task) == 0:
   return jsonify({'error': 'Task not found'}), 404
  return jsonify({'task': task[0]})
 

در این کد، از <int:task_id> برای دریافت ID وظیفه از URL استفاده می‌کنیم. سپس، وظیفه‌ای که ID آن با task_id مطابقت دارد را جستجو می‌کنیم. اگر وظیفه پیدا نشد، یک پاسخ با کد 404 (Not Found) برمی‌گردانیم.

ایجاد یک وظیفه جدید (POST /tasks)

این مسیر، یک وظیفه جدید ایجاد می‌کند.

# POST /tasks
 @app.route('/tasks', methods=['POST'])
 def create_task():
  if not request.json or not 'title' in request.json:
   return jsonify({'error': 'Title is required'}), 400
  task = {
   'id': tasks[-1]['id'] + 1 if tasks else 1,
   'title': request.json['title'],
   'description': request.json.get('description', ''),
   'done': False
  }
  tasks.append(task)
  return jsonify({'task': task}), 201
 

در این کد، ابتدا بررسی می‌کنیم که درخواست دارای داده JSON باشد و فیلد title در آن وجود داشته باشد. سپس، یک وظیفه جدید با استفاده از داده‌های JSON ایجاد می‌کنیم و به لیست tasks اضافه می‌کنیم. در نهایت، یک پاسخ با کد 201 (Created) برمی‌گردانیم.

به‌روزرسانی یک وظیفه (PUT /tasks/<int:task_id>)

این مسیر، یک وظیفه موجود را به‌روزرسانی می‌کند.

# PUT /tasks/<int:task_id>
 @app.route('/tasks/<int:task_id>', methods=['PUT'])
 def update_task(task_id):
  task = [task for task in tasks if task['id'] == task_id]
  if len(task) == 0:
   return jsonify({'error': 'Task not found'}), 404
  if not request.json:
   return jsonify({'error': 'Request must be JSON'}), 400
  task[0]['title'] = request.json.get('title', task[0]['title'])
  task[0]['description'] = request.json.get('description', task[0]['description'])
  task[0]['done'] = request.json.get('done', task[0]['done'])
  return jsonify({'task': task[0]})
 

در این کد، ابتدا وظیفه‌ای که ID آن با task_id مطابقت دارد را جستجو می‌کنیم. اگر وظیفه پیدا نشد، یک پاسخ با کد 404 برمی‌گردانیم. سپس، فیلدهای title، description و done را با استفاده از داده‌های JSON به‌روزرسانی می‌کنیم.

حذف یک وظیفه (DELETE /tasks/<int:task_id>)

این مسیر، یک وظیفه موجود را حذف می‌کند.

# DELETE /tasks/<int:task_id>
 @app.route('/tasks/<int:task_id>', methods=['DELETE'])
 def delete_task(task_id):
  task = [task for task in tasks if task['id'] == task_id]
  if len(task) == 0:
   return jsonify({'error': 'Task not found'}), 404
  tasks.remove(task[0])
  return jsonify({'result': True})
 

در این کد، ابتدا وظیفه‌ای که ID آن با task_id مطابقت دارد را جستجو می‌کنیم. اگر وظیفه پیدا نشد، یک پاسخ با کد 404 برمی‌گردانیم. سپس، وظیفه را از لیست tasks حذف می‌کنیم.

گام 5: اجرای برنامه

برای اجرای برنامه Flask، دستور زیر را در ترمینال وارد کنید:

python app.py

برنامه Flask در آدرس http://127.0.0.1:5000 اجرا خواهد شد. می‌توانید از ابزارهایی مانند Postman یا Insomnia برای تست API خود استفاده کنید.

تست API با Postman

Postman یک ابزار محبوب برای تست API است. با استفاده از Postman، می‌توانید درخواست‌های HTTP مختلف را به API خود ارسال کرده و پاسخ‌ها را بررسی کنید.

دریافت همه وظایف (GET /tasks)

برای دریافت همه وظایف، یک درخواست GET به آدرس http://127.0.0.1:5000/tasks ارسال کنید. پاسخ باید یک لیست JSON از همه وظایف باشد.

دریافت یک وظیفه خاص (GET /tasks/<task_id>)

برای دریافت یک وظیفه خاص، یک درخواست GET به آدرس http://127.0.0.1:5000/tasks/1 (به عنوان مثال، برای وظیفه با ID 1) ارسال کنید. پاسخ باید یک شی JSON حاوی اطلاعات وظیفه باشد.

ایجاد یک وظیفه جدید (POST /tasks)

برای ایجاد یک وظیفه جدید، یک درخواست POST به آدرس http://127.0.0.1:5000/tasks ارسال کنید. در قسمت body درخواست، داده‌های JSON زیر را وارد کنید:

{
  "title": "New Task",
  "description": "This is a new task"
 }
 

پاسخ باید یک شی JSON حاوی اطلاعات وظیفه جدید باشد.

به‌روزرسانی یک وظیفه (PUT /tasks/<task_id>)

برای به‌روزرسانی یک وظیفه، یک درخواست PUT به آدرس http://127.0.0.1:5000/tasks/1 (به عنوان مثال، برای وظیفه با ID 1) ارسال کنید. در قسمت body درخواست، داده‌های JSON زیر را وارد کنید:

{
  "title": "Updated Task",
  "done": true
 }
 

پاسخ باید یک شی JSON حاوی اطلاعات وظیفه به‌روزرسانی شده باشد.

حذف یک وظیفه (DELETE /tasks/<task_id>)

برای حذف یک وظیفه، یک درخواست DELETE به آدرس http://127.0.0.1:5000/tasks/1 (به عنوان مثال، برای وظیفه با ID 1) ارسال کنید. پاسخ باید یک شی JSON حاوی {"result": true} باشد.

بهبود پروژه: استفاده از پایگاه داده

در این پروژه، از یک لیست ساده به عنوان داده نمونه استفاده کردیم. برای پروژه‌های واقعی، استفاده از یک پایگاه داده ضروری است. می‌توانید از پایگاه داده‌های مختلفی مانند SQLite، MySQL، PostgreSQL یا MongoDB با Flask استفاده کنید. برای این کار، به کتابخانه‌های اضافی مانند SQLAlchemy یا Flask-SQLAlchemy نیاز خواهید داشت.

به عنوان مثال، برای استفاده از SQLite با Flask-SQLAlchemy، می‌توانید مراحل زیر را دنبال کنید:

  1. نصب Flask-SQLAlchemy: pip install Flask-SQLAlchemy
  2. پیکربندی پایگاه داده در app.py:
from flask import Flask, jsonify, request
 from flask_sqlalchemy import SQLAlchemy

 app = Flask(__name__)
 app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///tasks.db'
 db = SQLAlchemy(app)

 class Task(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  title = db.Column(db.String(80), nullable=False)
  description = db.Column(db.String(120), nullable=True)
  done = db.Column(db.Boolean, default=False)

  def __repr__(self):
   return '<Task %r>' % self.title

 # Routes will be defined here

 if __name__ == '__main__':
  with app.app_context():
   db.create_all() # Create database tables
  app.run(debug=True)
 
  1. تغییر مسیرها برای استفاده از پایگاه داده:
# GET /tasks
 @app.route('/tasks', methods=['GET'])
 def get_tasks():
  tasks = Task.query.all()
  output = []
  for task in tasks:
   task_data = {}
   task_data['id'] = task.id
   task_data['title'] = task.title
   task_data['description'] = task.description
   task_data['done'] = task.done
   output.append(task_data)
  return jsonify({'tasks': output})
 

با استفاده از Flask-SQLAlchemy، می‌توانید به راحتی با پایگاه داده تعامل داشته باشید و داده‌ها را به صورت پایدار ذخیره کنید.

امنیت API

امنیت API یک جنبه حیاتی در توسعه REST API است. برای محافظت از API خود در برابر تهدیدات امنیتی، باید اقدامات مناسبی را انجام دهید. برخی از این اقدامات عبارتند از:

  • احراز هویت (Authentication): اطمینان حاصل کنید که فقط کاربران مجاز به API شما دسترسی دارند. می‌توانید از روش‌های مختلفی مانند API Keys، OAuth 2.0 یا JWT (JSON Web Tokens) برای احراز هویت استفاده کنید.
  • مجوز (Authorization): تعیین کنید که هر کاربر مجاز به انجام چه عملیاتی است. می‌توانید از نقش‌ها و مجوزها برای مدیریت دسترسی کاربران استفاده کنید.
  • اعتبارسنجی ورودی (Input Validation): ورودی‌های کاربر را قبل از پردازش اعتبارسنجی کنید تا از حملات تزریق SQL، XSS و سایر حملات جلوگیری کنید.
  • رمزنگاری (Encryption): از رمزنگاری HTTPS برای محافظت از داده‌ها در حین انتقال استفاده کنید.
  • محدود کردن نرخ (Rate Limiting): تعداد درخواست‌هایی که یک کاربر می‌تواند در یک بازه زمانی مشخص ارسال کند را محدود کنید تا از حملات DDoS جلوگیری کنید.

نتیجه‌گیری

در این مقاله، یک پروژه عملی را برای ساخت یک REST API ساده با استفاده از Flask بررسی کردیم. با دنبال کردن این راهنما، شما می‌توانید مفاهیم اساسی REST API را درک کرده و یک API ساده را با Flask پیاده‌سازی کنید. همچنین، با نحوه استفاده از Postman برای تست API و نحوه بهبود پروژه با استفاده از پایگاه داده و اقدامات امنیتی آشنا شدید. امیدواریم این مقاله برای شما مفید بوده باشد!


“`

“تسلط به برنامه‌نویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”

قیمت اصلی 2.290.000 ریال بود.قیمت فعلی 1.590.000 ریال است.

"تسلط به برنامه‌نویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"

"با شرکت در این دوره جامع و کاربردی، به راحتی مهارت‌های برنامه‌نویسی پایتون را از سطح مبتدی تا پیشرفته با کمک هوش مصنوعی ChatGPT بیاموزید. این دوره، با بیش از 6 ساعت محتوای آموزشی، شما را قادر می‌سازد تا به سرعت الگوریتم‌های پیچیده را درک کرده و اپلیکیشن‌های هوشمند ایجاد کنید. مناسب برای تمامی سطوح با زیرنویس فارسی حرفه‌ای و امکان دانلود و تماشای آنلاین."

ویژگی‌های کلیدی:

بدون نیاز به تجربه قبلی برنامه‌نویسی

زیرنویس فارسی با ترجمه حرفه‌ای

۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان