FastAPI: Giới thiệu và setup môi trường

Tram Ho

80
Chào mọi người, mình vừa mới được làm việc lại với ngôn ngữ Python gần đây và được tiếp xúc với framework mới vô cùng mạnh mẽ, mình đã sử dụng trong dự án và hưởng lợi rất nhiều từ framework, nên mình viết bài viết để chia sẻ lại cho mọi người về tất cả những gì mình học được mong sẽ giúp ích cho mọi người trong quá trình làm việc

1. Giới thiệu về FastAPI

FastAPI là framework hiện đại, hiệu suất cao để xây dựng web API với Python 3.7+ dựa trên các tiêu chuẩn của Python. Nó giúp các nhà phát triển code ít hơn, triển khai nhanh hơn và hỗ trợ docs API đầy đủ, cũng cải thiện tốc độ khi tích hợp API vì đã support docs API đầy đủ. Sẽ là một sự lựa chọn hoàn hảo cho một dự án cần triển khai trong thời gian ngắn nhưng vẫn đảm bảo đầy đủ các yếu tố đi kèm (người ta hay nói nhỏ nhưng có võ).

Các tính năng chính

  • Nhanh (Fast): Từ chính document của framework có thể tự tin so sánh tốc độ ngang bằng với NodeJs và Go (mình sẽ làm benchmark để kiểm chứng điều này trong những phần sau – phải thấy mới tin được).
  • Triển khai nhanh (Fast to code): Tăng tốc độ triển khai các tính năng từ 200% đến 300% (cá nhân mình cũng cảm thấy điều đó, các bạn có thể trải nghiệm để cảm nhận).
  • Ít lỗi hơn (Fewer bugs): Giảm khoảng 40% lỗi do lập trình viên gây ra (mình đoán có thể do một số tính đã được bao đóng và triển khai sẵn nên làm giảm lỗi phát sinh trong quá trình lập trình, và có thể có thêm một số nguyên nhân khác, bla bla…).
  • Trực quan và tiện dụng (Intuitive): Được nhiều trình chỉnh sửa hỗ trợ, có thể chạy trên nhiều nền tảng khác nhau. Tốn ít thời gian gỡ lỗi hơn (hưởng lợi từ Python là một ngôn ngữ thông dịch)
  • Dễ dàng tiếp cận (Easy): Thiết kế dễ sử dụng và hỏi tập nhanh thông qua docs.
  • Code ngắn gọn (Short): Code ngắn gọn, bao gồm nhiều tính năng đã được triển khai sẵn và giúp giảm thiểu bugs.
  • Mạnh mẽ (Robust): Code sẵn sàng cho môi trường production và API docs được sinh tự động.

So sánh với Django và Flask

Django và Flask là framework khá nổi tiếng khi triển khai web API phía máy chủ với Python, để có cái nhìn tổng quan về ưu/nhược điểm của 2 framework so với FastAPI mình làm một bảng so sánh nhỏ để điểm qua một số tính năng chính

DjangoFlaskFastAPI
Cộng đồngCộng đồng của Django hiện tại khá lớn và lâu đời với > 70k sao trên GithubCộng đồng của Flask hiện tại cũng lớn nhưng không bằng Django với > 63k sao trên GithubCộng đồng của FastAPI là khá mới với > 57k sao trên Github
Hiệu suấtNó không phải tốt nhất về mặt hiệu suấtFlask là một khung web vi mô. Nó hoạt động tốt hơn DjangoFastAPI là một trong những framework web nhanh có hỗ trợ bất đồng bộ gốc giúp tăng thêm, có hiệu năng cao nhất trong các framework python hiện tại
ORMDjango ORMFlask-sqlachemySqlachemy
AsyncHỗ trợ từ Django 3.xKhông, cần AsyncioFastAPI cung cấp hỗ trợ bất đồng bộ gốc
Builtin Admin UIKhôngKhông
Python versionAll version: 2x, 3xAll version: 2x, 3xOnly python3.x
Python shellKhông – đây là hạn chế của một microframework so với các framework thực thụ
Dễ dàng sử dụngDjango rất lớn và do đó hơi phức tạp để họcFlask rất dễ học và sử dụng khá đơn giảnFastAPI là đơn giản nhất trong cả ba
API docsPhổ biến nhất là sử dụng Django-rest-framework, với Swagger thì dùng django-rest-swagger với python2.x, dùng drf-yasg với python3.xSử dụng Flask-restplusCó sẵn Swagger và Redoc
Xác minh dữ liệuKhôngKhông

