9. Web services
Tới phần này, chúng ta đã thực hiện được các việc sau:
- Thiết lập môi trường quản lý mã nguồn với Git
- Thiết lập hệ thống cơ sở dữ liệu
Trước khi bắt tay vào làm phần backend, chúng ta sẽ tìm hiểu về Dịch vụ web (web services).
9.1 Web services là gì?
Dịch vụ web (tiếng Anh là web services hay web service), để tiện trình bày sẽ dùng luôn từ gốc là web services.
Web services:
- Là một dịch vụ, do thiết bị điện tử này cung cấp cho một thiết bị điện tử khác, quá trình trao đổi được thực hiện trên môi trường web (world wide web, WWW, Internet, HTTP)
- Một máy server trên mạng sẽ luôn lắng nghe các yêu cầu từ một cổng cụ thể, để cung cấp các tài nguyên web như HTML, JSON, XML, images và tạo ra các dịch vụ cho các ứng dụng có sử dụng web services
Xem hình minh họa về web services,
So sánh trang web và web services
Ở một góc nhìn khác, kết quả trả về của một web services khá giống một trang web, tuy nhiên có một số khác biệt sau:
Một số định nghĩa khác về web service
- Web services là một hệ thống phần mềm, được thiết kế để hỗ trợ khả năng tương tác giữa các ứng dụng trên các máy tính khác nhau, thông qua mạng Internet, giao diện chung và sự gắn kết của nó được mô tả bằng XML
- Là tài nguyên phần mềm có thể xác định bằng địa chỉ URL
- Thực hiện các chức năng và đưa ra các thông tin người dùng yêu cầu
- Ứng dụng cơ bản của web services là tích hợp các hệ thống
- Các ứng dụng được tích hợp với cơ sở dữ liệu và các ứng dụng khác, người sử dụng sẽ giao tiếp với cơ sở dữ liệu để tiến hành phân tích và lấy dữ liệu
Xem hình minh họa,
- Web services là một tập hợp các giao thức và tiêu chuẩn mở được sử dụng để trao đổi dữ liệu giữa các ứng dụng hoặc giữa các hệ thống
- Các ứng dụng phần mềm được viết bằng các ngôn ngữ lập trình khác nhau hoặc chạy trên các nền tảng khác nhau, chúng có thể sử dụng các web services để trao đổi dữ liệu qua lại theo cách tương tự như liên lạc giữa các quá trình trên một máy tính
Xem hình minh họa,
9.2 Triển khai Web services trong Ebook2LateX
Để hiểu rõ hơn về Web services, chúng ta sẽ triển khai trong dự án Ebook2LateX.
Ứng dụng Ebook2LateX gồm 2 thành phần: Frontend và Backend.
Trong đó, thành phần Backend sẽ cung cấp các dịch vụ dưới dạng các Web services cho phần Frontend.
Thành phần Frontend và Backend sẽ giao tiếp với nhau thông qua Web services.
- Frontend sẽ sử dụng framework React
- Backend sẽ sử dụng framework FastAPI
Như vậy, React sẽ kết nối với FastAPI để trao đổi dữ liệu. Nghĩa là React sẽ sử dụng các dịch vụ web mà FastAPI cung cấp.
Cài đặt FastAPI
Như bạn đã biết, để làm ứng dụng web phía backend, bạn có thể lập trình từ đầu, có thể dùng CMS, hoặc có thể dùng framework.
Trong phần này chúng ta sẽ sử dụng framework FastAPI.
FastAPI là một web framework dựa trên Python, hỗ trợ lập trình bất đồng bộ mạnh mẽ.
FastAPI là framework mã nguồn mở, được Sebastián Ramírez người Colombia phát hành lần đầu 2018.
Để cài đặt và chạy được FastAPI, bạn cần có Python (phiên bản 3.8 trở lên) đã được cài đặt trên máy tính. Bạn có thể kiểm tra bằng lệnh:
python -V
Ví dụ:
C:\Users\VIET HOANG - VTS>python -V
Python 3.14.0
Chúng ta đã có thư mục dự án là Ebook2LateX, đã có thư mục “môi trường ảo” là venv. Xem hình minh họa:
Chúng ta sẽ cài đặt FastAPI vào thư mục “môi trường ảo” (venv). Việc sử dụng môi trường ảo giúp cô lập các thư viện của dự án này, tránh xung đột với các dự án khác trên máy tính.
- Tại cửa sổ dòng lệnh (CMD), di chuyển dấu nhắc lệnh vào thư mục Ebook2LateX, kích hoạt môi trường ảo:
D:\DuAn\Ebook2LateX>venv\scripts\activate
(venv) D:\DuAn\Ebook2LateX>
- Gõ lệnh sau để cài đặt FastAPI: pip install "fastapi[all]"
(venv) D:\DuAn\Ebook2LateX>pip install "fastapi[all]"
Tham số “all” sẽ cài đặt luôn các thư viện bổ trợ cần thiết như uvicorn, pydantic, và các công cụ hỗ trợ xử lý dữ liệu form.
Uvicorn là gì?
Uvicorn là phần mềm web server, dùng để chạy các ứng dụng web viết bằng Python, hỗ trợ xử lý bất đồng bộ (ASGI - Asynchronous Server Gateway Interface).
Pydantic là gì?
Pydantic là một thư viện Python dùng để kiểm tra dữ liệu (validation) và xác thực dữ liệu (parsing) dựa trên các gợi ý kiểu (type hints).
Sau khi cài đặt xong, bạn nên chạy lệnh pip freeze > requirements.txt ở thư mục gốc để ghi lại danh sách các thư viện, giúp việc triển khai lên Docker sau này được đồng bộ. Như vậy trong dự án sẽ có 2 tập tin requirements.txt, một tập tin trong thư mục backend và một trong thư mục gốc. Bạn nên đọc thêm về mục đích của 2 tập tin requirements.txt này.
Viết đoạn mã nguồn đầu tiên (Hello World)
Trong thư mục backend, tạo tập tin có tên main.py và nhập vào đoạn mã sau (bạn nên tự tay gõ lại để nhớ và hiểu mã nguồn):
[main.py]
# Goi thu vien FastAPI
from fastapi import FastAPI
# Tao doi tuong app tu class FastAPI
app = FastAPI()
# Tao decorator cho app.get(“/”)
@app.get("/")
# khi nguoi dung truy cap vao web root, goi ham sau
def read_root():
return {"message": "Chao mung ban den voi Ebook2LateX!"}
Khởi chạy ứng dụng
Trở lại chương trình dòng lệnh (CMD), chạy lệnh sau để khởi động phần mềm web server:
uvicorn main:app --reload
Trong đó,
- main: là tên tập tin (main.py)
- app: là biến được khởi tạo trong code (app = FastAPI())
- --reload: Chế độ tự động tải lại server khi bạn thay đổi mã nguồn (rất hữu ích khi đang phát triển)
Nếu cửa sổ dòng lệnh xuất các thông tin sau là web server đã khởi chạy thành công:
…
←[32mINFO←[0m: Started server process [←[36m62384←[0m]
←[32mINFO←[0m: Waiting for application startup.
←[32mINFO←[0m: Application startup complete.
(Đừng tắt cửa sổ dòng lệnh này, nếu tắt là tắt web server).
Kiểm tra kết quả
Sau khi khởi chạy ứng dụng thành công, bạn có thể mở trình duyệt web, truy cập vào địa chỉ sau:
http://127.0.0.1:8000
Bạn sẽ thấy câu chào mừng trên trình duyệt:
["Chao mung ban den voi Ebook2LateX!"]
Thực hiện commit trạng thái của dự án vào Git
D:\DuAn\Ebook2LateX>git status
backend/main.py
requirements.txt
D:\DuAn\Ebook2LateX>git add .
D:\DuAn\Ebook2LateX>git commit -m "feat: cai dat FastAPI"
9.3 Bài tập và câu hỏi
Bài tập
Bài tập 9a. Cài đặt các nội dung trong phần lý thuyết.
Bài tập 9b. Sử dụng File Explorer, tìm trong thư mục dự án (Ebook2LateX) và cho biết: sau khi cài đặt, mã nguồn của framework FastAPI được lưu ở đâu?
Câu hỏi
Câu 9.1 Web services là gì?
A. Là một loại phần cứng dùng để lưu trữ dữ liệu trên Internet
B. Là dịch vụ do thiết bị điện tử này cung cấp cho thiết bị điện tử khác thông qua môi trường mạng (WWW, HTTP)
C. Là một ngôn ngữ lập trình mới dùng để xây dựng giao diện người dùng
D. Là một hệ điều hành dành riêng cho các máy chủ lưu trữ tập tin PDF
Câu 9.2 Tại sao trong một dự án web, Backend và Frontend lại cần trao đổi dữ liệu thông qua định dạng JSON hoặc XML?
A. Vì đây là các định dạng giúp tăng dung lượng lưu trữ của ổ cứng
B. Vì đây là các ngôn ngữ lập trình có thể thực hiện các phép toán phức tạp
C. Vì đây là các định dạng dữ liệu chuẩn giúp các hệ thống khác nhau (như Python và React) có thể hiểu và làm việc với nhau
D. Vì các định dạng này giúp mã hóa dữ liệu để không ai có thể đọc được
Câu 9.3 Ai là người đã phát hành phiên bản đầu tiên của FastAPI vào năm 2018?
A. Guido van Rossum
B. Sebastián Ramírez
C. Mark Zuckerberg
D. Brendan Eich
Câu 9.4 Đặc điểm nào sau đây giúp FastAPI đạt được hiệu suất cao tương đương với Go hoặc Node.js?
A. Sử dụng giao thức SOAP để truyền tin
B. Dựa trên nền tảng Starlette, Pydantic và hỗ trợ lập trình bất đồng bộ (async)
C. Chỉ chạy được trên các máy chủ có cấu hình phần cứng cực mạnh
D. Không cần sử dụng bất kỳ thư viện hỗ trợ nào từ bên thứ ba
Câu 9.5 ASGI (Asynchronous Server Gateway Interface) là gì?
A. Là một thư viện dùng để vẽ biểu đồ toán học trong Python
B. Là chuẩn giao diện hỗ trợ lập trình bất đồng bộ cho các web server và ứng dụng Python
C. Là một hệ quản trị cơ sở dữ liệu thay thế cho PostgreSQL
D. Là một công cụ dùng để đóng gói ứng dụng vào Docker
Câu 9.6 Uvicorn đóng vai trò gì trong dự án web viết bằng Python?
A. Là một framework để viết mã nguồn Frontend
B. Là một hệ quản trị cơ sở dữ liệu quan hệ
C. Là một máy chủ Web (Web Server) chuẩn ASGI dùng để chạy ứng dụng FastAPI
D. Là trình soạn thảo mã nguồn chuyên dụng cho Python
Câu 9.7 Khi bạn thực hiện lệnh uvicorn main:app --reload trong terminal, tham số --reload có tác dụng gì đối với quá trình phát triển dự án?
A. Tự động cài đặt lại toàn bộ thư viện trong requirements.txt
B. Tự động sao lưu dữ liệu từ PostgreSQL sang một tập tin khác
C. Tự động phát hiện thay đổi trong mã nguồn và khởi động lại server để áp dụng thay đổi ngay lập tức
D. Xóa bỏ các tập tin rác trong thư mục venv/
Câu 9.8 Trong Python, "Decorator" thường được nhận diện bằng ký hiệu nào đặt ngay phía trên định nghĩa hàm?
A. Dấu #
B. Dấu $
C. Dấu &
D. Dấu @



