From a33ce3b7c3299c5bf1b7963f4b4b28efb30dafc9 Mon Sep 17 00:00:00 2001 From: Thanh Phuong Date: Thu, 14 Mar 2024 15:20:30 +0700 Subject: [PATCH 1/5] =?UTF-8?q?:=F0=9F=87=BB=F0=9F=87=B3:=20Add=20Vietname?= =?UTF-8?q?se=20translation=20for=20docs/vi/docs/tutorial/static-files.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/vi/docs/tutorial/static-files.md | 39 +++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 docs/vi/docs/tutorial/static-files.md diff --git a/docs/vi/docs/tutorial/static-files.md b/docs/vi/docs/tutorial/static-files.md new file mode 100644 index 000000000..e0120897d --- /dev/null +++ b/docs/vi/docs/tutorial/static-files.md @@ -0,0 +1,39 @@ +# StaticFiles + +Bạn có thể tự động cung cấp các tệp tĩnh từ một thư mục bằng `StaticFiles`. + +## Sử dụng `StaticFiles` + +* Import `StaticFiles`. +* "Mount" một `StaticFiles()` instance trong một đường dẫn cụ thể. + +```Python hl_lines="2 6" +{!../../../docs_src/static_files/tutorial001.py!} +``` + +!!! note "Chi tiết kỹ thuật" + Bạn cũng có thể dùng `from starlette.staticfiles import StaticFiles`. + + **FastAPI** cung cấp `starlette.staticfiles` tương tự `fastapi.staticfiles` để thuận tiện hơn cho các lập trình viên. Tuy nhiên nó thực sự bắt nguồn từ Starlette. + +### "Mounting" là gì + +"Mounting" có nghĩ là thêm một ứng dụng "độc lập" hoàn chỉnh vào một đường dẫn cụ thể, sau đó sẽ xử lý tất cả các đường dẫn phụ. + +Điều này khác với việc sử dụng `APIRouter` vì một ứng dụng được gắn kết hoàn toàn độc lập. OpenAPI và docs được tạo ra từ ứng dụng của bạn sẽ không bao gồm bất kỳ thứ gì từ ứng dụng được gắn kết, v.v. + +You can read more about this in the [Advanced User Guide](../advanced/index.md){.internal-link target=_blank}. + +## Cụ thể + +Đường dẫn `"/static"` đầu tiên đề cập đến đường dẫn phụ mà "ứng dụng phụ" này sẽ được "gắn kết" vào. Vì vậy, bất kỳ đường dẫn nào bắt đầu bằng `"/static"` sẽ được nó xử lý. + +`directory="static"` đề cập đến tên của thư mục chứa các tệp tĩnh của bạn. + +`name="static"` đặt cho nó một tên mà **FastAPI** có thể sử dụng nội bộ. + +Tất cả các tham số này có thể khác với "`static`, hãy điều chỉnh chúng theo nhu cầu và chi tiết cụ thể của ứng dụng của bạn. + +## Tìm hiểu thêm + +Để biết thêm chi tiết và tùy chọn, hãy xem Tài liệu của Starlette về Tệp tĩnh. From 7fb3b172749ef1298a5f375e25a7dd0543b4eb3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C6=B0=C6=A1ng=20T=E1=BA=A5n=20Th=C3=A0nh?= <51350651+ptt3199@users.noreply.github.com> Date: Mon, 10 Feb 2025 19:27:24 +0700 Subject: [PATCH 2/5] Update static-files.md --- docs/vi/docs/tutorial/static-files.md | 43 ++++++++++++++------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/docs/vi/docs/tutorial/static-files.md b/docs/vi/docs/tutorial/static-files.md index e0120897d..25a22c3de 100644 --- a/docs/vi/docs/tutorial/static-files.md +++ b/docs/vi/docs/tutorial/static-files.md @@ -1,39 +1,40 @@ -# StaticFiles +# Tệp tĩnh (Static Files) -Bạn có thể tự động cung cấp các tệp tĩnh từ một thư mục bằng `StaticFiles`. +Bạn có thể triển khai tệp tĩnh tự động từ một thư mục bằng cách sử dụng StaticFiles. -## Sử dụng `StaticFiles` +## Sử dụng `Tệp tĩnh` -* Import `StaticFiles`. -* "Mount" một `StaticFiles()` instance trong một đường dẫn cụ thể. +- Nhập `StaticFiles`. +- "Mount" a `StaticFiles()` instance in a specific path. -```Python hl_lines="2 6" -{!../../../docs_src/static_files/tutorial001.py!} -``` +{_ ../../docs_src/static_files/tutorial001.py hl[2,6] _} -!!! note "Chi tiết kỹ thuật" - Bạn cũng có thể dùng `from starlette.staticfiles import StaticFiles`. +/// note | Technical Details - **FastAPI** cung cấp `starlette.staticfiles` tương tự `fastapi.staticfiles` để thuận tiện hơn cho các lập trình viên. Tuy nhiên nó thực sự bắt nguồn từ Starlette. +Bạn cũng có thể sử dụng `from starlette.staticfiles import StaticFiles`. + +**FastAPI** cung cấp cùng `starlette.staticfiles` như `fastapi.staticfiles` giúp đơn giản hóa việc sử dụng, nhưng nó thực sự đến từ Starlette. + +/// ### "Mounting" là gì -"Mounting" có nghĩ là thêm một ứng dụng "độc lập" hoàn chỉnh vào một đường dẫn cụ thể, sau đó sẽ xử lý tất cả các đường dẫn phụ. +"Mounting" có nghĩa là thêm một ứng dụng "độc lập" hoàn chỉnh vào một đường dẫn cụ thể, sau đó ứng dụng đó sẽ chịu trách nhiệm xử lý tất cả các đường dẫn con. -Điều này khác với việc sử dụng `APIRouter` vì một ứng dụng được gắn kết hoàn toàn độc lập. OpenAPI và docs được tạo ra từ ứng dụng của bạn sẽ không bao gồm bất kỳ thứ gì từ ứng dụng được gắn kết, v.v. +Điều này khác với việc sử dụng `APIRouter` vì một ứng dụng được gắn kết là hoàn toàn độc lập. OpenAPI và tài liệu từ ứng dụng chính của bạn sẽ không bao gồm bất kỳ thứ gì từ ứng dụng được gắn kết, v.v. -You can read more about this in the [Advanced User Guide](../advanced/index.md){.internal-link target=_blank}. +Bạn có thể đọc thêm về điều này trong [Hướng dẫn Người dùng Nâng cao](../advanced/index.md){.internal-link target=\_blank}. -## Cụ thể +## Chi tiết -Đường dẫn `"/static"` đầu tiên đề cập đến đường dẫn phụ mà "ứng dụng phụ" này sẽ được "gắn kết" vào. Vì vậy, bất kỳ đường dẫn nào bắt đầu bằng `"/static"` sẽ được nó xử lý. +Đường dẫn đầu tiên `"/static"` là đường dẫn con mà "ứng dụng con" này sẽ được "gắn" vào. Vì vậy, bất kỳ đường dẫn nào bắt đầu bằng `"/static"` sẽ được xử lý bởi nó. -`directory="static"` đề cập đến tên của thư mục chứa các tệp tĩnh của bạn. +Đường dẫn `directory="static"` là tên của thư mục chứa tệp tĩnh của bạn. -`name="static"` đặt cho nó một tên mà **FastAPI** có thể sử dụng nội bộ. +Tham số `name="static"` đặt tên cho nó để có thể được sử dụng bên trong **FastAPI**. -Tất cả các tham số này có thể khác với "`static`, hãy điều chỉnh chúng theo nhu cầu và chi tiết cụ thể của ứng dụng của bạn. +Tất cả các tham số này có thể khác với "`static`", điều chỉnh chúng với nhu cầu và chi tiết cụ thể của ứng dụng của bạn. -## Tìm hiểu thêm +## Thông tin thêm -Để biết thêm chi tiết và tùy chọn, hãy xem Tài liệu của Starlette về Tệp tĩnh. +Để biết thêm chi tiết và tùy chọn, hãy kiểm tra Starlette's docs about Static Files. From 7eeb3318762464a0a20b488e9148876a74c994a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C6=B0=C6=A1ng=20T=E1=BA=A5n=20Th=C3=A0nh?= <51350651+ptt3199@users.noreply.github.com> Date: Mon, 10 Feb 2025 19:44:34 +0700 Subject: [PATCH 3/5] Update static-files.md --- docs/vi/docs/tutorial/static-files.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/vi/docs/tutorial/static-files.md b/docs/vi/docs/tutorial/static-files.md index 25a22c3de..ecf8c2485 100644 --- a/docs/vi/docs/tutorial/static-files.md +++ b/docs/vi/docs/tutorial/static-files.md @@ -7,9 +7,9 @@ Bạn có thể triển khai tệp tĩnh tự động từ một thư mục bằ - Nhập `StaticFiles`. - "Mount" a `StaticFiles()` instance in a specific path. -{_ ../../docs_src/static_files/tutorial001.py hl[2,6] _} +{* ../../docs_src/static_files/tutorial001.py hl[2,6] *} -/// note | Technical Details +/// note | Chi tiết kỹ thuật Bạn cũng có thể sử dụng `from starlette.staticfiles import StaticFiles`. @@ -33,8 +33,8 @@ Bạn có thể đọc thêm về điều này trong [Hướng dẫn Người d Tham số `name="static"` đặt tên cho nó để có thể được sử dụng bên trong **FastAPI**. -Tất cả các tham số này có thể khác với "`static`", điều chỉnh chúng với nhu cầu và chi tiết cụ thể của ứng dụng của bạn. +Tất cả các tham số này có thể khác với `static`, điều chỉnh chúng với phù hợp với ứng dụng của bạn. ## Thông tin thêm -Để biết thêm chi tiết và tùy chọn, hãy kiểm tra Starlette's docs about Static Files. +Để biết thêm chi tiết và tùy chọn, hãy xem Starlette's docs about Static Files. From 9cce825b99639df0a666f597b22b653d063b8117 Mon Sep 17 00:00:00 2001 From: Thanh Phuong Date: Thu, 3 Apr 2025 15:16:05 +0700 Subject: [PATCH 5/5] Add Vietnamese documentation for middleware --- docs/vi/docs/tutorial/middleware.md | 70 +++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 docs/vi/docs/tutorial/middleware.md diff --git a/docs/vi/docs/tutorial/middleware.md b/docs/vi/docs/tutorial/middleware.md new file mode 100644 index 000000000..20984b556 --- /dev/null +++ b/docs/vi/docs/tutorial/middleware.md @@ -0,0 +1,70 @@ +# Middleware + +Bạn có thể thêm middleware vào ứng dụng **FastAPI**. + +Một "middleware" là một hàm mà làm việc với mỗi **request** trước khi nó được xử lý bởi bất kỳ *path operation* nào. Đồng thời cũng tương tự với mỗi **response** trước khi trả về. + +* Nó tiếp nhận mỗi **request** mà đến ứng dụng của bạn. +* Nó có thể thực hiện một số thay đổi với **request** hoặc chạy một số đoạn mã cần thiết. +* Nó sau đó chuyển tiếp **request** để phần còn lại của ứng dụng xử lí (bởi một *path operation* nào đó). +* Nó tiếp nhận **response** được tạo ra bởi ứng dụng (bởi một *path operation* nào đó). +* Nó có thể thực hiện một số thay đổi với **response** hoặc chạy một số đoạn mã cần thiết. +* Sau đó nó trả về **response**. + +/// note | Chi tiết kỹ thuật + +Nếu bạn có dependencies với `yield`, mã thoát sẽ chạy *sau* middleware. + +Nếu có bất kỳ task nền (sẽ được thêm vào tài liệu sau), chúng sẽ chạy *sau* tất cả middleware. + +/// + +## Tạo một middleware + +Để tạo một middleware, bạn dùng decorator `@app.middleware("http")` phía trên một hàm. + +Middleware nhận: + +* `request`. +* Một hàm `call_next` sẽ nhận `request` làm tham số. + * Hàm này sẽ chuyển tiếp `request` đến *path operation* tương ứng. + * Sau đó nó trả về `response` được tạo ra bởi *path operation* tương ứng. +* Bạn có thể chỉnh sửa thêm `response` trước khi trả về. + +{* ../../docs_src/middleware/tutorial001.py hl[8:9,11,14] *} + +/// tip + +Lưu ý rằng các header tùy chỉnh có thể được thêm bằng cáchsử dụng tiền tố 'X-'. + +Nhưng nếu bạn có header tùy chỉnh mà bạn muốn một client trong trình duyệt có thể thấy, bạn cần thêm chúng vào cấu hình CORS ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) bằng tham số `expose_headers` được tài liệu trong Starlette's CORS docs. + +/// + +/// note | Chi tiết kỹ thuật + +Bạn cũng có thể sử dụng `from starlette.requests import Request`. + +**FastAPI** cung cấp nó như một tiện ích cho bạn, lập trình viên. Nhưng nó đến trực tiếp từ Starlette. + +/// + +### Trước và sau `response` + +Bạn có thể thêm mã để chạy với `request`, trước khi bất kỳ *path operation* nào nhận được nó. +Bạn cũng có thể làm điều tương tự với `response` sau khi nó được tạo ra, trước khi trả nó về. +Ví dụ, bạn có thể thêm một header tùy chỉnh `X-Process-Time` chứa thời gian tính bằng giây mà nó đã mất để xử lí request và tạo ra response: + +{* ../../docs_src/middleware/tutorial001.py hl[10,12:13] *} + +/// tip + +Ở đây chúng ta sử dụng `time.perf_counter()` thay vì `time.time()` vì nó chính xác hơn cho các trường hợp này. 🤓 + +/// + +## Các middleware khác + +Bạn có thể đọc thêm về các middleware khác trong [Hướng dẫn sử dụng nâng cao: Middleware nâng cao](../advanced/middleware.md){.internal-link target=_blank}. + +Bạn sẽ đọc về cách xử lí CORS với một middleware trong phần tiếp theo.