Trước khi đến với triển khai FastAPI đơn giản thì chúng ta đi qua phần setup môi trường giúp cho việc triển khai và thử nghiệm với FastAPI dễ dàng hơn về sau này. Bạn có thể bỏ qua nếu muốn viết ngay API với FastAPI, nhưng theo kinh nghiệm bản thân đây cũng là một điều khá quan trọng, nếu bạn môi trường sạch, dễ dàng chuyển đổi version sẽ giúp bạn dễ thở và tự tin hơn nếu tiếp cận nhiều framework khác trong hệ sinh thái (kinh nghiệm cá nhân thôi hehe, mọi người có thể sử dụng cách khác)

2. Setup môi trường

Python có rất nhiều version và mỗi version đều có nhưng tính năng và đặc điểm riêng, kèm với các thư viện đi kèm và hỗ trợ trong version đó. Với kinh nghiệm làm việc và fix bug trên python do các lỗi version gây ra, đôi khi chỉ cần đổi version ( từ 3.6 lên 3.8) là có thể fix được lỗi và đi kèm với đó là việc chúng ta có nhiều version trên máy local gây nặng ổ đĩa và khó kiểm soát khi làm việc trên các dự án có các version Python khác nhau, sự chồng chéo version cũng có thể dẫn đến lỗi không mong muốn. Sau nhiều lần tìm kiếm thì mình tìm được tool/thư viện giúp quản lý multi version Python trên máy local khá hiệu quả và clean – tên là Pyenv (nó khá giống với nvm bên Nodejs nếu bạn nào đã từng sử dụng)

Pyenv

Pyenv là công cụ đơn giản để quản lý nhiều version của python trên máy local của bạn. Nó cho phép cài đặt và chuyển đổi giữa các Python version khác nhau, cũng như tạo và quản lý môi trường ảo cho từng version.
Ví dụ: Một trong những dự án của bạn yêu cầu Python 2.7 trong khi một dự án khác yêu cầu Python 3.8, bạn có thể sử dụng Pyenv để chuyển đổi giữa các version mà không lo lắng về các vấn đề xung đột hoặc tương thích.

Một ưu điểm khác của Pyenv là nó cho phép bạn tạo và quản lý môi trường ảo cho từng version Python. Môi trường ảo là môi trường Python bị cô lập có thể có các gói và phần phụ thuộc riêng. Điều này cho phép bạn tách biệt các dự án Python và các phần phụ thuộc của mình, điều này có thể giúp tránh xung đột và đơn giản hóa quy trình phát triển của bạn.

Pyenv cũng hỗ trợ nhiều plugin và tiện ích mở rộng, chẳng hạn như pyenv-virtualenv (cung cấp khả năng quản lý môi trường ảo nâng cao) và pyenv-what-ext (thêm lệnh which vào pyenv để tích hợp shell dễ dàng hơn).

Cài đặt Pyenv

Đầu tiên, chúng ta cần cài đặt Pyenv, để cài đặt dễ dàng nên sử dụng trình package manager trên mỗi hệ điều hành.
Nếu bạn dùng sử dụng Mac bạn có thể sử dụng Homebrew:

Nếu không muốn Homebrew tự động update các thư viện khác thì có thể thêm option như bên dưới (sẽ tiết kiệm rất nhiều thời gian)


Nếu bạn đang dùng Linux, ví dụ Unbuntu có thể sử dụng lệnh (các distro khác có thể tìm kiếm package manager và cài đặt tương tự):


Pyenv không chính thức hỗ trợ Windows, có thể cài thông qua linux được tích hợp trong Windows, bạn có thể tham khảo một số cách cài trên Windows từ docs của Pyenv
Cá nhân mình thấy hệ điều hành Windows có một số bất lợi trong việc cài đặt và triển khai các tool hỗ trợ quá trình lập trình, phải mất thời gian để có thể cấu hình ngon lành trước khi sử dụng, tất nhiên là Windows cũng đang cải thiện điều này theo từng năm. Chúc bạn gặp man mắn với Windows 

Sau khi đã cài đặt Pyenv, cần thêm những dòng sau vào trình shell đang dùng hiện tại (~/.bashrc, ~/.bashprofile, or ~/.zshrc, tuỳ thuộc vào shell của bạn):

Khởi động lại shell với:

