وبلاگ
پروژه عملی با Flask: ساخت یک REST API ساده
فهرست مطالب
“تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”
"تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"
"با شرکت در این دوره جامع و کاربردی، به راحتی مهارتهای برنامهنویسی پایتون را از سطح مبتدی تا پیشرفته با کمک هوش مصنوعی ChatGPT بیاموزید. این دوره، با بیش از 6 ساعت محتوای آموزشی، شما را قادر میسازد تا به سرعت الگوریتمهای پیچیده را درک کرده و اپلیکیشنهای هوشمند ایجاد کنید. مناسب برای تمامی سطوح با زیرنویس فارسی حرفهای و امکان دانلود و تماشای آنلاین."
ویژگیهای کلیدی:
بدون نیاز به تجربه قبلی برنامهنویسی
زیرنویس فارسی با ترجمه حرفهای
۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان
0 تا 100 عطرسازی + (30 فرمولاسیون اختصاصی حامی صنعت)
دوره فوق فشرده مکالمه زبان انگلیسی (ویژه بزرگسالان)
شمع سازی و عودسازی با محوریت رایحه درمانی
صابون سازی (دستساز و صنعتی)
صفر تا صد طراحی دارو
متخصص طب سنتی و گیاهان دارویی
متخصص کنترل کیفی شرکت دارویی
“`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، میتوانید مراحل زیر را دنبال کنید:
- نصب Flask-SQLAlchemy:
pip install Flask-SQLAlchemy
- پیکربندی پایگاه داده در
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)
- تغییر مسیرها برای استفاده از پایگاه داده:
# 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”
"تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"
"با شرکت در این دوره جامع و کاربردی، به راحتی مهارتهای برنامهنویسی پایتون را از سطح مبتدی تا پیشرفته با کمک هوش مصنوعی ChatGPT بیاموزید. این دوره، با بیش از 6 ساعت محتوای آموزشی، شما را قادر میسازد تا به سرعت الگوریتمهای پیچیده را درک کرده و اپلیکیشنهای هوشمند ایجاد کنید. مناسب برای تمامی سطوح با زیرنویس فارسی حرفهای و امکان دانلود و تماشای آنلاین."
ویژگیهای کلیدی:
بدون نیاز به تجربه قبلی برنامهنویسی
زیرنویس فارسی با ترجمه حرفهای
۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان