- vừa được xem lúc

FastAPI (Phần 1): Giới thiệu và setup môi trường

0 0 19

Người đăng: John

Theo Viblo Asia

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

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 Không Không
Python version All version: 2x, 3x All version: 2x, 3x Only python3.x
Python shell 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

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

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 read_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 🥰

Bình luận

Bài viết tương tự

- vừa được xem lúc

Thao tác với File trong Python

Python cung cấp các chức năng cơ bản và phương thức cần thiết để thao tác các file. Bài viết này tôi xin giới thiệu những thao tác cơ bản nhất với file trong Python.

0 0 63

- vừa được xem lúc

Tập tành crawl dữ liệu với Scrapy Framework

Lời mở đầu. Chào mọi người, mấy hôm nay mình có tìm hiểu được 1 chút về Scrapy nên muốn viết vài dòng để xem mình đã học được những gì và làm 1 demo nho nhỏ.

0 0 166

- vừa được xem lúc

Sử dụng Misoca API (oauth2) với Python

Với bài viết này giúp chúng ta có thể nắm được. ・Tìm hiểu cách xử lý API misoca bằng Python.

0 0 49

- vừa được xem lúc

[Series Pandas DataFrame] Phân tích dữ liệu cùng Pandas (Phần 3)

Tiếp tục phần 2 của series Pandas DataFrame nào. Let's go!!. Ở phần trước, các bạn đã biết được cách lấy dữ liệu một row hoặc column trong Pandas DataFame rồi phải không nào. 6 Hoc.

0 0 63

- vừa được xem lúc

Lập trình socket bằng Python

Socket là gì. Một chức năng khác của socket là giúp các tầng TCP hoặc TCP Layer định danh ứng dụng mà dữ liệu sẽ được gửi tới thông qua sự ràng buộc với một cổng port (thể hiện là một con số cụ thể), từ đó tiến hành kết nối giữa client và server.

0 0 79

- vừa được xem lúc

[Series Pandas DataFrame] Phân tích dữ liệu cùng Pandas (Phần 2)

Nào, chúng ta cùng đến với phần 2 của series Pandas DataFrame. Truy xuất Labels và Data. Bạn đã biết cách khởi tạo 1 DataFrame của mình, và giờ bạn có thể truy xuất thông tin từ đó. Với Pandas, bạn có thể thực hiện các thao tác sau:.

0 0 95