0
0
Lập trình
Admin Team
Admin Teamtechmely

Từ Ý Tưởng Đến Triển Khai với FastAPI và PostgreSQL

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

• 5 phút đọc

Giới thiệu

Chào mừng bạn đến với bài viết này! Tôi là Pedro Kauati👋. Trong bài viết này, tôi sẽ chia sẻ về trải nghiệm của mình trong việc xây dựng một ứng dụng web sử dụng FastAPI⚡ và PostgreSQL🐘.

Tóm tắt: Tôi đã tạo ra một API backend mà bạn có thể xem hoạt động tại đây và tham khảo mã nguồn tại đây.

Động lực💭

Tôi có nền tảng phát triển game và đã làm việc tại nhiều công ty ở Vancouver, chủ yếu sử dụng C# và C++. Mặc dù tôi đã có một chút kinh nghiệm trong phát triển web, nhưng tôi chưa bao giờ đảm nhận vai trò từ đầu đến cuối trong một dự án. Vì vậy, tôi quyết định tự xây dựng ứng dụng web của mình (ít nhất là phần backend). Với kinh nghiệm Python từ các dự án khác, tôi đã chọn sử dụng framework FastAPI.

Ý tưởng💡

Tôi muốn thực hiện một điều gì đó khả thi nhưng vẫn hữu ích. Một cái gì đó có thể có ứng dụng thực tế, ngay cả khi nó chỉ tồn tại như một dự án sở thích.

Một công cụ theo dõi lỗi (Issue Tracker) dường như là một lựa chọn hợp lý. Từ đó, Flyswatter ra đời (tất nhiên, chưa phải bây giờ)! Đây là một công cụ theo dõi lỗi nơi người dùng có thể báo cáo sự cố từ các dự án khác nhau, bình luận về chúng và phân công nhiệm vụ cho bản thân hoặc cho người khác.

Phát triển🛠️

Công nghệ sử dụng

  • FastAPI⚡
  • PostgreSQL🐘
  • SQLAlchemy✨
  • Alembic🧪
  • Docker và docker-compose🐋
  • OAuth2 và JWT tokens cho xác thực🔐
  • pytest chạy trên Github Actions🤖
  • Sentry để giám sát lỗi📊

Những điều cần chú ý🔍

Trong quá trình phát triển, tôi đã gặp một số điểm gây nhầm lẫn cho những ai mới tiếp cận môi trường phát triển mới:

  • Sự khác biệt giữa việc chạy script từ container Docker và host Docker. Đôi khi không có sự khác biệt, nhưng có những lúc có.
  • Cách quản lý cơ sở dữ liệu khi sử dụng Alembic. Bạn nên để Alembic tự động sinh ra bảng thay vì tạo chúng bằng mã. Nó cũng tạo ra một bảng lưu giữ phiên bản hiện tại của cơ sở dữ liệu, mà bạn không nên can thiệp trừ khi bạn biết mình đang làm gì. Những điều như vậy có thể tạo ra sự khác biệt giữa cơ sở dữ liệu và những gì Alembic cố gắng làm, gây rủi ro cho việc di chuyển không hoạt động.
  • Một số tính năng phổ biến của Python mà tôi vẫn chưa nắm rõ, như các cách khác nhau để tải biến môi trường và thời gian tồn tại của chúng trong bộ nhớ; giải nén từ điển thành một tập hợp kwargs và hệ thống nhập khẩu của Python.
  • Theo dõi các phần của cơ sở dữ liệu không được Alembic tự động sinh ra. Một điều tôi đã nhận thấy là nó có thể thêm các kiểu enum khi nâng cấp nhưng không xóa chúng khi hạ cấp.
  • Base.metadata.drop_all() xóa tất cả các bảng ngoại trừ alembic_versions và các dữ liệu còn lại. Điều này không tương thích với cách hoạt động nội bộ của Alembic, có thể gây ra các kết quả sai cho các di chuyển hoặc hoàn toàn thất bại. Tôi đã mất vài giờ để tìm ra vấn đề ở đó.
  • Để hoàn tác các thay đổi trong cơ sở dữ liệu (hữu ích cho việc kiểm thử), bạn cần:
    1. Khởi động một kết nối cơ sở dữ liệu kéo dài qua tất cả các thay đổi bạn muốn hoàn tác
    2. Bắt đầu một giao dịch con lồng nhau
    3. Lắng nghe after_transaction_end, được kích hoạt sau session.commit()
    4. Khi một giao dịch kết thúc, bắt đầu một giao dịch con mới
    5. Để hoàn tác, gọi phương thức rollback trên kết nối gốc. Điều này sẽ hoàn tác tất cả các giao dịch lồng nhau trước đó.

🐜 Flyswatter🐜

Sau khoảng 3 tuần làm việc, các tính năng chính của Flyswatter đã hoàn tất!

Bạn có thể kiểm tra kho Github và triển khai trên Render. Tôi chưa thực hiện bất kỳ công việc nào cho phần front-end, nhưng may mắn thay, FastAPI cũng sử dụng Swagger UI, tạo ra một trang tài liệu có thể truy cập tất cả các endpoint.

Kết luận📖

Đây là một dự án rất thú vị mà đã dạy tôi rất nhiều về các framework web và Python nói chung. Và tôi vẫn chưa hoàn tất với nó, bước tiếp theo bây giờ là thêm xử lý nền với Redis. Tôi hiện đang lên kế hoạch tạo báo cáo lỗi PDF, nhưng có thể tôi sẽ chọn một điều gì đó khác vào cuối cùng.

Cảm ơn bạn đã đọc đến đây và hãy thoải mái chia sẻ ý kiến của bạn về dự án này!✌️

Thực hành tốt nhất

  • Luôn sử dụng Alembic để quản lý các di chuyển cơ sở dữ liệu để tránh xung đột.
  • Kiểm tra thường xuyên các bản ghi và bảng để đảm bảo tính toàn vẹn của dữ liệu.

Những cạm bẫy thường gặp

  • Không hiểu rõ cách làm việc của Alembic có thể dẫn đến xung đột trong cơ sở dữ liệu.
  • Quá trình xác thực không được cấu hình đúng có thể dẫn đến lỗ hổng bảo mật.

Mẹo hiệu suất

  • Sử dụng Docker để môi trường phát triển đồng nhất và dễ dàng triển khai.
  • Tối ưu hóa truy vấn đến cơ sở dữ liệu để cải thiện hiệu suất.

Giải quyết vấn đề

  • Nếu gặp lỗi trong Alembic, hãy kiểm tra kỹ log để xác định nguyên nhân.
  • Đối với các vấn đề với Docker, đảm bảo rằng bạn đã cấu hình đúng các tệp docker-compose.yml.

Câu hỏi thường gặp

1. FastAPI là gì?
FastAPI là một framework cho Python giúp xây dựng API nhanh chóng và dễ dàng.

2. PostgreSQL có gì khác biệt so với các cơ sở dữ liệu khác?
PostgreSQL nổi bật với tính năng hỗ trợ các kiểu dữ liệu phức tạp và khả năng mở rộng cao.

3. Có cần thiết phải sử dụng Docker cho dự án này không?
Docker giúp tạo môi trường phát triển đồng nhất và đơn giản hóa việc triển khai.

Tài nguyên tham khảo

Hãy cùng tạo ra những ứng dụng web tuyệt vời với FastAPI và PostgreSQL!

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