10. Lập trình Web services
Tới bài học này, bạn đã thực hiện được các việc sau:
- Đã tạo môi trường ảo venv, cài đặt các thư viện cần thiết như FastAPI, Sqlalchemy, Alembic, và Python-dotenv
- Đã thiết lập kết nối với PostgreSQL, định nghĩa các bảng dữ liệu (Users, Documents, FormulaEntries, Logs) trong models.py và thực hiện migration để tạo bảng tự động
- Đã tạo tập tin main.py với mã nguồn "Hello World" và khởi chạy thành công Web server bằng Uvicorn
- Đã viết script seed.py để tự động nạp dữ liệu vào database
- Đã thực hiện commit các thay đổi và đẩy dự án lên GitHub
Trong phần này, chúng ta sẽ tìm hiểu một số nội dung sau:
- Hệ thống lại hoạt động của ứng dụng web trên nền tảng Python
- Lập trình minh họa để hiểu sâu về hoạt động của hệ thống
- Làm quen với việc tạo ra các services với kỹ thuật RESTful API
10.1 Mô hình client-server
Các ứng dụng web hoạt động dựa trên mô hình client-server.
Ý tưởng của mô hình client-server, đơn giản chỉ là: máy khách (client) gửi một yêu cầu (request) đến máy chủ (server), máy chủ sẽ xử lý và trả kết quả về cho máy khách.
Xem hình minh họa về mô hình client-server:
Mô hình client-server gồm một số thành phần:
- Client: khởi phát yêu cầu, gửi yêu cầu tới server, nhận kết quả từ server trả về. Client có thể là trình duyệt, ứng dụng viết bằng python/javascript hoặc bất kỳ ứng dụng nào mà có phát sinh ra HTTP request
- Server: có vai trò cung cấp dịch vụ, xử lý và trả về kết quả cho máy client
- Môi trường truyền thông tin: hạ tầng mạng (LAN, Internet), bao gồm cả phần cứng và phần mềm
- Giao thức truyền thông tin: các chuẩn công nghệ giúp giao tiếp và truyền thông tin giữa server-client. Ví dụ HTTP, HTTPS
Trong mô hình client-server, khi môi trường truyền đã được kết nối và sẵn sàng, thì client luôn là nơi khởi phát của ứng dụng. Client sẽ gửi một HTTP request tới server. Khi server nhận được request, nó sẽ xử lý và trả kết quả về cho client bằng một HTTP response
Client là thành phần chủ động. Server là thành phần bị động.
Chúng ta sẽ thấy cách hoạt động của một ứng dụng web rất khác so với cách hoạt động của chương trình trên máy cục bộ (ví dụ Microsoft Word). Trong Microsoft Word, mọi thao tác đều được thực hiện ngay trên máy người dùng, từ việc ra lệnh, xử lý và trả về kết quả. Cũng là chương trình xử lý văn bản, nhưng Google Docs là một ứng dụng hoạt động theo mô hình client-server. Nếu không có kết nối mạng thì Google Docs sẽ không hoạt động được.
Để hiểu rõ hơn về mô hình client-server, chúng ta sẽ cùng quan sát các bước của quá trình mở một ứng dụng web:
Do ứng dụng web hoạt động theo mô hình client-server, nên để có trang web trên trình duyệt, cần trải qua các bước sau:
Bước 1: Người dùng nhập địa chỉ trang web (URL) vào thanh địa chỉ. Ví dụ: http://example.com/hello.php
Bước 2: Trình duyệt dựa vào URL trong thanh địa chỉ, kết nối tới máy web server, gửi yêu cầu tới web server (ví dụ yêu cầu: gửi cho nội dung trang web hello.php)
Bước 3: Web server xử lý yêu cầu, gửi trả kết quả về cho trình duyệt (ví dụ nội dung trang web dưới dạng mã nguồn HTML, CSS và JavaScript)
Bước 4: Trình duyệt thực thi mã HTML, CSS, JavaScript và hiển thị trang web ra màn hình
Xem hình minh họa:
Chúng ta cùng thực hành, quan sát trình duyệt mở một ứng dụng web trên máy tính:
Bước 1. Mở trình duyệt web. Ví dụ Chrome
Bước 2. Nhập vào đường dẫn của trình duyệt địa chỉ một trang web, bấm Enter để trình duyệt lấy trang web từ máy server, và hiển thị nội dung ra màn hình. Ví dụ thanhnien.vn
Bước 3. Mở Developer tools của trình duyệt bằng một số cách sau:
- Bấm tổ hợp ba phím Ctrl+Shift+I
- hoặc bấm phím F12
- hoặc vào menu của trình duyệt tìm tới mục Developer tools
- hoặc bấm chuột phải vào trang web, chọn Inspect
Bước 4. Trong cửa sổ của Developer tools, bấm chuột vào mục Network
Bước 5. Quan sát sẽ thấy các tập tin HTML (thanhnien.vn), CSS (các tập tin có phần mở rộng là css), JavaScript (các tập tin có phần mở rộng là js) được server gửi về cho client
Bước 6. Bấm chuột vào các tập tin do server gửi về và quan sát nội dung của nó ở cửa sổ bên phải. Nhớ chọn mục Response
10.2 Hoạt động của ứng dụng web trên Python
Để trải nghiệm với ứng dụng web trên Python, chúng ta cùng thực hành và quan sát cách hệ thống này hoạt động.
Hình minh họa các thành phần của hệ thống:
Mô tả hoạt động của hệ thống:
- [Bước 1] Khởi chạy phần mềm Uvicorn, đây chính là phần mềm web server
- [Bước 2] Mở trình duyệt, gõ vào thanh địa chỉ: http://localhost:8000/ để gửi request tới Uvicorn, gửi tới cổng 8000, chuyển tới hàm get() của FastAPI.
- [Bước 3] Hàm get() của FastAPI sẽ xử lý yêu cầu từ client
- [Bước 4] FastAPI trả kết quả về cho trình duyệt
10.3 Bài tập và câu hỏi
Bài tập
Bài tập 10a. Hãy viết một chương trình đơn giản, để thực hiện việc sau:
- Mở trình duyệt, gửi một số qua thanh địa chỉ
- FastAPI nhận số từ trình duyệt, nhân với 10 rồi gửi trả lại cho trình duyệt
Bài tập 10b. Hãy viết một chương trình đơn giản, để thực hiện việc sau:
- Mở trình duyệt, gửi nhãn hiệu (brand) và kích thước (size) đôi giày bạn muốn mua (qua thanh địa chỉ), ví dụ hiệu Nike, kích thước 42
- FastAPI nhận brand và size từ trình duyệt, xử lý và trả về chuỗi: Bạn muốn mua giày [brand] kích thước [size] đúng không?
Câu hỏi
Câu 10.1 Trong mô hình client-server, thành phần nào đóng vai trò là nơi khởi phát yêu cầu (request)?
A. Server
B. Client
C. Môi trường truyền tin
D. Cơ sở dữ liệu
Câu 10.2 Đâu là các ví dụ về giao thức truyền thông tin dùng để kết nối giữa máy khách và máy chủ trong ứng dụng web?
A. CPU và RAM
B. LAN và Internet
C. HTTP và HTTPS
D. HTML và CSS
Câu 10.3 Phần mềm nào được sử dụng làm Web server chuẩn ASGI để chạy các ứng dụng FastAPI trong dự án web Python?
A. PostgreSQL
B. React
C. Uvicorn
D. SQLAlchemy
Câu 10.4 Thứ tự các bước cơ bản để một ứng dụng web Python xử lý yêu cầu là gì?
A. FastAPI trả kết quả -> Uvicorn nhận request -> Hàm xử lý thực thi
B. Khởi chạy Uvicorn -> Nhận request từ trình duyệt -> FastAPI xử lý -> Trả kết quả về trình duyệt
C. Mở trình duyệt -> FastAPI xử lý -> Khởi chạy Uvicorn -> Nhận kết quả
D. FastAPI nhận request trực tiếp từ trình duyệt -> Trả kết quả cho Uvicorn
Câu 10.5 Tại sao FastAPI được coi là một framework phù hợp cho các dịch vụ web hiện đại đòi hỏi hiệu suất cao?
A. Vì nó chỉ chạy được trên hệ điều hành Windows
B. Vì nó hỗ trợ lập trình bất đồng bộ (async) mạnh mẽ và dựa trên nền tảng Starlette, Pydantic
C. Vì nó không cần cài đặt Python
D. Vì nó tự động kết nối với tất cả các loại cơ sở dữ liệu mà không cần cấu hình
Câu 10.6 Trong mã nguồn FastAPI, ký hiệu @app.get("/") (Decorator) có ý nghĩa gì?
A. Khai báo một biến số nguyên cho ứng dụng
B. Định nghĩa một ghi chú (comment) không có giá trị thực thi
C. Điều hướng yêu cầu (routing) từ người dùng truy cập vào trang chủ (web root) để gọi hàm xử lý tương ứng
D. Dùng để cài đặt thư viện FastAPI vào máy tính
Câu 10.7 Khi đang phát triển ứng dụng, lệnh nào sau đây giúp bạn khởi chạy server sao cho mọi thay đổi trong mã nguồn main.py sẽ được tự động cập nhật ngay lập tức mà không cần khởi động lại thủ công?
A. python main.py
B. uvicorn main:app
C. uvicorn main:app --reload
D. pip install fastapi
Câu 10.8 Giả sử bạn có tập tin mã nguồn tên là api_service.py và biến khởi tạo ứng dụng là my_web_app = FastAPI(). Lệnh đúng để khởi chạy server này bằng Uvicorn là:
A. uvicorn api_service:my_web_app
B. uvicorn my_web_app:api_service
C. python api_service.py
D. run uvicorn api_service