Cài đặt một version Python mới (mặc định sẽ lấy Python của hệ thống), ví dụ mình sẽ cài Python 3.10:
Lời khuyên: đừng nên chạy theo các version mới nhất mà hãy sử dụng các version ổn định 

Liệt kê các version đã cài đặt bằng lệnh sau:

Kết quả sẽ thấy (mặc định sẽ chọn version của hệ thống):

Để chọn version mới làm version mặc định bằng lệnh sau (nhớ khởi động lại terminal để nhận version mới):

Để gỡ bỏ một version Python đã cài đặt, hãy chuyển qua version hệ thống hoặc version khác trước khi gỡ bỏ

Tuyệt vời ! Như vậy là chúng ta hoàn thành quá trình cài đặt và có thể dễ dàng chuyển đổi giữa các version Python một các dễ dàng, tiếp theo sẽ là thiết lập môi trường ảo cho từng version Python để tách biệt dự án Python và các phần phụ thuộc.

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

Tuy chúng ta đã có version Python như mong muốn nhưng có thể có nhiều dự án tuy cùnng version Python nhưng các thư việc, gói đi kèm lại khác nhau hay tuỳ thuộc vào framework đang sử dụng, biết được điều đó nên Pyenv hỗ trợ tính năng chia môi trường ảo trong từng version Python, ví dụ mình đang sử version Python 3.10.0 nhưng muốn một môi trường ảo riêng đã cài đặt các thư việc, gói hỗ trợ cho framework FastAPI, sử dụng lệnh sau để tạo môi trường riêng biệt

Sau khi đã tách môi trường ảo riêng, bạn có thể kích hoạt và bắt đầu sử dụng:

Kết quả sẽ như thế này (mình thiết lập zsh nên sẽ nhìn đẹp mắt hơn)

Trick: Sau khi thoát phiên làm việc thì sẽ cần kích hoạt lại môi trường ảo mỗi lần sử dụng, để duy trì việc kích hoạt môi trường ảo tự động mỗi khi mở terminal trong folder đó, chúng ta có thể tạo một file để Pyenv kích hoạt tự động môi trường ảo mỗi lần truy cập

Được rồi đi thôi !!! Bây giờ chúng ta đã có đủ version, môi trường để thực hành với FastAPI

3. Khởi động với API đơn giản

Cài đặt FastAPI và các thư viện cần thiết trong môi trường ảo

Cài đặt thư viện chính:

Cài đặt máy chủ ASGI uvicorn để run code:

Hoặc One for All theo docs của FastAPI, nhưng mình thích cài đặt từng thư viện một lúc mới làm quen framework hơn, nó giúp mình hiểu rõ công dụng và chức năng của từng thư viện và chỉ cài đặt các thư viện cần dùng

Và đừng quên cập nhật các thư viện vào file requirements.txt để theo dõi sau này:

Hello World với FastAPI

Tạo file main.py với hỗ trợ async trực tiếp từ FastAPI

Đa số lập trình viên đều bởi câu này, vì câu này mà dấn thân
Khởi động server với uvicorn và hot reload, port mặc định sẽ là 8000

Sau khi thấy server đã khởi động mà không vấn đề gì, truy cập http://127.0.0.1:8000 để kiểm tra kết quả

Kết quả:

API docs tự động

FastAPI hỗ trợ tạo tự động hai loại API docs cho chúng ta là Swagger theo tiêu chuẩn OpenAPI và ReDoc:
Swagger UI:

ReDoc UI:

Thật tuyệt vời !, chúng ta có tận 2 API docs được tạo tự động và không cần phải triển khai gì thêm, giúp tiết kiệm thời gian bàn giao API và tích hợp.

4. Kết bài

Chúng ta chỉ vừa đi các khái niệm cơ bản và nhiều bước thiết lập nhằm giúp ích cho quá trình thử nghiệm và cả lập trình sau này. Khởi động với FastAPI chắc sẽ cho bạn cảm giác đây là một framework tiện dụng với ít code hơn, giúp triển khai nhanh và hỗ trợ API docs đến tận răng. Chúng ta – những lập trình với nỗi bận tâm với logic bussiness và các vấn đề hóc búa hơn sẽ rất cần những hỗ trợ này để có thể tiến tới triển khai tính năng nhanh. Ở phần sau sẽ đi vào chi tiết hơn các tính năng cụ thể để áp dụng trong dự án thực tế.
P/s: Đây là lần đầu mình viết và chia sẻ blog kỹ thuật nên không tránh khỏi sai xót, mọi người cứ góp ý nhiệt tình

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo