Sunday, January 19, 2025

[REST API] – FLASK PYTHON #2: Tạo biến môi trường và khai báo module

-

1. Tổng quan.

Bài viết này sẽ tập trung vào việc thiết lập môi trường phát triển và khai báo các module cần thiết để bắt đầu phát triển một RESTful API bằng Flask Python.


Tạo biến môi trường và khai báo module là các khái niệm quan trọng trong việc phát triển và quản lý ứng dụng phần mềm. Dưới đây, tôi sẽ giải thích cả hai khái niệm này:

Biến Môi Trường (Environment Variables):

  • Biến môi trường là các giá trị dữ liệu mà hệ thống hoặc ứng dụng của bạn có thể sử dụng để cấu hình hoạt động của nó. Thay vì trực tiếp đặt các giá trị cố định trong mã nguồn ứng dụng, bạn có thể sử dụng biến môi trường để lưu trữ thông tin như cài đặt cơ sở dữ liệu, khóa API, cổng kết nối, v.v.
  • Việc sử dụng biến môi trường giúp bạn tách biệt cấu hình ứng dụng với mã nguồn, dễ dàng quản lý và bảo mật thông tin quan trọng.
Ví dụ trong Python, bạn có thể sử dụng thư viện os để đọc và thiết lập biến môi trường:

import os

# Đọc giá trị của biến môi trường
database_url = os.environ.get('DATABASE_URL')

# Thiết lập giá trị cho biến môi trường
os.environ['API_KEY'] = 'my_api_key'

Khai Báo Module:

  • Một module trong ngôn ngữ lập trình là một tập hợp các hàm, lớp, biến và mã nguồn liên quan được tổ chức lại trong một file hoặc thư mục để tái sử dụng trong các phần của ứng dụng khác nhau.
  • Khai báo module thường được sử dụng để tách biệt và sắp xếp mã nguồn của ứng dụng thành các phần nhỏ hơn và dễ quản lý. Điều này giúp tăng tính tái sử dụng, hiệu quả và bảo trì của mã nguồn.
  • Trong Python, mỗi file Python (.py) có thể được coi là một module, và bạn có thể import module này vào các file khác bằng cách sử dụng câu lệnh import. Ví dụ:

Trong file math_operations.py

def add(x, y):
    return x + y

def subtract(x, y):
    return x - y

Trong file main.py

import math_operations

result = math_operations.add(5, 3)

Trong ví dụ trên, math_operations là một module và được import vào file main.py để sử dụng các hàm addsubtract.

Kết hợp cả hai khái niệm này, bạn có thể sử dụng biến môi trường để cấu hình các giá trị quan trọng trong ứng dụng và sử dụng module để tách biệt và quản lý mã nguồn của ứng dụng một cách cấu trúc và dễ quản lý.

2. Thực hành.

a. Cài đặt Database.

Mình sẽ sử dụng MariaDB trong loạt bài viết liên quan đến RESFUL API này.

#!/bin/bash
dbuser='hoanghd'
dbname='cisco_info'
dbpasswd='Hoanghd164'

sudo apt update
sudo apt install software-properties-common -y
sudo curl -LsS -O https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
sudo bash mariadb_repo_setup --mariadb-server-version=10.6
sudo apt update
sudo apt -y install mariadb-common mariadb-client-10.6 mariadb-server-10.6 

sudo mysql -u root -e  "ALTER USER 'root'@'localhost' IDENTIFIED BY '$dbpasswd';"
sudo mysql -u root -p$dbpasswd -e "CREATE USER 'root'@'%' IDENTIFIED BY '$dbpasswd';"
sudo mysql -u root -p$dbpasswd -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';"
sudo mysql -u root -p$dbpasswd -e "create database $dbname character set utf8mb4 collate utf8mb4_bin;"
sudo mysql -u root -p$dbpasswd -e "grant all privileges on $dbname.* to $dbuser@'%' identified by '$dbpasswd';"
sudo mysql -u root -p$dbpasswd -e "FLUSH PRIVILEGES;"

sudo sed -i 's|bind-address.*|bind-address = 0.0.0.0|' /etc/mysql/mariadb.conf.d/50-server.cnf

sudo systemctl enable mariadb
sudo systemctl restart mariadb

Bạn tạo file db_install.sh và hãy thay đổi tham số và chạy Script trên để hoàn thành 1 Database nhé.

b. Chuẩn bị cấu trúc file và thư mục.

Bạn hãy khởi tạo cho mình các file và thư mục theo cấu trúc dưới, bạn hãy để trắng nó và chúng ta sẽ thêm nội dung vào từng file ở các phần tiếp theo.

../devnet
├── cisco_os
│   ├── __init__.py
│   ├── backend
│   │   └── arp
│   │       ├── controller.py
│   │       ├── getdata.py
│   │       └── services.py
│   ├── config.py
│   ├── extension.py
│   └── model.py
├── network.py
└── venv
    ├── db_install.sh
    └── requirements.txt

Cấu trúc thư mục đưa ra là một dự án phát triển ứng dụng Python, có thể là một ứng dụng liên quan đến quản lý và tương tác với các thiết bị mạng của Cisco (có thể là dự án Cisco DevNet). Dưới đây là một giải thích về từng phần trong cấu trúc thư mục này:

  • cisco_os: Đây là thư mục gốc của ứng dụng. Nó chứa toàn bộ mã nguồn và các file liên quan đến ứng dụng Cisco OS.
    • __init__.py: Một file __init__.py được sử dụng để xác định rằng thư mục này là một gói Python. Bạn có thể import các mô-đun từ thư mục này.
    • backend: Thư mục này có thể chứa các module hoặc phần của ứng dụng liên quan đến giao tiếp với backend (ví dụ: dịch vụ web, API) hoặc xử lý dữ liệu.
      • arp: Có là một phần của ứng dụng liên quan đến việc lấy dữ liệu ARP (Address Resolution Protocol), được sắp xếp thành các module riêng biệt.
        • controller.py: Là module điều khiển, chứa các hàm điều khiểnquá trình xử lý ARP, các hàm này sẽ gọi từ file services.py.
        • getdata.py: Là module để lấy dữ liệu từ thiết bị Cisco liên quan đến ARP.
        • services.py: Là module chứa các dịch vụ (services) liên quan đến ARP.
    • config.py: Chứa cấu hình của ứng dụng, chẳng hạn như các biến môi trường, cài đặt cơ sở dữ liệu, v.v.
    • extension.py: Chứa các extension hoặc thư viện mở rộng cho ứng dụng của bạn, ở dây mình sử dụng khai báo cấu hình của Database.
    • model.py: Định nghĩa của các model hoặc đối tượng dữ liệu trong ứng dụng (nếu ứng dụng này sử dụng ORM, chẳng hạn như SQLAlchemy).
  • network.py: Đây là file chính để chúng ta khởi tạo websocket.
  • venv: Đây là thư mục mình chuẩn bị để lưu 2 file chuẩn bị cấu hình cho dự án, bao gồm requirements.txtdb_install.sh.
    • db_install.sh: Là file script để cài đặt cơ sở dữ liệu hoặc các thành phần liên quan đến cơ sở dữ liệu.
    • requirements.txt: Chứa danh sách các phụ thuộc (dependencies) Python của dự án, được sử dụng bởi pip để cài đặt các gói cần thiết.

Cấu trúc thư mục này thường được tổ chức theo cách tốt để dễ quản lý và bảo trì mã nguồn của ứng dụng Python.

c. Tạo biến môi trường và khai báo module.

Ở phần này chúng ta chỉ làm các file theo cây thư mục này nhé.

../devnet
├── cisco_os
│   ├── __init__.py
│   ├── backend
│   │   └── arp
│   │       ├── controller.py
│   │       └── services.py
│   └── config.py
├── network.py
└── venv
    ├── db_install.sh
    └── requirements.txt
  • config.py
import os
from dotenv import load_dotenv

load_dotenv()
SECRET_KEY = os.environ.get("KEY")
SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL")
SQLALCHEMY_TRACK_MODIFICATIONS = False
  • .env
KEY = "hoanghd-secret-key"
DATABASE_URL = 'mysql://hoanghd:Hoanghd164@192.168.13.200/cisco_info'
  • __init__.py
from flask import Flask, Blueprint
from .backend.arp.controller import get_arp_bl

def create_cisco_os_app(config_file="config.py"):
    cisco_os = Flask(__name__)
    cisco_os.config.from_pyfile(config_file)
    print('SECRET_KEY: %s' %(cisco_os.config["SECRET_KEY"]))
    print('SQLALCHEMY_DATABASE_URI: %s' %(cisco_os.config["SQLALCHEMY_DATABASE_URI"]))
    cisco_os.register_blueprint(get_arp_bl)

    return cisco_os
  • controller.py
from flask import Blueprint
from .services import route_demo_service

get_arp_bl = Blueprint("get_arp_bl", __name__)

@get_arp_bl.route("/route_demo", methods=['GET'])
def route_demo():
    return route_demo_service()
  • services.py
def route_demo_service():
    return "Hello world"
  • network.py
from cisco_os import create_cisco_os_app

if __name__ == "__main__":
    cisco_network = create_cisco_os_app()
    cisco_network.run(debug=True, host='0.0.0.0', port=5000)
  • File requirements.txt
Flask
Flask-SQLAlchemy
Flask-Bcrypt
mysqlclient
netmiko
python-dotenv
flask-marshmallow

Dự án này là một ứng dụng web sử dụng Flask, một framework phát triển ứng dụng web Python. Dưới đây là giải thích về cách cấu trúc thư mục và các file liên quan trong dự án hoạt động:

  • config.py: Đây là file cấu hình của ứng dụng. Nó sử dụng thư viện dotenv để đọc các biến môi trường từ file .env và sử dụng chúng để cấu hình ứng dụng. Các thông tin như SECRET_KEYSQLALCHEMY_DATABASE_URI được lấy từ biến môi trường.
  • .env: Đây là file chứa các biến môi trường. Nó chứa giá trị của SECRET_KEYSQLALCHEMY_DATABASE_URI mà ứng dụng sử dụng để thiết lập môi trường làm việc và kết nối đến cơ sở dữ liệu.
  • init.py: Đây là một file __init__.py trong gói cisco_os. Nó chứa một hàm create_cisco_os_app được sử dụng để tạo và cấu hình ứng dụng Flask. Ứng dụng được cấu hình bằng cách sử dụng các giá trị trong file config.py. Ứng dụng cũng đăng ký một blueprint get_arp_bl, có thể là một phần của ứng dụng liên quan đến ARP.
  • controller.py: Đây là module điều khiển của blueprint get_arp_bl. Nó định nghĩa một tuyến đường (route) /route_demo, mà khi được gọi, nó sẽ gọi hàm route_demo_service và trả về “Hello world”.
  • services.py: Đây là module chứa logic xử lý dịch vụ (service) cho ứng dụng. Trong trường hợp này, nó chỉ đơn giản trả về chuỗi “Hello world” khi được gọi bởi tuyến đường /route_demo.
  • network.py: Đây là module chính của ứng dụng. Nó sử dụng hàm create_cisco_os_app để tạo ứng dụng Flask và sau đó chạy ứng dụng trên một máy chủ cục bộ với debug mode được bật và lắng nghe trên cổng 5000.

Khi bạn chạy file network.py, nó sẽ tạo ứng dụng Flask và lắng nghe các yêu cầu HTTP tới cổng 5000 trên máy tính của bạn. Khi bạn truy cập vào URL của ứng dụng (ví dụ: http://localhost:5000/route_demo), nó sẽ kích hoạt tuyến đường /route_demo, gọi hàm route_demo_service, và trả về chuỗi “Hello world” trong trình duyệt của bạn.

Bây giờ bạn hãy vào môi trường ảo và chạy các lệnh sau.

  • Cài đặt các module khai báo trong file requirements.txt.
pip install -r requirements.txt
  • Sau đó chạy lệnh python3 network.py để khởi động ứng dụng.
(.venv) root@flask-13-200:/home/devnet# python3 network.py 
 * Serving Flask app 'cisco_os'
 * Debug mode: on
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://192.168.13.200:5000
SECRET_KEY: hoanghd-secret-key
SQLALCHEMY_DATABASE_URI: mysql://hoanghd:Hoanghd164@192.168.13.200/cisco_info
 * Debugger is active!
 * Debugger PIN: 101-494-363
Press CTRL+C to quit

Bạn sẽ nhìn thấy giá trị được mình in ra màn hình để test:

  • SECRET_KEY: hoanghd-secret-key
  • SQLALCHEMY_DATABASE_URI: mysql://hoanghd:Hoanghd164@192.168.13.200/cisco_info

Bây giờ nếu bạn dùng Postman thì bạn sẽ có kết quả như hình.

Bạn có thể sử dụng trình duyệt để kiểm tra nếu chưa cài Postman nhé.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories