Hướng Dẫn Sử Dụng Thư Viện Requests của Python – Phần 4: SSL, Hiệu Suất và Cải Tiến

Hướng Dẫn Sử Dụng Thư Viện Requests của Python - Phần 4: SSL, Hiệu Suất và Cải Tiến

Hướng Dẫn Sử Dụng Thư Viện Requests của Python – Phần 4: SSL, Hiệu Suất và Cải Tiến

Khi làm việc với các dịch vụ web, việc gửi và nhận dữ liệu bảo mật là rất quan trọng. Thông qua HTTPS (Hypertext Transfer Protocol Secure), giao thức này giúp mã hóa kết nối của bạn với máy chủ để bảo vệ dữ liệu. Một phần quan trọng trong quá trình này là xác minh chứng chỉ SSL của máy chủ đích.

Xác Minh Chứng Chỉ SSL

Thư viện Requests trong Python thực hiện việc xác minh chứng chỉ SSL mặc định. Điều này đảm bảo kết nối của bạn với các dịch vụ web an toàn hơn. Tuy nhiên, trong một số trường hợp bạn có thể muốn thay đổi hành vi này.

Nếu bạn muốn tắt tính năng xác minh SSL, bạn có thể truyền tham số False vào tham số verify trong hàm yêu cầu:

Python
import requests

requests.get("https://api.github.com", verify=False)

Khi thực hiện yêu cầu như vậy, bạn sẽ nhận được cảnh báo về yêu cầu không xác minh SSL:

PowerShell
InsecureRequestWarning: Unverified HTTPS request is being made to host 'api.github.com'. Adding certificate verification is strongly advised.

Lưu ý rằng thư viện Requests sử dụng gói certifi để cung cấp các cơ quan chứng nhận (CAs) mà Requests có thể tin cậy. Vì vậy, bạn nên cập nhật certifi thường xuyên để đảm bảo kết nối của mình luôn an toàn.

Tăng Cường Hiệu Suất với Requests

Khi sử dụng Requests, đặc biệt là trong môi trường ứng dụng sản xuất, hiệu suất là một yếu tố cần được xem xét. Các tính năng như điều khiển thời gian chờ, session và giới hạn thử lại có thể giúp bạn tối ưu hóa ứng dụng của mình.

Thời Gian Chờ (Timeout)

Khi bạn gửi yêu cầu đến một dịch vụ ngoài, hệ thống của bạn sẽ phải đợi phản hồi từ dịch vụ đó. Nếu ứng dụng của bạn đợi quá lâu, các yêu cầu có thể bị tắc nghẽn, trải nghiệm người dùng có thể bị ảnh hưởng hoặc các công việc nền có thể bị treo.

Theo mặc định, Requests sẽ đợi phản hồi vô thời hạn. Vì vậy, bạn nên luôn chỉ định thời gian chờ để tránh những vấn đề này. Để cài đặt thời gian chờ, bạn sử dụng tham số timeout. timeout có thể là một số nguyên hoặc số thực, thể hiện số giây để đợi phản hồi trước khi hết thời gian:

Python
requests.get("https://api.github.com", timeout=1)
requests.get("https://api.github.com", timeout=3.05)

Trong yêu cầu đầu tiên, yêu cầu sẽ hết thời gian sau 1 giây. Trong yêu cầu thứ hai, yêu cầu sẽ hết thời gian sau 3.05 giây.

Ngoài ra, bạn cũng có thể truyền một bộ giá trị timeout với hai phần tử:

  • Thời gian kết nối: Thời gian cho phép để client kết nối với server.
  • Thời gian đọc: Thời gian mà client sẽ đợi phản hồi sau khi kết nối đã được thiết lập.

Ví dụ:

Python
requests.get("https://api.github.com", timeout=(3.05, 5))

Trong ví dụ trên, nếu kết nối được thiết lập trong 3.05 giây và nhận được dữ liệu trong vòng 5 giây từ khi kết nối, phản hồi sẽ được trả về. Nếu không, sẽ có ngoại lệ Timeout:

Python
import requests
from requests.exceptions import Timeout

try:
    response = requests.get("https://api.github.com", timeout=(3.05, 5))
except Timeout:
    print("Yêu cầu đã hết thời gian chờ")
else:
    print("Yêu cầu không bị hết thời gian chờ")

Sử Dụng Session để Quản Lý Kết Nối

Cho đến nay, bạn đã làm việc với các hàm yêu cầu cao cấp như get()post(). Tuy nhiên, Requests còn cung cấp một lớp gọi là Session giúp bạn tùy chỉnh và cải thiện hiệu suất của các yêu cầu HTTP.

Sessions cho phép bạn duy trì các thông số (như thông tin xác thực) qua các yêu cầu khác nhau. Ví dụ, nếu bạn muốn sử dụng cùng một thông tin xác thực cho nhiều yêu cầu, bạn có thể sử dụng session:

Python
import requests
from custom_token_auth import TokenAuth

TOKEN = "<YOUR_GITHUB_PA_TOKEN>"

with requests.Session() as session:
    session.auth = TokenAuth(TOKEN)

    first_response = session.get("https://api.github.com/user")
    second_response = session.get("https://api.github.com/user")

print(first_response.headers)
print(second_response.json())

Trong đoạn mã trên, bạn đăng nhập một lần và thực hiện nhiều yêu cầu đã xác thực mà không cần phải nhập lại thông tin xác thực.

Lợi ích lớn nhất của Session là khả năng duy trì kết nối. Khi ứng dụng của bạn kết nối đến một server qua Session, kết nối đó sẽ được giữ lại trong một connection pool. Khi bạn kết nối lại với cùng một server, nó sẽ tái sử dụng kết nối này thay vì thiết lập một kết nối mới.

Retry (Thử Lại) Các Yêu Cầu

Khi một yêu cầu thất bại, có thể bạn muốn ứng dụng của mình tự động thử lại yêu cầu đó. Tuy nhiên, mặc định Requests không thực hiện điều này. Để làm điều này, bạn cần sử dụng Transport Adapter tùy chỉnh.

Transport Adapter cho phép bạn cấu hình các tham số retry cho mỗi dịch vụ bạn tương tác. Ví dụ, nếu bạn muốn tất cả các yêu cầu đến https://api.github.com thử lại hai lần trước khi báo lỗi, bạn có thể tạo một adapter, thiết lập tham số max_retries và gắn nó vào Session:

Python
import requests
from requests.adapters import HTTPAdapter
from requests.exceptions import RetryError

github_adapter = HTTPAdapter(max_retries=2)

session = requests.Session()
session.mount("https://api.github.com", github_adapter)

try:
    response = session.get("https://api.github.com/")
except RetryError as err:
    print(f"Lỗi: {err}")
finally:
    session.close()

Trong ví dụ trên, bạn đã cấu hình Session sao cho nó sẽ thử lại tối đa hai lần khi yêu cầu đến API của GitHub không thành công.

Kết Luận

Thư viện Requests trong Python cung cấp những công cụ mạnh mẽ để làm việc với các yêu cầu HTTP và giúp bạn dễ dàng xử lý các tình huống như xác minh SSL, tối ưu hiệu suất, quản lý session và retry yêu cầu. Bằng cách áp dụng các kỹ thuật này, bạn có thể xây dựng các ứng dụng hiệu quả và đáng tin cậy hơn.

Leave a Reply