0
0
Lập trình
TT

Phục vụ Tệp Riêng từ Backblaze B2 trong FastAPI

Đăng vào 8 tháng trước

• 4 phút đọc

Phục vụ Tệp Riêng từ Backblaze B2 trong FastAPI

Gần đây, tôi đã cần phục vụ các tệp riêng (như PDF và hình ảnh) từ backend FastAPI của mình, nhưng tôi không muốn sử dụng AWS S3. Thay vào đó, tôi đã chọn Backblaze B2 — dịch vụ lưu trữ đối tượng chi phí hiệu quả và tương thích với S3.

Trong bài viết này, tôi sẽ hướng dẫn bạn cách tôi đã sử dụng các bucket riêng của B2 và tạo ra các liên kết tải xuống an toàn mà FastAPI có thể phục vụ một cách động.

🎯 Mục Tiêu

  • Lưu trữ tệp trong một bucket B2 riêng
  • Sử dụng FastAPI để phục vụ/tải xuống các tệp đó một cách an toàn
  • Ngăn chặn truy cập trực tiếp vào bucket (không có URL công khai)
  • Tránh lưu trữ tạm thời hoặc lưu trữ cục bộ

Cài Đặt B2

Để bắt đầu, bạn cần thực hiện một số bước sau:

  1. Tạo một bucket B2.
  2. Thiết lập bucket ở chế độ riêng tư.
  3. Tạo một Application Key với các quyền phù hợp.

Kết Nối với B2 từ Python

Tôi đã sử dụng thư viện chính thức b2sdk để xác thực và lấy tệp:

python Copy
from b2sdk.v1 import *

# Thiết lập thông tin xác thực
application_key_id = 'YOUR_APPLICATION_KEY_ID'
application_key = 'YOUR_APPLICATION_KEY'

# Kết nối với Backblaze B2
b2_api = B2Api(Session(B2AccountInfo()))
b2_api.authorize_account(application_key_id, application_key)

Ví dụ về Lấy Tệp

Sau khi kết nối, bạn có thể lấy tệp từ bucket:

python Copy
bucket = b2_api.get_bucket_by_name('YOUR_BUCKET_NAME')
file_info = bucket.get_file_info('path/to/your/file.pdf')

Tạo Liên Kết Tải Xuống An Toàn

Để tạo liên kết tải xuống an toàn, bạn có thể sử dụng phương thức get_download_url:

python Copy
download_url = bucket.get_download_url(file_info.id)

Cấu Hình FastAPI

Bây giờ, hãy tích hợp nó vào FastAPI. Đầu tiên, cài đặt FastAPI và uvicorn:

bash Copy
pip install fastapi uvicorn

Tạo Endpoint để Tải Xuống Tệp

Dưới đây là cách tạo một endpoint trong FastAPI để phục vụ tệp:

python Copy
from fastapi import FastAPI, HTTPException
from fastapi.responses import RedirectResponse

app = FastAPI()

@app.get('/download/{file_name}')
async def download_file(file_name: str):
    try:
        # Lấy thông tin tệp và tạo URL tải xuống
        file_info = bucket.get_file_info(file_name)
        download_url = bucket.get_download_url(file_info.id)
        return RedirectResponse(url=download_url)
    except Exception as e:
        raise HTTPException(status_code=404, detail=str(e))

Bảo Mật và Quản Lý Quyền Truy Cập

Để bảo mật, bạn nên đảm bảo rằng chỉ những người dùng có quyền truy cập mới có thể gọi endpoint này. Bạn có thể thêm xác thực token hoặc sử dụng các phương thức xác thực khác.

Các Thực Hành Tốt Nhất

  • Luôn luôn sử dụng HTTPS để bảo mật dữ liệu khi truyền tải.
  • Giới hạn quyền truy cập cho Application Key để chỉ có những quyền cần thiết.
  • Theo dõi và ghi lại mọi hoạt động truy cập để phát hiện các hành vi bất thường.

Cách Khắc Phục sự cố Thường Gặp

  • Lỗi không thể tải tệp: Kiểm tra xem tệp có tồn tại trong bucket hay không và bạn có quyền truy cập đúng hay không.
  • Lỗi xác thực: Đảm bảo rằng Application Key và ID của bạn là chính xác và có quyền truy cập vào bucket.

Mẹo Tối Ưu Hiệu Suất

  • Sử dụng các kỹ thuật nén tệp để giảm thời gian tải xuống.
  • Tối ưu hóa hình ảnh và tài liệu trước khi tải lên B2 để tiết kiệm băng thông.

Kết Luận

Sử dụng Backblaze B2 với FastAPI là một cách hiệu quả để phục vụ các tệp riêng tư mà không cần phụ thuộc vào AWS S3. Bằng cách thực hiện các bước được mô tả ở trên, bạn có thể dễ dàng thiết lập một hệ thống lưu trữ tệp an toàn và hiệu quả.

Hãy thử áp dụng và tối ưu hóa giải pháp của bạn ngay hôm nay! Nếu bạn có bất kỳ câu hỏi nào, đừng ngần ngại để lại câu hỏi bên dưới!

Câu Hỏi Thường Gặp (FAQ)

1. Backblaze B2 có miễn phí không?
Backblaze B2 cung cấp mức miễn phí giới hạn, nhưng bạn sẽ phải trả phí cho lưu trữ và băng thông vượt quá mức miễn phí.

2. FastAPI có dễ sử dụng không?
Có, FastAPI rất dễ sử dụng và cung cấp nhiều tính năng mạnh mẽ cho việc phát triển API.

3. Tôi có thể sử dụng B2 với các ngôn ngữ lập trình khác không?
Có, Backblaze B2 cung cấp SDK cho nhiều ngôn ngữ lập trình khác nhau.

Tài Nguyên Tham Khảo

Hãy bắt đầu với việc phục vụ các tệp riêng tư của bạn từ Backblaze B2 ngay hôm nay!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào