]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🌐 Add Korean translation for `docs/tutorial/request-files.md` (#3743)
authorNina Hwang <79563565+NinaHwang@users.noreply.github.com>
Wed, 8 Dec 2021 15:52:01 +0000 (00:52 +0900)
committerGitHub <noreply@github.com>
Wed, 8 Dec 2021 15:52:01 +0000 (15:52 +0000)
Co-authored-by: Spike <rurouni24@gmail.com>
Co-authored-by: weekwith.me <63915557+0417taehyun@users.noreply.github.com>
Co-authored-by: SebastiΓ‘n RamΓ­rez <tiangolo@gmail.com>
docs/ko/docs/tutorial/request-files.md [new file with mode: 0644]
docs/ko/mkdocs.yml

diff --git a/docs/ko/docs/tutorial/request-files.md b/docs/ko/docs/tutorial/request-files.md
new file mode 100644 (file)
index 0000000..769a676
--- /dev/null
@@ -0,0 +1,144 @@
+# νŒŒμΌ μš”μ²­
+
+`File`을 μ‚¬μš©ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ—…λ‘œλ“œν•  νŒŒμΌλ“€μ„ μ •μ˜ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+!!! info "정보"
+    μ—…λ‘œλ“œλœ νŒŒμΌμ„ μ „달받기 μœ„ν•΄ λ¨Όμ € <a href="https://andrew-d.github.io/python-multipart/" class="external-link" target="_blank">`python-multipart`</a>λ₯Ό μ„€μΉ˜ν•΄μ•Όν•©λ‹ˆλ‹€.
+
+    μ˜ˆμ‹œ) `pip install python-multipart`.
+
+    μ—…λ‘œλ“œλœ νŒŒμΌλ“€μ€ "폼 λ°μ΄ν„°"의 ν˜•νƒœλ‘œ μ „솑되기 λ•Œλ¬Έμ— μ΄ μž‘업이 ν•„μš”ν•©λ‹ˆλ‹€.
+
+## `File` μž„ν¬νŠΈ
+
+`fastapi` μ—μ„œ `File` κ³Ό `UploadFile` μ„ μž„ν¬νŠΈ ν•©λ‹ˆλ‹€:
+
+```Python hl_lines="1" 
+{!../../../docs_src/request_files/tutorial001.py!}
+```
+
+## `File` λ§€κ°œλ³€μˆ˜ μ •μ˜
+
+`Body` λ° `Form` κ³Ό λ™μΌν•œ λ°©μ‹μœΌλ‘œ νŒŒμΌμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€:
+
+```Python hl_lines="7" 
+{!../../../docs_src/request_files/tutorial001.py!}
+```
+
+!!! info "정보"
+    `File` μ€ `Form` μœΌλ‘œλΆ€ν„° μ§μ ‘ μƒμ†λœ ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
+
+    ν•˜μ§€λ§Œ `fastapi`λ‘œλΆ€ν„° `Query`, `Path`, `File` λ“±μ„ μž„ν¬νŠΈ ν•  λ•Œ, μ΄κ²ƒλ“€μ€ νŠΉλ³„ν•œ ν΄λž˜μŠ€λ“€μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λΌλŠ” κ²ƒμ„ κΈ°μ–΅ν•˜κΈ° λ°”λžλ‹ˆλ‹€.
+
+!!! tip "팁"
+    File의 λ³Έλ¬Έμ„ μ„ μ–Έν•  λ•Œ, λ§€κ°œλ³€μˆ˜κ°€ μΏΌλ¦¬ λ§€κ°œλ³€μˆ˜ λ˜λŠ” λ³Έλ¬Έ(JSON) λ§€κ°œλ³€μˆ˜λ‘œ ν•΄μ„λ˜λŠ”  κ²ƒμ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄ `File` μ„ μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€.
+
+νŒŒμΌλ“€μ€ "폼 λ°μ΄ν„°"의 ν˜•νƒœλ‘œ μ—…λ‘œλ“œ λ©λ‹ˆλ‹€.
+
+*경둜 μž‘동 ν•¨μˆ˜*의 λ§€κ°œλ³€μˆ˜λ₯Ό `bytes` λ‘œ μ„ μ–Έν•˜λŠ” κ²½μš° **FastAPI**λŠ” νŒŒμΌμ„ μ½κ³  `bytes` ν˜•νƒœμ˜ λ‚΄μš©μ„ μ „λ‹¬ν•©λ‹ˆλ‹€.
+
+이것은 μ „체 λ‚΄μš©μ΄ λ©”λͺ¨λ¦¬μ— μ €μž₯λœλ‹€λŠ” κ²ƒμ„ μ˜λ―Έν•œλ‹€λŠ” κ±Έ μ—Όλ‘ν•˜κΈ° λ°”λžλ‹ˆλ‹€. μ΄λŠ” μž‘은 ν¬κΈ°μ˜ νŒŒμΌλ“€μ— μ ν•©ν•©λ‹ˆλ‹€.
+
+μ–΄λ–€ κ²½μš°μ—λŠ” `UploadFile` μ„ μ‚¬μš©ν•˜λŠ” κ²ƒμ΄ λ” μœ λ¦¬ν•©λ‹ˆλ‹€.
+
+## `File` λ§€κ°œλ³€μˆ˜μ™€  `UploadFile`
+
+`File` λ§€κ°œλ³€μˆ˜λ₯Ό `UploadFile` νƒ€μž…μœΌλ‘œ μ •μ˜ν•©λ‹ˆλ‹€:
+
+```Python hl_lines="12" 
+{!../../../docs_src/request_files/tutorial001.py!}
+```
+
+`UploadFile` μ„ μ‚¬μš©ν•˜λŠ” κ²ƒμ€ `bytes` κ³Ό λΉ„ꡐ해 λ‹€μŒκ³Ό κ°™μ€ μž₯점이 μžˆμŠ΅λ‹ˆλ‹€:
+
+* "μŠ€ν’€ νŒŒμΌ"을 μ‚¬μš©ν•©λ‹ˆλ‹€.
+    *  μ΅œλŒ€ ν¬κΈ° μ œν•œκΉŒμ§€λ§Œ λ©”λͺ¨λ¦¬μ— μ €μž₯되며, μ΄λ₯Ό μ΄ˆκ³Όν•˜λŠ” κ²½μš° λ””μŠ€ν¬μ— μ €μž₯λ©λ‹ˆλ‹€.
+* λ”°λΌμ„œ μ΄λ―Έμ§€, λ™μ˜μƒ, ν° μ΄μ§„μ½”λ“œμ™€ κ°™μ€ λŒ€μš©λŸ‰ νŒŒμΌλ“€μ„ λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μ†Œλͺ¨ν•˜μ§€ μ•Šκ³  μ²˜λ¦¬ν•˜κΈ°μ— μ ν•©ν•©λ‹ˆλ‹€.
+* μ—…λ‘œλ“œ λœ νŒŒμΌμ˜ λ©”타데이터λ₯Ό μ–»μ„ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+* <a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">file-like</a>  `async` μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€.
+* file-like objectλ₯Ό ν•„μš”λ‘œν•˜λŠ” λ‹€λ₯Έ λΌμ΄λΈŒλŸ¬λ¦¬μ— μ§μ ‘μ μœΌλ‘œ μ „달할 μˆ˜ μžˆλŠ” νŒŒμ΄μ¬ <a href="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile" class="external-link" target="_blank">`SpooledTemporaryFile`</a> κ°μ²΄λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
+
+### `UploadFile`
+
+`UploadFile` μ€ λ‹€μŒκ³Ό κ°™μ€ μ–΄νŠΈλ¦¬λ·°νŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€:
+
+* `filename` : λ¬Έμžμ—΄(`str`)둜 λœ μ—…λ‘œλ“œλœ νŒŒμΌμ˜ νŒŒμΌλͺ…μž…λ‹ˆλ‹€ (예: `myimage.jpg`).
+* `content_type` : λ¬Έμžμ—΄(`str`)둜 λœ νŒŒμΌ ν˜•식(MIME type / media type)μž…λ‹ˆλ‹€ (예:Β `image/jpeg`).
+* `file` :  <a href="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile" class="external-link" target="_blank">`SpooledTemporaryFile`</a> (<a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">파일λ₯˜</a> κ°μ²΄)μž…λ‹ˆλ‹€. μ΄κ²ƒμ€ "파일λ₯˜" κ°μ²΄λ₯Ό ν•„μš”λ‘œν•˜λŠ” λ‹€λ₯Έ λΌμ΄λΈŒλŸ¬λ¦¬μ— μ§μ ‘μ μœΌλ‘œ μ „달할 μˆ˜ μžˆλŠ” μ‹€μ§ˆμ μΈ νŒŒμ΄μ¬ νŒŒμΌμž…λ‹ˆλ‹€.
+
+`UploadFile` μ—λŠ” λ‹€μŒμ˜ `async` λ©”μ†Œλ“œλ“€μ΄ μžˆμŠ΅λ‹ˆλ‹€. μ΄λ“€μ€ λ‚΄λΆ€μ μΈ `SpooledTemporaryFile` μ„ μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ήν•˜λŠ” νŒŒμΌ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.
+
+* `write(data)`: `data`(`str` λ˜λŠ” `bytes`)λ₯Ό νŒŒμΌμ— μž‘μ„±ν•©λ‹ˆλ‹€.
+* `read(size)`: νŒŒμΌμ˜ λ°”μ΄νŠΈ λ° κΈ€μžμ˜ `size`(`int`)λ₯Ό μ½μŠ΅λ‹ˆλ‹€.
+* `seek(offset)`: νŒŒμΌ λ‚΄ `offset`(`int`) μœ„μΉ˜μ˜ λ°”μ΄νŠΈλ‘œ μ΄λ™ν•©λ‹ˆλ‹€.
+    * μ˜ˆ) `await myfile.seek(0)` λ₯Ό μ‚¬μš©ν•˜λ©΄ νŒŒμΌμ˜ μ‹œμž‘λΆ€λΆ„μœΌλ‘œ μ΄λ™ν•©λ‹ˆλ‹€.
+    * `await myfile.read()` λ₯Ό μ‚¬μš©ν•œ ν›„ λ‚΄μš©μ„ λ‹€μ‹œ μ½μ„ λ•Œ μœ μš©ν•©λ‹ˆλ‹€.
+* `close()`: νŒŒμΌμ„ λ‹«μŠ΅λ‹ˆλ‹€.
+
+상기 λͺ¨λ“  λ©”μ†Œλ“œλ“€μ΄ `async` λ©”μ†Œλ“œμ΄κΈ° λ•Œλ¬Έμ— β€œawait”을 μ‚¬μš©ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.
+
+예λ₯Όλ“€μ–΄, `async` *경둜 μž‘동 ν•¨μˆ˜*의 λ‚΄λΆ€μ—μ„œ λ‹€μŒκ³Ό κ°™μ€ λ°©μ‹μœΌλ‘œ λ‚΄μš©μ„ κ°€μ Έμ˜¬ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+```Python
+contents = await myfile.read()
+```
+
+λ§Œμ•½ μΌλ°˜μ μΈ `def` *경둜 μž‘동 ν•¨μˆ˜*의 λ‚΄λΆ€λΌλ©΄, λ‹€μŒκ³Ό κ°™μ΄ `UploadFile.file` μ— μ§μ ‘ μ ‘κ·Όν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:
+
+```Python
+contents = myfile.file.read()
+```
+
+!!! note  "`async` κΈ°μˆ μ  μ„ΈλΆ€μ‚¬ν•­"
+    `async` λ©”μ†Œλ“œλ“€μ„ μ‚¬μš©ν•  λ•Œ **FastAPI**λŠ” μŠ€λ ˆλ“œν’€μ—μ„œ νŒŒμΌ λ©”μ†Œλ“œλ“€μ„ μ‹€ν–‰ν•˜κ³  κ·Έλ“€μ„ κΈ°λ‹€λ¦½λ‹ˆλ‹€.
+
+!!! note "Starlette κΈ°μˆ μ  μ„ΈλΆ€μ‚¬ν•­"
+    **FastAPI**의 `UploadFile` μ€ **Starlette**의 `UploadFile` μ„ μ§μ ‘μ μœΌλ‘œ μƒμ†λ°›μ§€λ§Œ, **Pydantic** λ° FastAPI의 λ‹€λ₯Έ λΆ€λΆ„λ“€κ³Όμ˜ ν˜Έν™˜μ„±μ„ μœ„ν•΄ ν•„μš”ν•œ λΆ€λΆ„듀이 μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
+
+## "폼 λ°μ΄ν„°"λž€
+
+HTML의 νΌλ“€(`<form></form>`)이 μ„œλ²„에 λ°μ΄ν„°λ₯Ό μ „μ†‘ν•˜λŠ” λ°©μ‹μ€ λŒ€κ°œ λ°μ΄ν„°μ— JSONκ³ΌλŠ” λ‹€λ₯Έ "νŠΉλ³„ν•œ" μΈμ½”딩을 μ‚¬μš©ν•©λ‹ˆλ‹€. 
+
+**FastAPI**λŠ” JSON λŒ€μ‹  μ˜¬λ°”λ₯Έ μœ„μΉ˜μ—μ„œ λ°μ΄ν„°λ₯Ό μ½μ„ μˆ˜ μžˆλ„둝 ν•©λ‹ˆλ‹€.
+
+!!! note "기술적 μ„ΈλΆ€μ‚¬ν•­"
+    νΌμ˜ λ°μ΄ν„°λŠ” νŒŒμΌμ΄ ν¬ν•¨λ˜μ§€ μ•Šμ€ κ²½μš° μΌλ°˜μ μœΌλ‘œ "λ―Έλ””μ–΄ μœ ν˜•" `application/x-www-form-urlencoded` μ„ μ‚¬μš©ν•΄ μΈμ½”λ”© λ©λ‹ˆλ‹€.
+
+    ν•˜μ§€λ§Œ νŒŒμΌμ΄ ν¬ν•¨λœ κ²½μš°, `multipart/form-data`둜 μΈμ½”λ”©λ©λ‹ˆλ‹€. `File`을 μ‚¬μš©ν•˜μ˜€λ‹€λ©΄, **FastAPI**λŠ” λ³Έλ¬Έμ˜ μ ν•©ν•œ λΆ€λΆ„μ—μ„œ νŒŒμΌμ„ κ°€μ Έμ™€μ•Ό ν•œλ‹€λŠ” κ²ƒμ„ μΈμ§€ν•©λ‹ˆλ‹€.
+
+    μΈμ½”λ”©κ³Ό νΌ ν•„λ“œμ— λŒ€ν•΄ λ” μ•Œκ³ μ‹Άλ‹€λ©΄, <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><code>POST</code>에 κ΄€ν•œ<abbr title="Mozilla Developer Network">MDN</abbr>μ›Ή λ¬Έμ„œ</a> λ₯Ό μ°Έκ³ ν•˜κΈ° λ°”λžλ‹ˆλ‹€,.
+
+!!! warning "주의"
+    λ‹€μˆ˜μ˜ `File` κ³Ό `Form` λ§€κ°œλ³€μˆ˜λ₯Ό ν•œ *경둜 μž‘동*에 μ„ μ–Έν•˜λŠ” κ²ƒμ΄ κ°€λŠ₯ν•˜μ§€λ§Œ, μš”μ²­μ˜ λ³Έλ¬Έμ΄ `application/json` κ°€ μ•„λ‹Œ `multipart/form-data` λ‘œ μΈμ½”λ”© λ˜κΈ° λ•Œλ¬Έμ— JSON으둜 λ°›μ•„μ•Όν•˜λŠ” `Body` ν•„λ“œλ₯Ό ν•¨κ»˜ μ„ μ–Έν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.
+
+    μ΄λŠ” **FastAPI**의 ν•œκ³„κ°€ μ•„λ‹ˆλΌ, HTTP ν”„λ‘œν† μ½œμ— μ˜ν•œ κ²ƒμž…λ‹ˆλ‹€.
+
+## λ‹€μ€‘ νŒŒμΌ μ—…λ‘œλ“œ
+
+μ—¬λŸ¬ νŒŒμΌμ„ λ™μ‹œμ— μ—…λ‘œλ“œ ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+그듀은 "폼 λ°μ΄ν„°"λ₯Ό μ‚¬μš©ν•˜μ—¬ μ „솑된 λ™μΌν•œ "폼 ν•„λ“œ"에 μ—°κ²°λ©λ‹ˆλ‹€.
+
+이 κΈ°λŠ₯을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ , `bytes` μ˜ `List` λ˜λŠ” `UploadFile` λ₯Ό μ„ μ–Έν•˜κΈ° λ°”λžλ‹ˆλ‹€:
+
+```Python hl_lines="10  15" 
+{!../../../docs_src/request_files/tutorial002.py!}
+```
+
+μ„ μ–Έν•œλŒ€λ‘œ, `bytes` μ˜ `list` λ˜λŠ” `UploadFile` λ“€μ„ μ „솑받을 κ²ƒμž…λ‹ˆλ‹€.
+
+!!! note "μ°Έκ³ "
+    2019λ…„ 4μ›” 14일뢀터 Swagger UIκ°€ ν•˜λ‚˜μ˜ νΌ ν•„λ“œλ‘œ λ‹€μˆ˜μ˜ νŒŒμΌμ„ μ—…λ‘œλ“œν•˜λŠ” κ²ƒμ„ μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ” λ§Žμ€ μ •보λ₯Ό μ›ν•˜λ©΄,  <a href="https://github.com/swagger-api/swagger-ui/issues/4276" class="external-link" target="_blank">#4276</a>κ³Ό <a href="https://github.com/swagger-api/swagger-ui/issues/3641" class="external-link" target="_blank">#3641</a>을 μ°Έκ³ ν•˜μ„Έμš”.
+
+    κ·ΈλŸΌμ—λ„, **FastAPI**λŠ” ν‘œμ€€ Open APIλ₯Ό μ‚¬μš©ν•΄ μ΄λ―Έ ν˜Έν™˜μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.
+
+    λ”°λΌμ„œ Swagger UI λ˜λŠ” κΈ°νƒ€ κ·Έ μ™Έμ˜ OpenAPIλ₯Ό μ§€μ›ν•˜λŠ” νˆ΄μ΄ λ‹€μ€‘ νŒŒμΌ μ—…λ‘œλ“œλ₯Ό μ§€μ›ν•˜λŠ” κ²½μš°, μ΄λ“€μ€ **FastAPI**와 ν˜Έν™˜λ©λ‹ˆλ‹€.
+
+!!! note "기술적 μ„ΈλΆ€μ‚¬ν•­"
+    `from starlette.responses import HTMLResponse` μ—­μ‹œ μ‚¬μš©ν•   μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+    **FastAPI**λŠ” κ°œλ°œμžμ˜ νŽΈμ˜λ₯Ό μœ„ν•΄ `fastapi.responses` μ™€ λ™μΌν•œ `starlette.responses` λ„ μ œκ³΅ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ λŒ€λΆ€λΆ„μ˜ μ‘닡듀은 Starletteλ‘œλΆ€ν„° μ§μ ‘ μ œκ³΅λ©λ‹ˆλ‹€.
+
+## μš”μ•½
+
+폼 λ°μ΄ν„°λ‘œμ¨ μž…λ ₯ λ§€κ°œλ³€μˆ˜λ‘œ μ—…λ‘œλ“œν•  νŒŒμΌμ„ μ„ μ–Έν•  κ²½μš° `File` μ„ μ‚¬μš©ν•˜κΈ° λ°”λžλ‹ˆλ‹€.
index dd2d6a7ac7ace13f07ef73c6f22a1c8b2bc5e8a3..124e7b1d324c816d13adad57cbf87e8e29251788 100644 (file)
@@ -63,6 +63,7 @@ nav:
   - tutorial/header-params.md
   - tutorial/path-params-numeric-validations.md
   - tutorial/response-status-code.md
+  - tutorial/request-files.md
 markdown_extensions:
 - toc:
     permalink: true