Thực Hành Tốt Nhất để Thiết lập Ứng Dụng Web Flask: Hướng Dẫn Toàn Diện

By JoeVu, at: 09:19 Ngày 08 tháng 5 năm 2023

Thời gian đọc ước tính: __READING_TIME__ minutes

Best Practices for Setting up a Flask Web Application: A Comprehensive Guide
Best Practices for Setting up a Flask Web Application: A Comprehensive Guide
```html

1. Giới thiệu

 

Flask, một framework web vi mô phổ biến của Python dùng để xây dựng các ứng dụng web với Python, được biết đến với sự đơn giản, linh hoạt và dễ sử dụng. Framework này cung cấp một cách tiếp cận nhẹ nhàng và tối giản đối với phát triển web, cho phép các nhà phát triển nhanh chóng xây dựng các ứng dụng web mà không bị ràng buộc bởi một kiến trúc phức tạp.

 

Tuy nhiên, việc thiết lập một ứng dụng Flask có thể khó khăn đối với cả người mới bắt đầu và các nhà phát triển giàu kinh nghiệm. Trong bài viết này, chúng ta sẽ cung cấp một hướng dẫn toàn diện để thiết lập một ứng dụng Flask với các thực tiễn tốt nhất (được cộng đồng và các bài đăng trên blog khuyến nghị). Chúng ta sẽ đề cập đến mọi thứ như bộ nhớ đệm, ghi nhật ký, thiết kế API REST, tác vụ nền và kiểm thử đơn vị với Pytest. Vào cuối bài viết này, bạn sẽ có một hiểu biết vững chắc về cách xây dựng một ứng dụng Flask có khả năng mở rộng, dễ bảo trì và tuân thủ các thực tiễn tốt nhất.

 

Trước khi bạn đi sâu hơn, hãy kiểm tra mã mẫu của chúng tôi cho một ứng dụng Flask đơn giản

 

1.1 Giải thích ngắn gọn về Flask

 

Là một framework web Python nhẹ nhànglinh hoạt cung cấp cho các nhà phát triển các công cụ cần thiết để xây dựng các ứng dụng web nhanh hơn. Nó phổ biến trong số các nhà phát triển do sự đơn giản và dễ sử dụng của nó, làm cho nó trở thành một lựa chọn tuyệt vời cho các dự án vừa và nhỏ.

 

Một trong những điểm mạnh chính của Flask là sự linh hoạt của nó. Flask cung cấp cho các nhà phát triển một API đơn giản và trực quan, cho phép họ tùy chỉnh và mở rộng ứng dụng của mình theo nhu cầu. Flask cũng cung cấp một số tính năng tích hợp sẵn, chẳng hạn như hỗ trợ tích hợp cho việc kiểm thử và gỡ lỗi, có thể giúp đẩy nhanh quá trình phát triển.

 

1.2 Tầm quan trọng của việc tuân theo các thực tiễn tốt nhất khi thiết lập một ứng dụng Flask

 

Mặc dù Flask dễ sử dụng và linh hoạt, nhưng điều cần thiết là phải tuân theo các thực tiễn tốt nhất khi thiết lập một ứng dụng Flask để đảm bảo khả năng mở rộng, khả năng bảo trì và bảo mật của nó. Bằng cách tuân theo các thực tiễn tốt nhất, bạn có thể xây dựng một ứng dụng Flask đáng tin cậy, hiệu quả và dễ bảo trì.

Một số thực tiễn tốt nhất cần tuân theo khi thiết lập một ứng dụng Flask bao gồm sử dụng bản vẽ để mô-đun hóa ứng dụng của bạn, triển khai bộ nhớ đệm để cải thiện hiệu suất, sử dụng biến môi trường để lưu trữ thông tin nhạy cảm và viết mã sạch và dễ đọc.

Ngoài việc tuân theo các thực tiễn tốt nhất, còn có một số gói và tiện ích mở rộng hữu ích dành cho Flask có thể giúp đơn giản hóa quá trình phát triển. Một số gói và tiện ích mở rộng phổ biến bao gồm Flask-SQLAlchemy để tích hợp cơ sở dữ liệu, Flask-RESTful để xây dựng API RESTful, Flask-Login để xác thực và ủy quyền và Flask-Caching để bộ nhớ đệm.

Trong các phần tiếp theo, chúng ta sẽ đi sâu hơn vào các thực tiễn tốt nhất và gói này để giúp bạn xây dựng một ứng dụng Flask mạnh mẽ và có khả năng mở rộng.
 

2. Thiết lập môi trường ảo

 

2.1 Giải thích về thiết lập môi trường ảo

 

Môi trường ảo là một công cụ cần thiết cho việc phát triển Python. Chúng cho phép bạn tạo một môi trường riêng biệt, nơi bạn có thể cài đặt các gói và phụ thuộc của Python mà không ảnh hưởng đến việc cài đặt Python trên toàn hệ thống. Điều này đảm bảo rằng ứng dụng của bạn sẽ hoạt động nhất quán, bất kể phiên bản Python hoặc các gói đã cài đặt trên máy chủ.
 

 

2.2 Tạo môi trường ảo với pyenv, pip và requirements.txt

 

Để tạo môi trường ảo, chúng ta sẽ sử dụng tệp `pyenv`, `pip` và `requirements.txt`.

Cài đặt pyenv bằng lệnh sau

curl https://pyenv.run | bash


Sau khi cài đặt pyenv, chúng ta có thể tạo một môi trường ảo mới cho ứng dụng Flask của mình bằng lệnh sau

pyenv virtualenv


Thay thế bằng phiên bản Python bạn muốn sử dụng và bằng tên cho môi trường ảo của bạn.

Kích hoạt môi trường ảo bằng lệnh sau

pyenv activate


Tạo tệp requirements.txt trong thư mục dự án của bạn với nội dung sau

Flask==2.3.0
requests==2.2.0


Thêm bất kỳ gói và phụ thuộc nào khác cần thiết vào tệp này.

Cài đặt các gói cần thiết bằng pip

pip install -r requirements.txt

 

 

2.3 Cài đặt Flask và các phụ thuộc cần thiết

 

Sau khi bạn đã tạo và kích hoạt môi trường ảo của mình, bạn có thể cài đặt Flask và bất kỳ phụ thuộc nào khác cần thiết bằng pip. Để cài đặt Flask, chỉ cần chạy lệnh sau:

pip install Flask


Điều này sẽ cài đặt phiên bản mới nhất của Flask, cùng với bất kỳ phụ thuộc nào cần thiết. Nếu bạn cần một phiên bản Flask cụ thể, bạn có thể chỉ định nó bằng toán tử ==, như thế này:

pip install Flask==


Bằng cách thiết lập môi trường ảo và cài đặt Flask và các phụ thuộc của nó, bạn có thể đảm bảo rằng ứng dụng của bạn sẽ hoạt động nhất quán, bất kể phiên bản Python hoặc các gói đã cài đặt trên máy chủ.
 

3. Thiết lập biến môi trường

 

3.1 Giải thích về biến môi trường

 

Biến môi trường là các biến được đặt trong hệ điều hành và có thể được truy cập bởi các chương trình đang chạy trên hệ thống. Trong Flask, biến môi trường thường được sử dụng để lưu trữ thông tin nhạy cảm như mật khẩu cơ sở dữ liệu, khóa API và các giá trị cấu hình khác.
 

 

3.2 Thiết lập biến môi trường

 

Để thiết lập biến môi trường cho ứng dụng Flask của bạn, bạn có thể sử dụng nhiều phương pháp khác nhau tùy thuộc vào hệ điều hành và môi trường triển khai của bạn. Một số cách phổ biến để thiết lập biến môi trường bao gồm:

1. Tệp .env

Tệp .env là một tệp văn bản đơn giản chứa các cặp khóa-giá trị của biến môi trường. Bạn có thể sử dụng gói python-dotenv để tải các biến này vào ứng dụng Flask của mình.

Ví dụ về tệp .env

SECRET_KEY=your_secret_key
DB_HOST=your_database_host
DB_NAME=your_database_name
DB_USER=your_database_user
DB_PASS=your_database_password


Để tải các biến từ tệp này, bạn có thể thêm mã sau vào ứng dụng Flask của mình:

from dotenv import load_dotenv
import os

# Load environment variables from .env file
load_dotenv()

# Access environment variables
secret_key = os.getenv('SECRET_KEY')
db_host = os.getenv('DB_HOST')
db_name = os.getenv('DB_NAME')
db_user = os.getenv('DB_USER')
db_pass = os.getenv('DB_PASS')


Gói được khuyến nghị: python-dotenv

2. Tệp JSON

Bạn cũng có thể sử dụng tệp JSON để lưu trữ biến môi trường cho ứng dụng Flask của mình. Để tải biến từ tệp JSON, bạn có thể sử dụng gói json đi kèm với Python.

Ví dụ về tệp JSON


{
  "SECRET_KEY": "your_secret_key",
  "DB_HOST": "your_database_host",
  "DB_NAME": "your_database_name",
  "DB_USER": "your_database_user",
  "DB_PASS": "your_database_password"
}


Để tải các biến từ tệp này, bạn có thể thêm mã sau vào ứng dụng Flask của mình

import json
import os

# Load environment variables from JSON file
with open('config.json') as f:
    config = json.load(f)

# Access environment variables
secret_key = config['SECRET_KEY']
db_host = config['DB_HOST']
db_name = config['DB_NAME']
db_user = config['DB_USER']
db_pass = config['DB_PASS']


3. Tệp TOML

Bạn cũng có thể sử dụng tệp TOML để lưu trữ biến môi trường cho ứng dụng Flask của mình. Để tải biến từ tệp TOML, bạn có thể sử dụng gói toml.

Ví dụ về tệp TOML

SECRET_KEY = "your_secret_key"
DB_HOST = "your_database_host"
DB_NAME = "your_database_name"
DB_USER = "your_database_user"
DB_PASS = "your_database_password"


Để tải các biến từ tệp này, bạn có thể thêm mã sau vào ứng dụng Flask của mình

import toml
import os

# Load environment variables from TOML file
config = toml.load('config.toml')

# Access environment variables
secret_key = config['SECRET_KEY']
db_host = config['DB_HOST']
db_name = config['DB_NAME']
db_user = config['DB_USER']
db_pass = config['DB_PASS']


Bất kể phương pháp bạn chọn, điều quan trọng là phải đảm bảo rằng thông tin nhạy cảm được giữ an toàn và không bị lộ trong bất kỳ mã hoặc tệp nào có thể truy cập công khai.


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

 

4.1 Giải thích về cơ sở dữ liệu Flask

 


Cơ sở dữ liệu là một thành phần thiết yếu của hầu hết các ứng dụng web vì nó lưu trữ dữ liệu mà ứng dụng hoạt động cùng. Flask hỗ trợ một số cơ sở dữ liệu bao gồm PostgreSQL, MySQL, SQLite và các cơ sở dữ liệu khác. Flask sử dụng SQLAlchemy, một thư viện ánh xạ đối tượng-quan hệ (ORM) phổ biến cung cấp giao diện cấp cao để tương tác với cơ sở dữ liệu. SQLAlchemy giúp dễ dàng làm việc với cơ sở dữ liệu và nó trừu tượng hóa nhiều sự phức tạp của việc làm việc với SQL thô.
 

 

4.2 Chọn công cụ cơ sở dữ liệu - SQLAlchemy

 


Việc chọn công cụ cơ sở dữ liệu phụ thuộc vào các yêu cầu của ứng dụng. PostgreSQL và MySQL là những lựa chọn phổ biến cho các ứng dụng Flask do các tính năng, hiệu suất và độ tin cậy của chúng. Sau khi chọn công cụ cơ sở dữ liệu, bước tiếp theo là tạo cơ sở dữ liệu và kết nối với nó bằng Flask-SQLAlchemy. SQLAlchemy cung cấp giao diện nhất quán để kết nối với các cơ sở dữ liệu khác nhau và nó hỗ trợ nhiều công cụ cơ sở dữ liệu.

Ví dụ về tệp cấu hình json

{
    "SECRET_KEY": "randon-secret-123",
    "CELERY": {
        "broker_url": "redis://localhost:6379/0",
        "result_backend": "redis://localhost:6379/0",
        "task_ignore_result": false,
        "imports": ["tasks"],
        "worker_redirect_stdouts_level": "CRITICAL"
    },
    "REDIS_URL": "redis://localhost:6379/1",
    "SQLALCHEMY_DATABASE_URI": "postgresql://samples:password@localhost:5432/samples"
}

 

4.3 Tạo mô hình cơ sở dữ liệu

 


Sau khi kết nối với cơ sở dữ liệu, bước tiếp theo là tạo mô hình cơ sở dữ liệu. Mô hình cơ sở dữ liệu xác định cấu trúc của bảng cơ sở dữ liệu, bao gồm các trường và mối quan hệ với các bảng khác. Trong Flask, bạn có thể định nghĩa mô hình cơ sở dữ liệu bằng Flask-SQLAlchemy, đây là một bộ công cụ SQL và ORM mạnh mẽ.

Đây là một ví dụ về mô hình cơ sở dữ liệu đơn giản
 

from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(80), nullable=False)

    def __repr__(self):
        return '
' % self.username


Trong ví dụ trên, chúng ta định nghĩa một mô hình User với bốn trường: id, username, email và password. Trường id là khóa chính của bảng, trong khi các trường username và email là duy nhất và không thể là null.
 

 

4.4 Di cư cơ sở dữ liệu là gì? Tại sao chúng ta cần điều đó?

 


Di cư cơ sở dữ liệu là quá trình cập nhật cấu trúc của lược đồ cơ sở dữ liệu mà không làm mất bất kỳ dữ liệu hiện có nào. Di cư cơ sở dữ liệu rất quan trọng vì:
 

  • Khi ứng dụng phát triển, lược đồ cơ sở dữ liệu có thể cần phải thay đổi để phù hợp với các tính năng mới hoặc thay đổi trong các yêu cầu kinh doanh.
     
  • Di cư giúp theo dõi các thay đổi đối với lược đồ cơ sở dữ liệu theo thời gian và giúp dễ dàng hoàn tác các thay đổi nếu cần.
     
  • Di cư cho phép một nhóm các nhà phát triển cộng tác trên lược đồ cơ sở dữ liệu và đảm bảo tính nhất quán trên các môi trường khác nhau (phát triển, kiểm thử, sản xuất).
     

 

4.5 Gói được đề xuất cho di cư cơ sở dữ liệu Flask: Flask-migrate (ưu điểm và nhược điểm)

 


Flask-Migrate là một tiện ích mở rộng của Flask cung cấp một cách đơn giản để xử lý di cư cơ sở dữ liệu bằng SQLAlchemy. Nó cung cấp một cách đơn giản để nâng cấp và hạ cấp lược đồ cơ sở dữ liệu của bạn. 


Để cài đặt Flask-Migrate, hãy sử dụng lệnh sau

pip install Flask-Migrate


Để sử dụng Flask-Migrate trong ứng dụng Flask của bạn, bạn cần khởi tạo nó bằng lệnh sau

flask db init


Sau đó, bạn có thể tạo các tập lệnh di cư bằng cách chạy lệnh sau

flask db migrate -m "migration message"


Để áp dụng di cư vào cơ sở dữ liệu, hãy sử dụng lệnh sau

flask db upgrade


Dưới đây là một số dòng lệnh hữu ích để làm việc với Flask-Migrate
 

  • flask db init: Khởi tạo môi trường di cư.
     
  • flask db migrate: Tạo một tập lệnh di cư mới dựa trên các thay đổi đối với mô hình cơ sở dữ liệu.
     
  • flask db upgrade: Áp dụng di cư vào cơ sở dữ liệu.
     
  • flask db downgrade: Hoàn tác di cư cuối cùng.
     
  • flask db history [--rev-range REV_RANGE] [--verbose]: Hiển thị danh sách các di cư. Nếu không có phạm vi nào được đưa ra thì toàn bộ lịch sử sẽ được hiển thị.
     
  • flask db stamp [--sql] [--tag TAG] : Đặt phiên bản trong cơ sở dữ liệu thành phiên bản được đưa ra làm đối số, mà không thực hiện bất kỳ di cư nào. Điều này CỰC KỲ HỮU ÍCH khi bạn gặp sự cố với trạng thái di cư cơ sở dữ liệu không nhất quán.
     

Một số vấn đề phổ biến mà các nhà phát triển có thể gặp phải khi sử dụng Flask-Migrate bao gồm
 

  • Xung đột giữa các tập lệnh di cư: Khi hai nhà phát triển làm việc trên các tính năng khác nhau, cả hai đều có thể tạo ra một tập lệnh di cư xung đột với tập lệnh kia. Để giải quyết vấn đề này, các nhà phát triển nên thường xuyên giao tiếp và hợp nhất các tập lệnh di cư của họ trước khi áp dụng chúng vào cơ sở dữ liệu.
     
  • Mất dữ liệu: Nếu tập lệnh di cư không được viết đúng cách, nó có thể gây mất dữ liệu trong quá trình nâng cấp. Điều quan trọng là phải kiểm thử kỹ lưỡng các tập lệnh di cư trước khi áp dụng chúng vào cơ sở dữ liệu sản xuất.


5. Thiết lập và kiểm thử bộ nhớ đệm

 

5.1 Giải thích về bộ nhớ đệm Flask và khi nào nên sử dụng bộ nhớ đệm

 


Flask-Cache là một thư viện bộ nhớ đệm đơn giản và nhẹ giúp bạn lưu trữ kết quả của các thao tác tốn kém trong bộ nhớ hoặc trên đĩa. Bằng cách lưu trữ dữ liệu, bạn có thể cải thiện hiệu suất của ứng dụng Flask và giảm thời gian phản hồi cho người dùng của mình. 

Bộ nhớ đệm đặc biệt hữu ích đối với dữ liệu được truy cập thường xuyên mà không thường xuyên thay đổi. Điều này bao gồm dữ liệu đến từ các truy vấn tốn kém, dữ liệu tốn nhiều tài nguyên máy tính để tạo và dữ liệu tĩnh và không thường xuyên thay đổi.
 

 

5.2 Ưu điểm và nhược điểm của bộ nhớ đệm

 


Ưu điểm
 

  • Hiệu suất được cải thiện và thời gian phản hồi giảm cho người dùng
     
  • Lưu trữ dữ liệu được truy cập thường xuyên có thể giúp giảm tải trên cơ sở dữ liệu
     
  • Lưu trữ bộ nhớ đệm có thể giúp tăng tốc các thao tác tốn nhiều tài nguyên máy tính
     

Nhược điểm
 

  • Dữ liệu được lưu trữ bộ nhớ đệm có thể trở nên lỗi thời nếu nó không được cập nhật thường xuyên
     
  • Lưu trữ bộ nhớ đệm có thể chiếm dung lượng bộ nhớ hoặc đĩa, tùy thuộc vào cấu hình bộ nhớ đệm
     
  • Lưu trữ bộ nhớ đệm có thể thêm độ phức tạp vào mã của bạn và làm cho việc lập luận trở nên khó hơn
     

 

5.3 Ví dụ về việc sử dụng bộ nhớ đệm

 


Dưới đây là một vài ví dụ về cách bạn có thể sử dụng Flask Cache


- Lưu trữ kết quả hàm
 

from flask import Flask
from flask_caching import Cache

app = Flask(__name__)
cache = Cache(app, config={'CACHE_TYPE': 'simple'})

@app.route('/hello')
@cache.cached(timeout=60)
def hello():
    return 'Hello, World!'


Trong ví dụ này, trình trang trí @cache.cached được sử dụng để lưu trữ kết quả của hàm hello trong 60 giây.

- Lưu trữ các truy vấn cơ sở dữ liệu tốn kém
 

from flask import Flask, request
from flask_caching import Cache
from sqlalchemy import create_engine

app = Flask(__name__)
cache = Cache(app, config={'CACHE_TYPE': 'simple'})
db = create_engine('postgresql://user:password@localhost/mydatabase')

@app.route('/users')
def get_users():
    user_id = request.args.get('id')
    cache_key = f'user_{user_id}'
    cached_data = cache.get(cache_key)
    if cached_data:
        return cached_data
    else:
        result = db.execute(f"SELECT * FROM users WHERE id = {user_id}").fetchall()
        cache.set(cache_key, result, timeout=60)
        return result


Trong ví dụ này, phương thức cache.get được sử dụng để kiểm tra xem kết quả của truy vấn đã được lưu trữ bộ nhớ đệm chưa. Nếu có, dữ liệu được lưu trữ bộ nhớ đệm sẽ được trả về ngay lập tức. Nếu không, truy vấn sẽ được thực thi và kết quả sẽ được lưu trữ bộ nhớ đệm trong 60 giây bằng phương thức cache.set.
 

 

5.4 Những sai lầm phổ biến với Flask cache

 


Khi làm việc với Flask cache, có một số lỗi phổ biến mà các nhà phát triển nên tránh. 

Dưới đây là một vài ví dụ
 

  • Lưu trữ quá nhiều dữ liệu: Việc lưu trữ tất cả dữ liệu có thể rất hấp dẫn, nhưng điều này có thể dẫn đến các vấn đề về hiệu suất và thậm chí có thể gây ra sự cố. Điều quan trọng là phải chọn lọc dữ liệu được lưu trữ và thời gian lưu trữ dữ liệu đó.
     
  • Không đặt thời gian chờ: Nếu không có thời gian chờ, bộ nhớ đệm sẽ giữ dữ liệu vô thời hạn, điều này có thể dẫn đến việc trả về dữ liệu lỗi thời. Điều quan trọng là phải đặt thời gian chờ phù hợp để đảm bảo bộ nhớ đệm được làm mới thường xuyên.
     
  • Không xử lý sự cố bộ nhớ đệm: Lưu trữ bộ nhớ đệm có thể bị lỗi vì nhiều lý do, chẳng hạn như khi máy chủ bộ nhớ đệm ngừng hoạt động hoặc hết bộ nhớ. Điều quan trọng là phải xử lý các lỗi này một cách duyên dáng, chẳng hạn như bằng cách quay lại bộ nhớ đệm khác hoặc bằng cách tính toán lại dữ liệu nếu cần.
     
  • Không xem xét việc vô hiệu hóa bộ nhớ đệm: Khi dữ liệu được cập nhật, bộ nhớ đệm cần được vô hiệu hóa để đảm bảo rằng dữ liệu mới nhất được trả về. Điều quan trọng là phải có một cơ chế để vô hiệu hóa bộ nhớ đệm khi dữ liệu thay đổi.
     

Bằng cách tránh những sai lầm phổ biến này, các nhà phát triển có thể tận dụng tối đa Flask cache và cải thiện hiệu suất của các ứng dụng của họ.


6. Thiết lập ghi nhật ký

 

6.1 Giải thích về Flask Logging

 


Flask logging được sử dụng để ghi lại các sự kiện xảy ra trong quá trình thực thi một ứng dụng Flask. Đây là một phần thiết yếu của việc phát triển ứng dụng và giúp gỡ lỗi, theo dõi lỗi và giám sát hiệu suất. Flask logging có thể được cấu hình để ghi nhật ký vào tệp, nhật ký hệ thống hoặc dịch vụ của bên thứ ba.
 

 

6.2 Thiết lập Flask Logging

 


Để thiết lập Flask logging, bạn cần nhập mô-đun logging của Python và khởi tạo một phiên bản trình ghi nhật ký trong ứng dụng Flask của mình. Sau đó, bạn có thể cấu hình trình ghi nhật ký để ghi nhật ký vào các mục tiêu khác nhau như bảng điều khiển, tệp hoặc dịch vụ của bên thứ ba như Elasticsearch hoặc Loggly.

Đây là một ví dụ về cách thiết lập Flask logging
 

import logging
from flask import Flask

app = Flask(__name__)

# Set up logger
app.logger.setLevel(logging.INFO)
Tag list:
- Python
- Best Practices
- Learn Python
- Flask
- Flask-MarshMallow
- Flask-Restful
- Flask-Migrate
- Flask-WTF

Liên quan

Python

Đọc thêm
Python

Đọc thêm

Theo dõi

Theo dõi bản tin của chúng tôi và không bao giờ bỏ lỡ những tin tức mới nhất.