Cách xây dựng API REST với cơ sở dữ liệu Flask và Postgres

Giao diện lập trình ứng dụng (API) là một phần quan trọng trong việc xây dựng và kết nối các hệ thống khác nhau, cho phép các ứng dụng của bạn giao tiếp và trao đổi dữ liệu với các dịch vụ khác.


Mặc dù phát triển phần phụ trợ không chỉ liên quan đến việc viết API — nó còn bao gồm việc viết logic nghiệp vụ phía máy chủ, thiết kế kiến ​​trúc hệ thống hiệu quả và các chức năng chính khác, hãy đọc tiếp để tìm hiểu cách xây dựng API CRUD REST đơn giản với Flask (khung Python nhẹ) , và cơ sở dữ liệu Postgres.


Sử dụng Flask để xây dựng API phụ trợ

Flask là một khung Python nhẹ cung cấp một số tính năng để đơn giản hóa việc viết API phụ trợ cho các máy khách web được viết bằng các công nghệ khác nhau như React và Angular.

Hướng dẫn này sẽ hướng dẫn bạn viết API REST thực hiện bốn thao tác CRUD: tạo, đọc, cập nhật và xóa để quản lý dữ liệu người dùng được lưu trữ trong cơ sở dữ liệu Postgres.

Thiết lập cơ sở dữ liệu Postgres

Để bắt đầu, hãy truy cập ElephantSQL, một giải pháp lưu trữ cơ sở dữ liệu dựa trên đám mây cung cấp nền tảng để tạo và quản lý cơ sở dữ liệu Postgres trên đám mây, đăng ký và đăng nhập vào trang tổng quan về tài khoản của bạn.

Trang chủ ElephantSQL

Nhấn vào Tạo phiên bản mới để tạo một phiên bản mới cho ứng dụng của bạn.

Tạo nút Phiên bản mới trên nền tảng đám mây ElephantSQL

Cung cấp tên phiên bản của bạn và chọn gói miễn phí, cuối cùng chọn khu vực nơi phiên bản sẽ được lưu trữ để hoàn tất quá trình thiết lập.

Phiên bản trên bảng điều khiển

Khi phiên bản được tạo, hãy điều hướng đến trang cài đặt và sao chép URL cơ sở dữ liệubạn sẽ sử dụng nó để thiết lập kết nối với cơ sở dữ liệu.

Chi tiết cơ sở dữ liệu Postgres trên ElephantSQL

Thiết lập máy chủ Flask

Trên thiết bị đầu cuối của bạn, hãy tạo một thư mục dự án và thay đổi thư mục hiện tại thành thư mục mới đó.

Trước khi cài đặt Flask, hãy xác nhận rằng bạn đang chạy Python phiên bản 3.6 trở lên trên máy của mình. Nếu không, bạn cần cài đặt phiên bản Python mới nhất.

 python --version 

Sau đó, cài đặt virtualenvđể tạo ra một môi trường phát triển ảo biệt lập.

 pip install virtualenv 

Tiếp theo, chạy lệnh bên dưới để tạo môi trường ảo.

 virtualenv venv 

Cuối cùng, kích hoạt môi trường ảo.

 # On Windows: 
.venvScriptsactivate
# On Unix or MacOS:
source venv/bin/activate

Cài đặt các gói cần thiết

Trong thư mục gốc của thư mục dự án của bạn, hãy tạo một yêu cầu.txt tập tin và thêm các gói này.

 flask
python-dotenv
psycopg2-binary

Tiếp theo, cài đặt các gói.

 pip install -r requirements.txt 

Các psycopg2-nhị phân là một thư viện Python hoạt động như một phần mềm trung gian, cho phép bạn thiết lập kết nối với cơ sở dữ liệu Postgres của mình và thực hiện các thao tác cơ sở dữ liệu khác nhau.

Cuối cùng, tạo một .env tệp và dán URL cơ sở dữ liệu của bạn.

 DATABASE_URL= your database URL 

Tạo máy chủ Flask

Cuối cùng, tạo một app.py tệp trong thư mục gốc và thêm mã bên dưới.

 import os 
import psycopg2
from dotenv import load_dotenv
from flask import Flask, request, jsonify
load_dotenv()


app = Flask(__name__)
url = os.getenv("DATABASE_URL")
connection = psycopg2.connect(url)


@app.get("https://www.smartreviewaz.com/")
def home():
    return "hello world"

Mã này thiết lập một phiên bản của ứng dụng Flask. Sau đó, nó tạo một kết nối đến cơ sở dữ liệu được chỉ định trong chuỗi URL và cuối cùng, thiết lập một tuyến đường về nhà trả về một chuỗi dưới dạng phản hồi.

Tạo API REST kích hoạt hoạt động CRUD

Bây giờ, hãy xây dựng API REST thực hiện bốn thao tác CRUD.

Tạo một bảng demo

Tạo một bảng người dùng trong cơ sở dữ liệu.

Trong tệp app.py, hãy thêm mã bên dưới.

 CREATE_USERS_TABLE = "CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name TEXT);"
with connection:
    with connection.cursor() as cursor:
        cursor.execute(CREATE_USERS_TABLE)

  • Mã này tạo một bảng PostgreSQL mới có tên người dùng với hai cột.
  • Nó sử dụng phương thức kết nối psycopg2 để thiết lập kết nối với cơ sở dữ liệu và tạo một đối tượng con trỏ mới bằng cách sử dụng kết nối.cursor phương thức được sử dụng để thực hiện các truy vấn SQL.

1. Xác định phương thức POST

Tạo tuyến bài đăng để thêm dữ liệu.

 INSERT_USER_RETURN_ID = "INSERT INTO users (name) VALUES (%s) RETURNING id;"
@app.route("/api/user", methods=["POST"])
def create_user():
    data = request.get_json()
    name = data["name"]
    with connection:
        with connection.cursor() as cursor:
            cursor.execute(INSERT_USER_RETURN_ID, (name,))
            user_id = cursor.fetchone()[0]
    return {"id": user_id, "name": name, "message": f"User {name} created."}, 201
  • Chuỗi truy vấn SQL xác định một câu lệnh SQL sẽ được thực thi bằng cách sử dụng con trỏ.execute phương pháp để chèn một hàng mới có tên người dùng vào người dùng bảng trong cơ sở dữ liệu. Nó trả về ID người dùng mới được tạo.
  • Các tạo người dùng hàm lấy tên làm tham số để lưu trữ trong cơ sở dữ liệu trong khi con trỏ.fetchone được gọi để truy xuất ID người dùng mới được tạo. Cuối cùng, một từ điển chứa ID và tên của người dùng mới được tạo, cùng với thông báo cho biết rằng người dùng đã được tạo thành công sẽ được trả về.

Lộ trình yêu cầu API phương thức đăng bài

2. Xác định phương thức GET

Xác định hai tuyến nhận: một, để truy xuất tất cả dữ liệu trong cơ sở dữ liệu và hai, để truy xuất dữ liệu cụ thể từ cơ sở dữ liệu dựa trên ID.

 SELECT_ALL_USERS = "SELECT * FROM users;"
@app.route("/api/user", methods=["GET"])
def get_all_users():
    with connection:
        with connection.cursor() as cursor:
            cursor.execute(SELECT_ALL_USERS)
            users = cursor.fetchall()
            if users:
                result = []
                for user in users:
                    result.append({"id": user[0], "name": user[1]})
                return jsonify(result)
            else:
                return jsonify({"error": f"Users not found."}), 404


@app.route("/api/user/<int:user_id>", methods=["GET"])
def get_user(user_id):
    with connection:
        with connection.cursor() as cursor:
            cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
            user = cursor.fetchone()
            if user:
                return jsonify({"id": user[0], "name": user[1]})
            else:
                return jsonify({"error": f"User with ID {user_id} not found."}), 404

  • Tuyến API đầu tiên này xử lý các yêu cầu HTTP GET để truy xuất tất cả người dùng từ cơ sở dữ liệu. Nó truy xuất tất cả người dùng từ cơ sở dữ liệu và trả về kết quả ở định dạng JSON trong phản hồi.
    Nhận tất cả lộ trình API của người dùng

  • Tuyến API thứ hai này xử lý các yêu cầu HTTP GET để truy xuất dữ liệu cho một người dùng cụ thể từ cơ sở dữ liệu. Nó mất trong tên người dùng làm tham số, truy xuất dữ liệu của người dùng từ cơ sở dữ liệu và trả về kết quả ở định dạng JSON trong phản hồi.
    Nhận người dùng theo lộ trình API ID

3. Xác định Phương thức PUT

Tạo put route để cập nhật dữ liệu được lưu trữ trong cơ sở dữ liệu.

 @app.route("/api/user/<int:user_id>", methods=["PUT"])
def update_user(user_id):
    data = request.get_json()
    name = data["name"]
    with connection:
        with connection.cursor() as cursor:
            cursor.execute(UPDATE_USER_BY_ID, (name, user_id))
            if cursor.rowcount == 0:
                return jsonify({"error": f"User with ID {user_id} not found."}), 404
    return jsonify({"id": user_id, "name": name, "message": f"User with ID {user_id} updated."})
  • Các update_user chức năng lấy tham số ID người dùng làm đầu vào và sử dụng nó để cập nhật tên của người dùng được chỉ định trong cơ sở dữ liệu.
  • Nếu hoạt động cập nhật thành công, nó sẽ trả về một đối tượng JSON với tên, ID người dùng đã cập nhật và thông báo thành công trong phản hồi.
    Cập nhật người dùng theo lộ trình API ID

4. Xác định phương thức XÓA

Thực hiện các tuyến xóa để xóa dữ liệu được lưu trữ của một người dùng cụ thể trong cơ sở dữ liệu.

 @app.route("/api/user/<int:user_id>", methods=["DELETE"])
def delete_user(user_id):
    with connection:
        with connection.cursor() as cursor:
            cursor.execute(DELETE_USER_BY_ID, (user_id,))
            if cursor.rowcount == 0:
                return jsonify({"error": f"User with ID {user_id} not found."}), 404
    return jsonify({"message": f"User with ID {user_id} deleted."})
  • Tuyến API này xử lý chức năng xóa của một người dùng cụ thể khỏi cơ sở dữ liệu dựa trên ID của họ. Nếu không tìm thấy người dùng, nó sẽ trả về mã trạng thái 404 với thông báo lỗi. Tuy nhiên, nếu thao tác xóa thành công, nó sẽ trả về một đối tượng JSON với thông báo thành công trong phản hồi.
    Xóa người dùng theo lộ trình API ID

Viết API REST bằng Flask

Hướng dẫn này trình bày cách sử dụng Flask và Postgres để xây dựng API CRUD REST đơn giản cùng với cách thiết lập kết nối cơ sở dữ liệu và thực hiện các truy vấn SQL khác nhau để đọc và ghi dữ liệu vào cơ sở dữ liệu. Giờ đây, bạn có thể tạo một API REST đơn giản có thể xử lý bốn thao tác CRUD cần thiết trong bất kỳ ứng dụng web nào.

Cho dù bạn đang xây dựng một blog đơn giản hay một ứng dụng web phức tạp, Flask và Postgres đều cung cấp các tính năng và khả năng mạnh mẽ cần thiết để tạo một hệ thống phụ trợ mạnh mẽ. Ngoài ra, bạn có thể sử dụng các công nghệ khác như FastAPI và MongoDB để xây dựng API RESTful.

Previous Post
Next Post

post written by: