تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

نحوه ایجاد یک API REST با Flask در سرور مجازی اوبونتو Ubuntu


۲۴ بهمن ۱۴۰۳

در توسعه وب، API های RESTful یکی از رایج ترین روش ها برای برقراری ارتباط بین برنامه‌های مختلف محسوب می‌شود. فریمورک Flask به عنوان یک ابزار سبک و قدرتمند در زبان پایتون، امکان پیاده سازی سریع و آسان این نوع API ها را فراهم می‌کند.

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

در ادامه بخوانید:

  • پیش نیاز ها
  • راه اندازی محیط Flask
  • ایجاد یک برنامه Flask
  • ایجاد مسیر های RESTful
  • اجرای API و تست آن
  • جمع بندی

پیش نیاز ها

برای راه اندازی و اجرای یک REST API در Ubuntu، نیاز دارید شرایطی که در ادامه ارائه شده است فراهم باشد.

  • سرور Ubuntu با یک کاربر غیر root که دسترسی sudo داشته باشد و یک فایروال فعال برای امنیت بیشتر تنظیم شده باشد.
  • آشنایی با خط فرمان لینوکس برای اجرای دستورات و مدیریت بسته‌ها، اگر با دستورات لینوکس آشنایی ندارید، پیشنهاد می‌شود ابتدا یک مرور کلی بر مقدمات خط فرمان لینوکس داشته باشید.
  • دانش پایه‌ای از برنامه‌نویسی پایتون.
  • نصب Python 3.7 یا نسخه‌های بالاتر روی سیستم Ubuntu

راه اندازی محیط Flask

Ubuntu 24.04 به صورت پیش فرض دارای Python3 است، اما همیشه بهتر است قبل از شروع، مطمئن شوید که نسخه مناسب روی سیستم شما نصب است. برای بررسی این موضوع کافی است ترمینال را باز کنید و دستور زیر را اجرا کنید.

root@ubuntu:~# python3 --version
Python 3.12.3

اگر Python3 از قبل نصب باشد خروجی مشابه خروجی زیر را دریافت می‌کنید.

root@ubuntu:~# sudo apt install python3

برای مدیریت بسته های پایتون، نیاز به pip دارید. اگر روی سیستم شما نصب نیست، می‌توانید آن را با این دستور اضافه کنید.

root@ubuntu:~# sudo apt install python3-pip

برای نصب Flask از pip استفاده می‌کنیم. پیشنهاد می‌شود این کا را در یک محیط مجازی (virtual environment) انجام دهید تا از تداخل با سایر پکیج ها جلوگیری شود.

root@ubuntu:~# python3 -m venv myprojectenv
root@ubuntu:~# source myprojectenv/bin/activate

root@ubuntu:~# pip install Flask

در ادامه بخوانید: API چیست؟

نحوه ایجاد یک API REST با Flask در سرور مجازی اوبونتو Ubuntu

ایجاد یک برنامه Flask

مرجله بعد نوشتن کد پایتون برای برنامه Flask است. برای ایجاد اسکریپت جدید، به دایرکتوری مورد نظر خود بروید.

root@ubuntu:~# cd ~/path-to-your-script-directory

پس از ورود به دایرکتوری، یک فایل پایتون جدید به نام app.py ایجاد کنید و Flask را درآن ایمپورت import کنید. سپس، یک برنامه Flask را راه‌اندازی کرده و یک مسیر (route) ساده ایجاد کنید.

root@ubuntu:~# nano app.py

این دستور یک ویرایشگر متنی خالی را باز می‌کند؛ منطق خود را در اینجا بنویسید یا کد زیر را کپی کنید.

from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return jsonify(message="Hello, World!")

# In-memory data store
items = [{"id": 1, "name": "This is item 1"}, {"id": 2, "name": "This is item 2"}]

همچنین بخوانید: هاست رایگان Flask

ایجاد مسیر های RESTful

در این بخش، ما مسیر هایی (routes) را در برنامه Flask خود تعریف خواهیم کرد که با اقدامات مختلفی که یک کاربر می‌تواند روی API انجام دهد، مطابقت دارند. هر مسیر یک متد خاص HTTP را مدیریت خواهد کرد.

GETPOSTPUT وDELETE این متدها با چهار عملیات اصلی ذخیره سازی پایدار مطابقت دارند که معموا با نام CRUD (Create, Read, Update, Delete) شناخته می‌شود.

مسیر های زیر را به فایل app.py پایتون خود اضافه کنید.

from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return jsonify(message="Hello, World!")

# In-memory data store
items = [{"id": 1, "name": "This is item 1"}, {"id": 2, "name": "This is item 2"}]

# GET request: Retrieve all items
@app.route('/api/items', methods=['GET'])
def get_items():
    return jsonify(items)

# GET request: Retrieve a specific item by ID
@app.route('/api/items/<int:item_id>', methods=['GET'])
def get_item(item_id):
    item = next((item for item in items if item["id"] == item_id), None)
    if item is None:
        return jsonify({"error": "Item not found"}), 404
    return jsonify(item)

# POST request: Create a new item
@app.route('/api/items', methods=['POST'])
def create_item():
    new_item = {"id": len(items) + 1, "name": request.json.get('name')}
    items.append(new_item)
    return jsonify(new_item), 201

# PUT request: Update an existing item
@app.route('/api/items/<int:item_id>', methods=['PUT'])
def update_item(item_id):
    item = next((item for item in items if item["id"] == item_id), None)
    if item is None:
        return jsonify({"error": "Item not found"}), 404
    item['name'] = request.json.get('name', item['name'])
    return jsonify(item)

# DELETE request: Delete an item
@app.route('/api/items/<int:item_id>', methods=['DELETE'])
def delete_item(item_id):
    global items
    items = [item for item in items if item["id"] != item_id]
    return '', 204

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

در ادامه هر عملکرد هر تابع بررسی شده است.

  • وارد کردن Flask: کد، اجزای لازم را از Flask وارد می‌کند: Flask، jsonify و request.
  • ذخیره‌سازی داده‌ها در حافظه: items یک لیست ساده از دیکشنری‌ها است که به عنوان یک ذخیره‌سازی موقت داده برای API عمل می‌کند.
    هر آیتم دارای یک شناسه (ID) و یک نام (name) است.
  • GET /api/items: هنگامی که یک درخواست GET به /api/items ارسال می‌شود، سرور لیستی از تمام آیتم‌های موجود در مخزن داده را برمی‌گرداند. این متد برای بازیابی همه منابع در یک مجموعه مفید است.
  • POST /api/items: یک درخواست POST به /api/items به کلاینت اجازه می‌دهد یک آیتم جدید ایجاد کند. سرور انتظار دارد که یک شیء JSON حاوی جزئیات آیتم جدید در بدنه درخواست باشد. پس از ایجاد آیتم، سرور با آیتم جدید ایجاد‌شده و کد وضعیت 201 Created پاسخ می‌دهد.
  • PUT /api/items/int:item_id: درخواست PUT به /api/items/<item_id> برای به‌روزرسانی یک آیتم موجود با شناسه مشخص (item_id) استفاده می‌شود. کلاینت اطلاعات به‌روزرسانی‌شده را در بدنه درخواست ارسال می‌کند و سرور آیتم موجود را اصلاح می‌کند. اگر آیتم پیدا نشود، سرور خطای 404 Not Found بازمی‌گرداند.
  • DELETE /api/items/int:item_id: درخواست DELETE به /api/items/<item_id> آیتمی را که دارای شناسه مشخص است، از مخزن داده حذف می‌کند. اگر آیتم با موفقیت حذف شود، سرور با کد وضعیت 204 No Content پاسخ می‌دهد که نشان می‌دهد حذف انجام شده و محتوای دیگری برای بازگرداندن وجود ندارد.
  • اجرای برنامه: بلوک if __name__ == "__main__": تضمین می‌کند که برنامه Flask تنها زمانی اجرا شود که اسکریپت به‌طور مستقیم اجرا شود.

اجرای API و تست آن

برای اجرای سرور Flask از دستور زیر استفاده کنید.

root@ubuntu:~# python3 app.py

پس از اجرای دستور خروجی زیر را مشاهده خواهید کرد.

Output
* Serving Flask app 'app'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 837-877-972

از خروجی بالا مشخص است که سرور Flask در حال اجرا بوده و روی آدرس http://127.0.0.1 و پورت 5000 در حال گوش دادن است.

اکنون می‌توانید اندپوینت‌ها (Endpoints) را با استفاده از curl، Postman یا هر کلاینت HTTP دیگری تست کنید.
در این ادامه از curl برای ارسال درخواست‌های HTTP استفاده شده است.

از هاست ابری Flask لیارا استفاده کنید و API خود را بدون دردسر اجرا کنید!

یک ترمینال جدید باز کنید و دستورات زیر را یکی یکی اجرا کنید.

GET: curl http://127.0.0.1:5000/api/items
POST: curl -X POST -H "Content-Type: application/json" -d "{"name": "This is item 3"}" http://127.0.0.1:5000/api/items
PUT: curl -X PUT -H "Content-Type: application/json" -d "{"name": "This is updated item 1"}" http://127.0.0.1:5000/api/items/1
DELETE: curl -X DELETE http://127.0.0.1:5000/api/items/1

1. ارسال درخواست GET برای دریافت همه آیتم ها

root@ubuntu:~# curl http://127.0.0.1:5000/api/items

خروجی:

Output[
{
"id": 1,
"name": "This is item 1"
},
{
"id": 2,
"name": "This is item 2"
}
]

سرور لیستی از تمام آیتم های موجود را برمی‌گرداند.

2. ارسال درخواست POST برای افزودن یک آیتم جدید

root@ubuntu:~# curl -X POST -H "Content-Type: application/json" -d '{"name": "This is item 3"}' http://127.0.0.1:5000/api/items

خروجی:

Output{
"id": 3,
"name": "This is item 3"
}

سرور آیتم جدید را اضافه کرده و آن را برمی‌گرداند.

نکته: در کنسولی که سرور Flask در آن اجرا شده است، می‌توانید تمام درخواست‌های HTTP و کدهای وضعیت آن‌ها را مشاهده کنید.

127.0.0.1 - - [23/Aug/2024 06:57:27] "GET /api/items HTTP/1.1" 200 -
127.0.0.1 - - [23/Aug/2024 06:59:56] "POST /api/items HTTP/1.1" 201 -

این روش برای نظارت، اشکال‌زدایی و رفع مشکلات سرور بسیار مفید است.

3. ارسال درخواست PUT برای به‌روز رسانی یک آیتم

root@ubuntu:~# curl -X PUT -H "Content-Type: application/json" -d '{"name": "This is updated item 1"}' http://127.0.0.1:5000/api/items/1

خروجی:

Output{
"id": 1,
"name": "This is updated item 1"
}

آیتم با id=1 به‌روز رسانی شد.

برای بررسی تغییرات، درخواست GET را اجرا کنید.

root@ubuntu:~# curl http://127.0.0.1:5000/api/items/1

خروجی:

Output{
"id": 1,
"name": "This is updated item 1"
}

4. ارسال درخواست DELETE برای حدف یک آیتم

root@ubuntu:~# curl -X DELETE http://127.0.0.1:5000/api/items/1

این درخواست آیتم را از مخزن داده حذف می‌کند.

برای اطمینان ار حذف آیتم، دوباره درخواست GET را اجرا کنید.

root@ubuntu:~# curl http://127.0.0.1:5000/api/items

خروجی:

Output[
{
"id": 2,
"name": "This is item 2"
},
{
"id": 3,
"name": "This is item 3"
}
]

آیتم 1 دیگر در لسیت وجود ندارد و به صورت دائمی حذف شده است.

 API های RESTful

جمع بندی

در این مطلب شما یک برنامه REST API پایه با استفاده از Flask آموزش داده شد. اکنون می‌توانید این API را با مسیر های اضافی گسترش دهید، آن را با یک پایگاه داده ادغام کنید یا در یک پلتفرم ابری مانند لیارا مستقر کنید. Flask ابزاری قدرتمند برای ساخت سریع و کارآمدAPI ها است و با این اصول اولیه، آمده هستید تا برنامه های پیچیده تری بسازید.