FastAPI (Phần 1): Giới thiệu và setup môi trường
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
Django | Flask | FastAPI | |
---|---|---|---|
Cộng đồng | Cộng đồng của Django hiện tại khá lớn và lâu đời với > 70k sao trên Github | Cộ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 Github | Cộng đồng của FastAPI là khá mới với > 57k sao trên Github |
Hiệu suất | Nó không phải tốt nhất về mặt hiệu suất | Flask là một khung web vi mô. Nó hoạt động tốt hơn Django | FastAPI 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 |
ORM | Django ORM | Flask-sqlachemy | Sqlachemy |
Async | Hỗ trợ từ Django 3.x | Không, cần Asyncio | FastAPI cung cấp hỗ trợ bất đồng bộ gốc |
Builtin Admin UI | Có | Không | Không |
Python version | All version: 2x, 3x | All version: 2x, 3x | Only python3.x |
Python shell | Có | Có | Khô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ụng | Django rất lớn và do đó hơi phức tạp để học | Flask rất dễ học và sử dụng khá đơn giản | FastAPI là đơn giản nhất trong cả ba |
API docs | Phổ 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.x | Sử dụng Flask-restplus | Có sẵn Swagger và Redoc |
Xác minh dữ liệu | Không | Không | Có |
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:
brew install pyenv pyenv-virtualenv
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)
HOMEBREW_NO_AUTO_UPDATE=1 brew install pyenv pyenv-virtualenv
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ự):
sudo apt-get update
sudo apt-get install pyenv pyenv-virtualenv
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):
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
Khởi động lại shell với:
source ~/.bashrc
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 🤞
pyenv install 3.10.0
Liệt kê các version đã cài đặt bằng lệnh sau:
pyenv versions
Kết quả sẽ thấy (mặc định sẽ chọn version của hệ thống):
* system (set by /Users/macbookpro/ .pyenv/version)
3.10.0
Để 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 😗):
pyenv global 3.10.0
Để 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ỏ
pyenv uninstall 3.10.0
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
pyenv virtualenv 3.10.0 FastAPI
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:
pyenv shell FastAPI
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
FastAPI
Đượ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:
pip install fastapi
Cài đặt máy chủ ASGI uvicorn
để run code:
pip install uvicorn
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à tất nhiên dùng lệnh sẽ cài nhiều thư viện hơn khi các bạn xem file requirements.txt nhưng toàn các thư sẽ cần thiết đều các bạn chưa dùng đến thôi hihi 🤭
pip install "fastapi[all]"
Và đừng quên cập nhật các thư viện vào file requirements.txt để theo dõi sau này:
pip freeze > requirements.txt
Hello World với FastAPI
Tạo file main.py
với hỗ trợ async trực tiếp từ FastAPI
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return "Hello World !"
Đ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
uvicorn main:app --reload
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ả
INFO: Will watch for changes in these directories: ['/Users/admin/dev/training/python/fast_api/tutorial']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [76035] using StatReload
INFO: Started server process [76046]
INFO: Waiting for application startup.
INFO: Application startup complete.
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 🥰
Update 2023/07:
Source code: https://github.com/Xpose-Tech/fastapi-template/tree/part-1
Mình sẽ tiếp tục cập nhật trên repo này cho đến khi hoàn thành source base với FastAPI
All rights reserved