--- /dev/null
+# LLM ãã¹ããã¡ã€ã« { #llm-test-file }
+
+ãã®ããã¥ã¡ã³ãã¯ãããã¥ã¡ã³ãã翻蚳ãã <abbr title="Large Language Model - å€§èŠæš¡èšèªã¢ãã«">LLM</abbr> ãã`scripts/translate.py` ã® `general_prompt` ãšã`docs/{language code}/llm-prompt.md` ã®èšèªåºæããã³ãããçè§£ããŠãããããã¹ãããŸããèšèªåºæããã³ãã㯠`general_prompt` ã®æ«å°Ÿã«è¿œå ãããŸãã
+
+ããã«è¿œå ãããã¹ãã¯ããã¹ãŠã®èšèªåºæããã³ããã®èšèšè
ãåç
§ããŸãã
+
+äœ¿ãæ¹:
+
+* èšèªåºæããã³ãããçšæããŸã - `docs/{language code}/llm-prompt.md`ã
+* ãã®ææžãåžæããã¿ãŒã²ããèšèªã«æ°èŠã§ç¿»èš³ããŸãïŒäŸ: `translate.py` ã® `translate-page` ã³ãã³ãïŒãããã«ãã `docs/{language code}/docs/_llm-test.md` ã«ç¿»èš³ãäœæãããŸãã
+* 翻蚳ãåé¡ãªãã確èªããŸãã
+* å¿
èŠã§ããã°ãèšèªåºæããã³ãããgeneral ããã³ããããŸãã¯è±èªããã¥ã¡ã³ããæ¹åããŸãã
+* ãã®åŸãç¿»èš³ã«æ®ã£ãŠããåé¡ãæåã§ä¿®æ£ããè¯ã翻蚳ã«ããŸãã
+* è¯ã翻蚳ãçšæããç¶æ
ã§ããäžåºŠç¿»èš³ããŸããçæ³çãªçµæã¯ãLLM ã翻蚳ã«äžå倿Žãå ããªãããšã§ããã€ãŸã general ããã³ãããšèšèªåºæããã³ãããæè¯ã§ããããšãæå³ããŸãïŒæã
ããã€ãã©ã³ãã ã«èŠãã倿Žãè¡ãããšããããŸããçç±ã¯ <a href="https://doublespeak.chat/#/handbook#deterministic-output" class="external-link" target="_blank">LLM ã¯æ±ºå®è«çã¢ã«ãŽãªãºã ã§ã¯ãªã</a> ããã§ãïŒã
+
+ãã¹ãå
容:
+
+## ã³ãŒãã¹ãããã { #code-snippets }
+
+//// tab | ãã¹ã
+
+ããã¯ã³ãŒãã¹ããããã§ã: `foo`ããããŠãããã³ãŒãã¹ããããã§ã: `bar`ãããã«ããäžã€: `baz quux`ã
+
+////
+
+//// tab | æ
å ±
+
+ã³ãŒãã¹ããããã®å
容ã¯ãã®ãŸãŸã«ããŠããå¿
èŠããããŸãã
+
+`scripts/translate.py` ã® general ããã³ããå
ã### Content of code snippetsãã®ç¯ãåç
§ããŠãã ããã
+
+////
+
+## åŒçš { #quotes }
+
+//// tab | ãã¹ã
+
+æšæ¥ãå人ã¯ããæžããŸããããincorrectly ãæ£ããç¶Žãã°ãããªãã¯ãããééã£ãŠç¶Žã£ãããšã«ãªãããããã«å¯ŸããŠç§ã¯ããçããŸãããããã®ãšããããã ããincorrectlyãã¯èª€ãã§ãã"incorrectly"ãã§ã¯ãããŸãããã
+
+/// note | åè
+
+LLM ã¯ããããããã誀ã£ãŠç¿»èš³ããŸããéèŠãªã®ã¯ãå翻蚳æã«ä¿®æ£æžã¿ã®ç¿»èš³ãç¶æã§ãããã©ããã ãã§ãã
+
+///
+
+////
+
+//// tab | æ
å ±
+
+ããã³ããèšèšè
ã¯ãã¹ãã¬ãŒãã¯ã©ãŒããã¿ã€ãã°ã©ãã£ãã¯ãªåŒçšç¬Šã«å€æãããã©ãããéžã¹ãŸãããã®ãŸãŸã§ãåé¡ãããŸããã
+
+äŸãšã㊠`docs/de/llm-prompt.md` ã®ã### Quotesãã®ç¯ãåç
§ããŠãã ããã
+
+////
+
+## ã³ãŒãã¹ããããå
ã®åŒçš { #quotes-in-code-snippets }
+
+//// tab | ãã¹ã
+
+`pip install "foo[bar]"`
+
+ã³ãŒãã¹ããããäžã®æååãªãã©ã«ã®äŸ: `"this"`, `'that'`.
+
+é£ããæååãªãã©ã«ã®äŸ: `f"I like {'oranges' if orange else "apples"}"`
+
+ããŒãã³ã¢: `Yesterday, my friend wrote: "If you spell incorrectly correctly, you have spelled it incorrectly". To which I answered: "Correct, but 'incorrectly' is incorrectly not '"incorrectly"'"`
+
+////
+
+//// tab | æ
å ±
+
+... ãã ããã³ãŒãã¹ããããå
ã®åŒçšç¬Šã¯ãã®ãŸãŸã«ããŠããå¿
èŠããããŸãã
+
+////
+
+## ã³ãŒãããã㯠{ #code-blocks }
+
+//// tab | ãã¹ã
+
+Bash ã®ã³ãŒãäŸã§ã...
+
+```bash
+# å®å®ã«ãããã€ã衚瀺
+echo "Hello universe"
+```
+
+...ãããŠã³ã³ãœãŒã«ã®ã³ãŒãäŸã§ã...
+
+```console
+$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid">main.py</u>
+<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting server
+ Searching for package file structure
+```
+
+...ããã«å¥ã®ã³ã³ãœãŒã«ã®ã³ãŒãäŸã§ã...
+
+```console
+// ãã£ã¬ã¯ã㪠"code" ãäœæ
+$ mkdir code
+// ãã®ãã£ã¬ã¯ããªã«ç§»å
+$ cd code
+```
+
+...ãã㊠Python ã®ã³ãŒãäŸã§ã...
+
+```Python
+wont_work() # ããã¯åäœããŸãã ð±
+works(foo="bar") # ããã¯åäœããŸã ð
+```
+
+...以äžã§ãã
+
+////
+
+//// tab | æ
å ±
+
+ã³ãŒããããã¯å
ã®ã³ãŒãã¯ãã³ã¡ã³ããé€ãã倿ŽããŠã¯ãããŸããã
+
+`scripts/translate.py` ã® general ããã³ããå
ã### Content of code blocksãã®ç¯ãåç
§ããŠãã ããã
+
+////
+
+## ã¿ããšè²ä»ãããã¯ã¹ { #tabs-and-colored-boxes }
+
+//// tab | ãã¹ã
+
+/// info | æ
å ±
+ããã€ãã®ããã¹ã
+///
+
+/// note | åè
+ããã€ãã®ããã¹ã
+///
+
+/// note | æè¡è©³çް
+ããã€ãã®ããã¹ã
+///
+
+/// check | 確èª
+ããã€ãã®ããã¹ã
+///
+
+/// tip | è±ç¥è
+ããã€ãã®ããã¹ã
+///
+
+/// warning | 泚æ
+ããã€ãã®ããã¹ã
+///
+
+/// danger | èŠå
+ããã€ãã®ããã¹ã
+///
+
+////
+
+//// tab | æ
å ±
+
+ã¿ãããã³ `Info`/`Note`/`Warning` ãªã©ã®ãããã¯ã«ã¯ãã¿ã€ãã«ã®ç¿»èš³ã瞊æ£ïŒ`|`ïŒã®åŸãã«è¿œå ããŸãã
+
+`scripts/translate.py` ã® general ããã³ããå
ã### Special blocksããšã### Tab blocksãã®ç¯ãåç
§ããŠãã ããã
+
+////
+
+## Web ãªã³ã¯ãšå
éšãªã³ã¯ { #web-and-internal-links }
+
+//// tab | ãã¹ã
+
+ãªã³ã¯ã®ããã¹ãã¯ç¿»èš³ãããªã³ã¯å
ã®ã¢ãã¬ã¹ã¯å€æŽããªãã§ãã ãã:
+
+* [äžã®èŠåºããžã®ãªã³ã¯](#code-snippets)
+* [å
éšãªã³ã¯](index.md#installation){.internal-link target=_blank}
+* <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">å€éšãªã³ã¯</a>
+* <a href="https://fastapi.tiangolo.com/css/styles.css" class="external-link" target="_blank">ã¹ã¿ã€ã«ãžã®ãªã³ã¯</a>
+* <a href="https://fastapi.tiangolo.com/js/logic.js" class="external-link" target="_blank">ã¹ã¯ãªãããžã®ãªã³ã¯</a>
+* <a href="https://fastapi.tiangolo.com/img/foo.jpg" class="external-link" target="_blank">ç»åãžã®ãªã³ã¯</a>
+
+ãªã³ã¯ã®ããã¹ãã¯ç¿»èš³ãããªã³ã¯å
ã®ã¢ãã¬ã¹ã¯ç¿»èš³çãæãããã«ããŠãã ãã:
+
+* <a href="https://fastapi.tiangolo.com/ja/" class="external-link" target="_blank">FastAPI ãªã³ã¯</a>
+
+////
+
+//// tab | æ
å ±
+
+ãªã³ã¯ã®ããã¹ãã¯ç¿»èš³ããã¢ãã¬ã¹ã¯å€æŽããªãã§ãã ãããäŸå€ã¯ãFastAPI ããã¥ã¡ã³ãã®ããŒãžãžã®çµ¶å¯Ÿ URL ã§ãããã®å Žåã¯ç¿»èš³çãžã®ãªã³ã¯ã«ããŸãã
+
+`scripts/translate.py` ã® general ããã³ããå
ã### Linksãã®ç¯ãåç
§ããŠãã ããã
+
+////
+
+## HTML "abbr" èŠçŽ { #html-abbr-elements }
+
+//// tab | ãã¹ã
+
+ããã§ã¯ HTML ã® "abbr" èŠçŽ ã§å
ãŸãããã®ãããã€ã瀺ããŸãïŒããã€ãã¯æ¶ç©ºã§ãïŒ:
+
+### abbr ãå®å
šãªèªå¥ã瀺ã { #the-abbr-gives-a-full-phrase }
+
+* <abbr title="Getting Things Done - ä»äºãæãéããããš">GTD</abbr>
+* <abbr title="less than - ããå°ãã"><code>lt</code></abbr>
+* <abbr title="XML Web Token - XML ãŠã§ãããŒã¯ã³">XWT</abbr>
+* <abbr title="Parallel Server Gateway Interface - 䞊åãµãŒããŒã²ãŒããŠã§ã€ã€ã³ã¿ãŒãã§ãŒã¹">PSGI</abbr>
+
+### abbr ãå®å
šãªèªå¥ãšèª¬æã瀺ã { #the-abbr-gives-a-full-phrase-and-an-explanation }
+
+* <abbr title="Mozilla Developer Network - Mozilla éçºè
ãããã¯ãŒã¯: éçºè
åãããã¥ã¡ã³ããFirefox ã®éçºå
ãå·ç">MDN</abbr>
+* <abbr title="Input/Output - å
¥åºå: ãã£ã¹ã¯ã®èªã¿æžãããããã¯ãŒã¯éä¿¡ã">I/O</abbr>.
+
+////
+
+//// tab | æ
å ±
+
+"abbr" èŠçŽ ã® "title" 屿§ã¯ç¹å®ã®æç€ºã«åŸã£ãŠç¿»èš³ããŸãã
+
+翻蚳ã¯ãè±èªã®èªã説æããããã«ç¬èªã® "abbr" èŠçŽ ã远å ããŠããããLLM ã¯ããããåé€ããŠã¯ãããŸããã
+
+`scripts/translate.py` ã® general ããã³ããå
ã### HTML abbr elementsãã®ç¯ãåç
§ããŠãã ããã
+
+////
+
+## HTML "dfn" èŠçŽ { #html-dfn-elements }
+
+* <dfn title="ããæ¹æ³ã§æ¥ç¶ã»é£æºããŠåäœããããæ§æãããè€æ°ã®ãã·ã³ã®éå">ã¯ã©ã¹ã¿ãŒ</dfn>
+* <dfn title="å
¥åå±€ãšåºåå±€ã®éã«å€æ°ã®é ãå±€ãæã€äººå·¥ãã¥ãŒã©ã«ãããã¯ãŒã¯ãçšããæ©æ¢°åŠç¿ã®ææ³ã§ããã®å
éšæ§é ãå
æ¬çã«åœ¢æãã">ãã£ãŒãã©ãŒãã³ã°</dfn>
+
+## èŠåºã { #headings }
+
+//// tab | ãã¹ã
+
+### Web ã¢ããªãéçºãã - ãã¥ãŒããªã¢ã« { #develop-a-webapp-a-tutorial }
+
+ããã«ã¡ã¯ã
+
+### åãã³ããšã¢ãããŒã·ã§ã³ { #type-hints-and-annotations }
+
+ãŸãããã«ã¡ã¯ã
+
+### ã¹ãŒããŒã¯ã©ã¹ãšãµãã¯ã©ã¹ { #super-and-subclasses }
+
+ãŸãããã«ã¡ã¯ã
+
+////
+
+//// tab | æ
å ±
+
+èŠåºãã«é¢ããå¯äžã®å³æ Œãªã«ãŒã«ã¯ããªã³ã¯ãå£ããªãããã«ãLLM ãäžæ¬åŒ§å
ã®ããã·ã¥éšåã倿Žããªãããšã§ãã
+
+`scripts/translate.py` ã® general ããã³ããå
ã### Headingsãã®ç¯ãåç
§ããŠãã ããã
+
+èšèªåºæã®æç€ºã«ã€ããŠã¯ãäŸãšã㊠`docs/de/llm-prompt.md` ã®ã### Headingsãã®ç¯ãåç
§ããŠãã ããã
+
+////
+
+## ããã¥ã¡ã³ãã§äœ¿ãçšèª { #terms-used-in-the-docs }
+
+//// tab | ãã¹ã
+
+* you
+* your
+
+* e.g.
+* etc.
+
+* `foo` ã `int` ãšããŠ
+* `bar` ã `str` ãšããŠ
+* `baz` ã `list` ãšããŠ
+
+* ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã
+* äžçŽãŠãŒã¶ãŒã¬ã€ã
+* SQLModel ããã¥ã¡ã³ã
+* API ããã¥ã¡ã³ã
+* èªåçæããã¥ã¡ã³ã
+
+* ããŒã¿ãµã€ãšã³ã¹
+* ãã£ãŒãã©ãŒãã³ã°
+* æ©æ¢°åŠç¿
+* äŸåæ§æ³šå
¥
+* HTTP Basic èªèšŒ
+* HTTP Digest
+* ISO 圢åŒ
+* JSON Schema èŠæ Œ
+* JSON ã¹ããŒã
+* ã¹ããŒãå®çŸ©
+* Password Flow
+* ã¢ãã€ã«
+
+* éæšå¥š
+* èšèšããã
+* ç¡å¹
+* ãªã³ã¶ãã©ã€
+* æšæº
+* ããã©ã«ã
+* 倧æåå°æåãåºå¥
+* 倧æåå°æåãåºå¥ããªã
+
+* ã¢ããªã±ãŒã·ã§ã³ãæäŸãã
+* ããŒãžãé
ä¿¡ãã
+
+* ã¢ããª
+* ã¢ããªã±ãŒã·ã§ã³
+
+* ãªã¯ãšã¹ã
+* ã¬ã¹ãã³ã¹
+* ãšã©ãŒã¬ã¹ãã³ã¹
+
+* path operation
+* path operation ãã³ã¬ãŒã¿
+* path operation 颿°
+
+* ããã£
+* ãªã¯ãšã¹ãããã£
+* ã¬ã¹ãã³ã¹ããã£
+* JSON ããã£
+* ãã©ãŒã ããã£
+* ãã¡ã€ã«ããã£
+* 颿°æ¬äœ
+
+* ãã©ã¡ãŒã¿
+* ããã£ãã©ã¡ãŒã¿
+* ãã¹ãã©ã¡ãŒã¿
+* ã¯ãšãªãã©ã¡ãŒã¿
+* Cookie ãã©ã¡ãŒã¿
+* ããããŒãã©ã¡ãŒã¿
+* ãã©ãŒã ãã©ã¡ãŒã¿
+* 颿°ãã©ã¡ãŒã¿
+
+* ã€ãã³ã
+* èµ·åã€ãã³ã
+* ãµãŒããŒã®èµ·å
+* ã·ã£ããããŠã³ã€ãã³ã
+* lifespan ã€ãã³ã
+
+* ãã³ãã©
+* ã€ãã³ããã³ãã©
+* äŸå€ãã³ãã©
+* åŠçãã
+
+* ã¢ãã«
+* Pydantic ã¢ãã«
+* ããŒã¿ã¢ãã«
+* ããŒã¿ããŒã¹ã¢ãã«
+* ãã©ãŒã ã¢ãã«
+* ã¢ãã«ãªããžã§ã¯ã
+
+* ã¯ã©ã¹
+* åºåºã¯ã©ã¹
+* 芪ã¯ã©ã¹
+* ãµãã¯ã©ã¹
+* åã¯ã©ã¹
+* å
åŒã¯ã©ã¹
+* ã¯ã©ã¹ã¡ãœãã
+
+* ããããŒ
+* ããããŒïŒè€æ°ïŒ
+* èªå¯ããããŒ
+* `Authorization` ããããŒ
+* Forwarded ããããŒ
+
+* äŸåæ§æ³šå
¥ã·ã¹ãã
+* äŸåé¢ä¿
+* dependable
+* dependant
+
+* I/O ããŠã³ã
+* CPU ããŠã³ã
+* åæå®è¡æ§
+* äžŠåæ§
+* ãã«ãããã»ãã·ã³ã°
+
+* env var
+* ç°å¢å€æ°
+* `PATH`
+* `PATH` ç°å¢å€æ°
+
+* èªèšŒ
+* èªèšŒãããã€ã
+* èªå¯
+* èªå¯ãã©ãŒã
+* èªå¯ãããã€ã
+* ãŠãŒã¶ãŒãèªèšŒãã
+* ã·ã¹ãã ããŠãŒã¶ãŒãèªèšŒãã
+
+* CLI
+* ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ãŒã¹
+
+* ãµãŒããŒ
+* ã¯ã©ã€ã¢ã³ã
+
+* ã¯ã©ãŠããããã€ã
+* ã¯ã©ãŠããµãŒãã¹
+
+* éçº
+* éçºæ®µé
+
+* dict
+* èŸæž
+* åæå
+* Enum
+* åæã¡ã³ããŒ
+
+* ãšã³ã³ãŒããŒ
+* ãã³ãŒããŒ
+* ãšã³ã³ãŒããã
+* ãã³ãŒããã
+
+* äŸå€
+* éåºãã
+
+* åŒ
+* æ
+
+* ããã³ããšã³ã
+* ããã¯ãšã³ã
+
+* GitHub ãã£ã¹ã«ãã·ã§ã³
+* GitHub Issue
+
+* ããã©ãŒãã³ã¹
+* ããã©ãŒãã³ã¹æé©å
+
+* æ»ãå€ã®å
+* æ»ãå€
+
+* ã»ãã¥ãªãã£
+* ã»ãã¥ãªãã£ã¹ããŒã
+
+* ã¿ã¹ã¯
+* ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯
+* ã¿ã¹ã¯é¢æ°
+
+* ãã³ãã¬ãŒã
+* ãã³ãã¬ãŒããšã³ãžã³
+
+* åã¢ãããŒã·ã§ã³
+* åãã³ã
+
+* ãµãŒããŒã¯ãŒã«ãŒ
+* Uvicorn ã¯ãŒã«ãŒ
+* Gunicorn ã¯ãŒã«ãŒ
+* ã¯ãŒã«ãŒããã»ã¹
+* ã¯ãŒã«ãŒã¯ã©ã¹
+* ã¯ãŒã¯ããŒã
+
+* ãããã€
+* ãããã€ãã
+
+* SDK
+* ãœãããŠã§ã¢éçºããã
+
+* `APIRouter`
+* `requirements.txt`
+* Bearer Token
+* ç Žå£ç倿Ž
+* ãã°
+* ãã¿ã³
+* åŒã³åºãå¯èœ
+* ã³ãŒã
+* ã³ããã
+* ã³ã³ããã¹ããããŒãžã£
+* ã³ã«ãŒãã³
+* ããŒã¿ããŒã¹ã»ãã·ã§ã³
+* ãã£ã¹ã¯
+* ãã¡ã€ã³
+* ãšã³ãžã³
+* ãã§ã€ã¯ã® X
+* HTTP GET ã¡ãœãã
+* ã¢ã€ãã
+* ã©ã€ãã©ãª
+* ã©ã€ãã¹ãã³
+* ããã¯
+* ããã«ãŠã§ã¢
+* ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³
+* ã¢ãžã¥ãŒã«
+* ããŠã³ã
+* ãããã¯ãŒã¯
+* ãªãªãžã³
+* ãªãŒããŒã©ã€ã
+* ãã€ããŒã
+* ããã»ããµ
+* ããããã£
+* ãããã·
+* ãã«ãªã¯ãšã¹ã
+* ã¯ãšãª
+* RAM
+* ãªã¢ãŒããã·ã³
+* ã¹ããŒã¿ã¹ã³ãŒã
+* æåå
+* ã¿ã°
+* Web ãã¬ãŒã ã¯ãŒã¯
+* ã¯ã€ã«ãã«ãŒã
+* è¿ã
+* æ€èšŒãã
+
+////
+
+//// tab | æ
å ±
+
+ããã¯ããã¥ã¡ã³ãã§èŠãããïŒäž»ã«ïŒæè¡çšèªã®äžå®å
šãã€èŠç¯çã§ãªãäžèЧã§ããããã³ããèšèšè
ããLLM ãã©ã®çšèªã§æå©ããå¿
èŠãšããŠããããææ¡ããã®ã«åœ¹ç«ã€ãããããŸãããäŸãã°ãè¯ã翻蚳ãæé©ã§ãªãç¿»èš³ã«æ»ããŠããŸãå Žåããããªãã®èšèªã§ã®æŽ»çšã»æ Œå€åã«åé¡ãããå Žåãªã©ã§ãã
+
+`docs/de/llm-prompt.md` ã®ã### List of English terms and their preferred German translationsãã®ç¯ãåç
§ããŠãã ããã
+
+////
--- /dev/null
+# æŠèŠ { #about }
+
+FastAPI ã®æŠèŠããã®èšèšãã€ã³ã¹ãã¬ãŒã·ã§ã³ãªã©ã«ã€ããŠè§£èª¬ããŸããð€
--- /dev/null
+# OpenAPI ã®è¿œå ã¬ã¹ãã³ã¹ { #additional-responses-in-openapi }
+
+/// warning | 泚æ
+
+ããã¯æ¯èŒçé«åºŠãªãããã¯ã§ãã
+
+FastAPI ã䜿ãå§ããã°ããã§ããã°ãããã¯äžèŠãããããŸããã
+
+///
+
+远å ã®ã¹ããŒã¿ã¹ã³ãŒããã¡ãã£ã¢ã¿ã€ãã説æãªã©ã䌎ã远å ã¬ã¹ãã³ã¹ã宣èšã§ããŸãã
+
+ãããã®è¿œå ã¬ã¹ãã³ã¹ã¯ OpenAPI ã¹ããŒãã«å«ãŸããAPI ããã¥ã¡ã³ãã«ã衚瀺ãããŸãã
+
+ãã ãããããã®è¿œå ã¬ã¹ãã³ã¹ã«ã€ããŠã¯ãã¹ããŒã¿ã¹ã³ãŒããšã³ã³ãã³ããæå®ã㊠`JSONResponse` ãªã©ã® `Response` ãçŽæ¥è¿ãå¿
èŠããããŸãã
+
+## `model` ã䜿ã£ã远å ã¬ã¹ãã³ã¹ { #additional-response-with-model }
+
+*path operation ãã³ã¬ãŒã¿*ã« `responses` ãã©ã¡ãŒã¿ãæž¡ããŸãã
+
+ãã㯠`dict` ãåãåããããŒã¯åã¬ã¹ãã³ã¹ã®ã¹ããŒã¿ã¹ã³ãŒãïŒäŸ: `200`ïŒãå€ã¯åã¬ã¹ãã³ã¹ã®æ
å ±ãå«ãå¥ã® `dict` ã§ãã
+
+ããããã®ã¬ã¹ãã³ã¹ `dict` ã«ã¯ã`response_model` ãšåæ§ã« Pydantic ã¢ãã«ãæ ŒçŽãã `model` ããŒãå«ããããŸãã
+
+FastAPI ã¯ãã®ã¢ãã«ãã JSON Schema ãçæããOpenAPI ã®é©åãªå Žæã«å«ããŸãã
+
+äŸãã°ãã¹ããŒã¿ã¹ã³ãŒã `404` ãš Pydantic ã¢ãã« `Message` ãæã€å¥ã®ã¬ã¹ãã³ã¹ã宣èšããã«ã¯ã次ã®ããã«æžããŸã:
+
+{* ../../docs_src/additional_responses/tutorial001_py310.py hl[18,22] *}
+
+/// note | åè
+
+`JSONResponse` ãçŽæ¥è¿ãå¿
èŠãããç¹ã«æ³šæããŠãã ããã
+
+///
+
+/// info | æ
å ±
+
+`model` ããŒã¯ OpenAPI ã®äžéšã§ã¯ãããŸããã
+
+FastAPI ã¯ãããã Pydantic ã¢ãã«ãååŸã㊠JSON Schema ãçæããé©åãªå Žæã«é
眮ããŸãã
+
+é©åãªå Žæã¯æ¬¡ã®ãšããã§ã:
+
+- `content` ããŒã®äžãããã¯å€ãšããŠå¥ã® JSON ãªããžã§ã¯ãïŒ`dict`ïŒãæã¡ããã®äžã«æ¬¡ãå«ãŸããŸã:
+ - ã¡ãã£ã¢ã¿ã€ãïŒäŸ: `application/json`ïŒãããŒãšããå€ãšããŠããã«å¥ã® JSON ãªããžã§ã¯ããæã¡ããã®äžã«æ¬¡ãå«ãŸããŸã:
+ - `schema` ããŒãå€ãšããŠã¢ãã«ç±æ¥ã® JSON Schema ãæã¡ããããæ£ããé
çœ®å Žæã§ãã
+ - FastAPI ã¯ããã«ãã¹ããŒããçŽæ¥åã蟌ã代ããã« OpenAPI å
ã®ã°ããŒãã«ãª JSON Schema ãžã®åç
§ã远å ããŸããããã«ãããä»ã®ã¢ããªã±ãŒã·ã§ã³ãã¯ã©ã€ã¢ã³ãããããã® JSON Schema ãçŽæ¥å©çšããããè¯ãã³ãŒãçæããŒã«çãæäŸã§ããŸãã
+
+///
+
+ãã® *path operation* ã®ããã« OpenAPI ã«çæãããã¬ã¹ãã³ã¹ã¯æ¬¡ã®ãšããã§ã:
+
+```JSON hl_lines="3-12"
+{
+ "responses": {
+ "404": {
+ "description": "Additional Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Message"
+ }
+ }
+ }
+ },
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/Item"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation Error",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+ã¹ããŒã㯠OpenAPI ã¹ããŒãå
ã®å¥ã®å Žæãžã®åç
§ã«ãªããŸã:
+
+```JSON hl_lines="4-16"
+{
+ "components": {
+ "schemas": {
+ "Message": {
+ "title": "Message",
+ "required": [
+ "message"
+ ],
+ "type": "object",
+ "properties": {
+ "message": {
+ "title": "Message",
+ "type": "string"
+ }
+ }
+ },
+ "Item": {
+ "title": "Item",
+ "required": [
+ "id",
+ "value"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "title": "Id",
+ "type": "string"
+ },
+ "value": {
+ "title": "Value",
+ "type": "string"
+ }
+ }
+ },
+ "ValidationError": {
+ "title": "ValidationError",
+ "required": [
+ "loc",
+ "msg",
+ "type"
+ ],
+ "type": "object",
+ "properties": {
+ "loc": {
+ "title": "Location",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "msg": {
+ "title": "Message",
+ "type": "string"
+ },
+ "type": {
+ "title": "Error Type",
+ "type": "string"
+ }
+ }
+ },
+ "HTTPValidationError": {
+ "title": "HTTPValidationError",
+ "type": "object",
+ "properties": {
+ "detail": {
+ "title": "Detail",
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ValidationError"
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+## ã¡ã€ã³ã®ã¬ã¹ãã³ã¹ã«è¿œå ã®ã¡ãã£ã¢ã¿ã€ã { #additional-media-types-for-the-main-response }
+
+åã `responses` ãã©ã¡ãŒã¿ã䜿ã£ãŠãåäžã®ã¡ã€ã³ã¬ã¹ãã³ã¹ã«å¥ã®ã¡ãã£ã¢ã¿ã€ãã远å ã§ããŸãã
+
+äŸãã°ã`image/png` ã®è¿œå ã¡ãã£ã¢ã¿ã€ããå ããããªãã® *path operation* ã JSON ãªããžã§ã¯ãïŒã¡ãã£ã¢ã¿ã€ã `application/json`ïŒãŸã㯠PNG ç»åãè¿ããããšã宣èšã§ããŸã:
+
+{* ../../docs_src/additional_responses/tutorial002_py310.py hl[17:22,26] *}
+
+/// note | åè
+
+ç»å㯠`FileResponse` ã䜿ã£ãŠçŽæ¥è¿ãå¿
èŠãããç¹ã«æ³šæããŠãã ããã
+
+///
+
+/// info | æ
å ±
+
+`responses` ãã©ã¡ãŒã¿ã§æç€ºçã«å¥ã®ã¡ãã£ã¢ã¿ã€ããæå®ããªãéããFastAPI ã¯ã¬ã¹ãã³ã¹ãã¡ã€ã³ã®ã¬ã¹ãã³ã¹ã¯ã©ã¹ãšåãã¡ãã£ã¢ã¿ã€ãïŒããã©ã«ã㯠`application/json`ïŒã§ãããšã¿ãªããŸãã
+
+ãã ããã¡ãã£ã¢ã¿ã€ãã `None` ã®ã«ã¹ã¿ã ã¬ã¹ãã³ã¹ã¯ã©ã¹ãæå®ããŠããå Žåãã¢ãã«ãé¢é£ä»ãããã远å ã¬ã¹ãã³ã¹ã«ã¯ FastAPI 㯠`application/json` ã䜿çšããŸãã
+
+///
+
+## æ
å ±ã®çµå { #combining-information }
+
+`response_model`ã`status_code`ã`responses` ãã©ã¡ãŒã¿ãªã©ãè€æ°ã®å Žæããã®ã¬ã¹ãã³ã¹æ
å ±ãçµã¿åãããããšãã§ããŸãã
+
+`response_model` ã宣èšããããã©ã«ãã®ã¹ããŒã¿ã¹ã³ãŒã `200`ïŒå¿
èŠãªãä»»æã®ã³ãŒãïŒã䜿ãããã®åãã¬ã¹ãã³ã¹ã«å¯Ÿããè¿œå æ
å ±ã `responses` ã§ OpenAPI ã¹ããŒãã«çŽæ¥èšè¿°ã§ããŸãã
+
+FastAPI 㯠`responses` ã«ããè¿œå æ
å ±ãä¿æããã¢ãã«ã® JSON Schema ãšçµåããŸãã
+
+äŸãã°ãPydantic ã¢ãã«ãçšããç¬èªã® `description` ãæã€ã¹ããŒã¿ã¹ã³ãŒã `404` ã®ã¬ã¹ãã³ã¹ã宣èšã§ããŸãã
+
+ããã«ã`response_model` ã䜿ãã¹ããŒã¿ã¹ã³ãŒã `200` ã®ã¬ã¹ãã³ã¹ã«ç¬èªã® `example` ãå«ããããšãã§ããŸã:
+
+{* ../../docs_src/additional_responses/tutorial003_py310.py hl[20:31] *}
+
+ãããã¯ãã¹ãŠçµåãã㊠OpenAPI ã«å«ãŸããAPI ããã¥ã¡ã³ãã«è¡šç€ºãããŸã:
+
+<img src="/img/tutorial/additional-responses/image01.png">
+
+## äºåå®çŸ©ã¬ã¹ãã³ã¹ãšã«ã¹ã¿ã ã®çµã¿åãã { #combine-predefined-responses-and-custom-ones }
+
+å€ãã® *path operations* ã«é©çšã§ããäºåå®çŸ©ã®ã¬ã¹ãã³ã¹ãçšæãã€ã€ãå *path operation* ããšã«å¿
èŠãªã«ã¹ã¿ã ã¬ã¹ãã³ã¹ãšçµã¿åããããå ŽåããããŸãã
+
+ãã®ãããªå ŽåãPython ã® `**dict_to_unpack` ã«ãã `dict` ã®ãã¢ã³ããã¯ããã¯ããã¯ã䜿ããŸã:
+
+```Python
+old_dict = {
+ "old key": "old value",
+ "second old key": "second old value",
+}
+new_dict = {**old_dict, "new key": "new value"}
+```
+
+ããã§ã¯ã`new_dict` ã«ã¯ `old_dict` ã®ãã¹ãŠã®ããŒãšå€ã«å ããæ°ããããŒãšå€ãå«ãŸããŸã:
+
+```Python
+{
+ "old key": "old value",
+ "second old key": "second old value",
+ "new key": "new value",
+}
+```
+
+ãã®ãã¯ããã¯ã䜿ããšã*path operations* ã§äºåå®çŸ©ã¬ã¹ãã³ã¹ãåå©çšããããã«ã«ã¹ã¿ã ã®ã¬ã¹ãã³ã¹ãçµã¿åãããããŸãã
+
+äŸãã°:
+
+{* ../../docs_src/additional_responses/tutorial004_py310.py hl[11:15,24] *}
+
+## OpenAPI ã¬ã¹ãã³ã¹ã®è©³çް { #more-information-about-openapi-responses }
+
+ã¬ã¹ãã³ã¹ã«æ£ç¢ºã«äœãå«ãããããã¯ãOpenAPI 仿§ã®æ¬¡ã®ã»ã¯ã·ã§ã³ãåç
§ããŠãã ãã:
+
+- <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responses-object" class="external-link" target="_blank">OpenAPI ã® Responses Object</a>ãããã«ã¯ `Response Object` ãå«ãŸããŸãã
+- <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#response-object" class="external-link" target="_blank">OpenAPI ã® Response Object</a>ã`responses` ãã©ã¡ãŒã¿å
ã®åã¬ã¹ãã³ã¹ã«ãããã§å®çŸ©ãããŠããèŠçŽ ãçŽæ¥å«ããããŸãã`description`ã`headers`ã`content`ïŒããã§ç°ãªãã¡ãã£ã¢ã¿ã€ãã JSON Schema ã宣èšããŸãïŒã`links` ãªã©ã
{* ../../docs_src/additional_status_codes/tutorial001_an_py310.py hl[4,25] *}
-/// warning | 泚æ
+/// warning
äžã®äŸã®ããã« `Response` ãçŽæ¥è¿ããšãããã¯ãã®ãŸãŸè¿ãããŸãã
远å ã®ã¹ããŒã¿ã¹ã³ãŒããšã¬ã¹ãã³ã¹ãçŽæ¥è¿ãå Žåãããã㯠OpenAPI ã¹ããŒãïŒAPI ããã¥ã¡ã³ãïŒã«ã¯å«ãŸããŸãããFastAPI ã«ã¯ãäºåã«äœãè¿ãããããç¥ãæ¹æ³ããªãããã§ãã
-ãããã[Additional Responses](additional-responses.md){.internal-link target=_blank} ã䜿ã£ãŠã³ãŒãå
ã«ããã¥ã¡ã³ãåã§ããŸãã
+ãããã[远å ã®ã¬ã¹ãã³ã¹](additional-responses.md){.internal-link target=_blank} ã䜿ã£ãŠã³ãŒãå
ã«ããã¥ã¡ã³ãåã§ããŸãã
--- /dev/null
+# é«åºŠãªäŸåé¢ä¿ { #advanced-dependencies }
+
+## ãã©ã¡ãŒã¿åãããäŸåé¢ä¿ { #parameterized-dependencies }
+
+ãããŸã§èŠãŠããäŸåé¢ä¿ã¯ãåºå®ã®é¢æ°ãŸãã¯ã¯ã©ã¹ã§ããã
+
+ããããå€ãã®ç°ãªã颿°ãã¯ã©ã¹ã宣èšããã«ããã®äŸåé¢ä¿ã«ãã©ã¡ãŒã¿ãèšå®ãããå ŽåããããŸãã
+
+ããšãã°ãã¯ãšãªãã©ã¡ãŒã¿ `q` ã«ãããåºå®ã®å
容ãå«ãŸããŠããããæ€æ»ããäŸåé¢ä¿ã欲ãããšããŸãã
+
+ãã ãããã®åºå®ã®å
容ã¯ãã©ã¡ãŒã¿åã§ããããã«ãããã§ãã
+
+## "callable" ãªã€ã³ã¹ã¿ã³ã¹ { #a-callable-instance }
+
+Python ã«ã¯ãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã "callable" ã«ããæ¹æ³ããããŸãã
+
+ã¯ã©ã¹èªäœïŒããã¯ãã§ã« callable ã§ãïŒã§ã¯ãªãããã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§ãã
+
+ãã®ããã«ã¯ã`__call__` ã¡ãœããã宣èšããŸã:
+
+{* ../../docs_src/dependencies/tutorial011_an_py310.py hl[12] *}
+
+ãã®å Žåããã® `__call__` ãã**FastAPI** ã远å ã®ãã©ã¡ãŒã¿ããµãäŸåé¢ä¿ã確èªããããã«äœ¿ããã®ã«ãªããåŸã§ããªãã® *path operation 颿°* ã®ãã©ã¡ãŒã¿ã«å€ãæž¡ãããã«åŒã³åºããããã®ã«ãªããŸãã
+
+## ã€ã³ã¹ã¿ã³ã¹ã®ãã©ã¡ãŒã¿å { #parameterize-the-instance }
+
+ãããŠã`__init__` ã䜿ã£ãŠãäŸåé¢ä¿ãããã©ã¡ãŒã¿åãããããã«å©çšã§ããã€ã³ã¹ã¿ã³ã¹ã®ãã©ã¡ãŒã¿ã宣èšã§ããŸã:
+
+{* ../../docs_src/dependencies/tutorial011_an_py310.py hl[9] *}
+
+ãã®å Žåã**FastAPI** 㯠`__init__` ã«è§Šãããæ°ã«ããããããããšã¯ãããŸãããç§ãã¡ãã³ãŒãå
ã§çŽæ¥äœ¿ããŸãã
+
+## ã€ã³ã¹ã¿ã³ã¹ã®äœæ { #create-an-instance }
+
+ãã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯æ¬¡ã®ããã«äœæã§ããŸã:
+
+{* ../../docs_src/dependencies/tutorial011_an_py310.py hl[18] *}
+
+ãã®ããã«ããŠäŸåé¢ä¿ãããã©ã¡ãŒã¿åãã§ããŸããããŸã `"bar"` ã屿§ `checker.fixed_content` ãšããŠäžã«ä¿æãããŠããŸãã
+
+## ã€ã³ã¹ã¿ã³ã¹ãäŸåé¢ä¿ãšããŠäœ¿ã { #use-the-instance-as-a-dependency }
+
+ãã®åŸã`Depends(FixedContentQueryChecker)` ã®ä»£ããã« `Depends(checker)` ã§ãã® `checker` ã䜿ããŸããäŸåé¢ä¿ã¯ã¯ã©ã¹ãã®ãã®ã§ã¯ãªããã€ã³ã¹ã¿ã³ã¹ã§ãã `checker` ã ããã§ãã
+
+äŸåé¢ä¿ã解決ãããšãã**FastAPI** ã¯ãã® `checker` ãæ¬¡ã®ããã«åŒã³åºããŸã:
+
+```Python
+checker(q="somequery")
+```
+
+...ãããŠããã®æ»ãå€ã *path operation 颿°* å
ã®äŸåé¢ä¿ã®å€ãšããŠããã©ã¡ãŒã¿ `fixed_content_included` ã«æž¡ããŸã:
+
+{* ../../docs_src/dependencies/tutorial011_an_py310.py hl[22] *}
+
+/// tip | è±ç¥è
+
+ãããŸã§ã®å
容ã¯åããã©ãæãããããããããŸããããŸã ã©ã®ããã«åœ¹ç«ã€ããæç¢ºã§ãªããããããŸããã
+
+ãããã®äŸã¯æå³çã«åçŽã§ãããä»çµã¿ã瀺ããŠããŸãã
+
+ã»ãã¥ãªãã£ã®ç« ã§ã¯ãåãããæ¹ã§å®è£
ããããŠãŒãã£ãªãã£é¢æ°ããããŸãã
+
+ãããŸã§ãçè§£ã§ããŠããã°ãããããã»ãã¥ãªãã£çšãŠãŒãã£ãªãã£ãå
éšã§ã©ã®ããã«åããŠããããçè§£ã§ããŠããŸãã
+
+///
+
+## `yield`ã`HTTPException`ã`except` ãšããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã䌎ãäŸåé¢ä¿ { #dependencies-with-yield-httpexception-except-and-background-tasks }
+
+/// warning | 泚æ
+
+ãããã®æè¡ç詳现ã¯ãã»ãšãã©ã®å Žåã¯äžèŠã§ãã
+
+äž»ã«ã0.121.0 ããåã® FastAPI ã¢ããªã±ãŒã·ã§ã³ãããã`yield` ã䜿ãäŸåé¢ä¿ã§åé¡ãçºçããŠããå Žåã«æçšã§ãã
+
+///
+
+`yield` ã䜿ãäŸåé¢ä¿ã¯ãããŸããŸãªãŠãŒã¹ã±ãŒã¹ã«å¯Ÿå¿ããããã€ãã®åé¡ãä¿®æ£ããããã«æéãšãšãã«é²åããŠããŸãããããã§ã¯å€æŽç¹ã®æŠèŠã説æããŸãã
+
+### `yield` ãš `scope` ã䌎ãäŸåé¢ä¿ { #dependencies-with-yield-and-scope }
+
+ããŒãžã§ã³ 0.121.0 ã§ã`yield` ã䜿ãäŸåé¢ä¿ã«å¯Ÿã㊠`Depends(scope="function")` ããµããŒããããŸããã
+
+`Depends(scope="function")` ã䜿ããšã`yield` ã®åŸã®çµäºã³ãŒãã¯ãã¯ã©ã€ã¢ã³ããžã¬ã¹ãã³ã¹ãè¿ãããåã*path operation 颿°* ãçµäºããçŽåŸã«å®è¡ãããŸãã
+
+ãããŠã`Depends(scope="request")`ïŒããã©ã«ãïŒã䜿ãå Žåã`yield` ã®åŸã®çµäºã³ãŒãã¯ã¬ã¹ãã³ã¹éä¿¡åŸã«å®è¡ãããŸãã
+
+詳ããã¯ããã¥ã¡ã³ãã[`yield` ã䜿ãäŸåé¢ä¿ - æ©æçµäºãš `scope`](../tutorial/dependencies/dependencies-with-yield.md#early-exit-and-scope)ããåç
§ããŠãã ããã
+
+### `yield` ãš `StreamingResponse` ã䌎ãäŸåé¢ä¿ãæè¡è©³çް { #dependencies-with-yield-and-streamingresponse-technical-details }
+
+FastAPI 0.118.0 ããåã§ã¯ã`yield` ã䜿ãäŸåé¢ä¿ã䜿çšãããšã*path operation 颿°* ãæ»ã£ãŠããã¬ã¹ãã³ã¹éä¿¡çŽåã«çµäºã³ãŒããå®è¡ãããŠããŸããã
+
+ããã¯ãã¬ã¹ãã³ã¹ããããã¯ãŒã¯äžãç§»åããã®ãåŸ
ã£ãŠããéã«ãäžèŠã«ãªãœãŒã¹ãä¿æããªãããã«ããæå³ã§ããã
+
+ãã®å€æŽã«ããã`StreamingResponse` ãè¿ãå Žåã`yield` ãæã€äŸåé¢ä¿ã®çµäºã³ãŒãã¯ãã§ã«å®è¡ãããŠããããšã«ãªããŸããã
+
+ããšãã°ã`yield` ãæã€äŸåé¢ä¿ã®äžã§ããŒã¿ããŒã¹ã»ãã·ã§ã³ãæã£ãŠããå Žåã`StreamingResponse` ã¯ããŒã¿ãã¹ããªãŒãã³ã°ããŠããéã«ãã®ã»ãã·ã§ã³ã䜿ããŸããããšããã®ãã`yield` ã®åŸã®çµäºã³ãŒãã§ãã®ã»ãã·ã§ã³ããã§ã«ã¯ããŒãºãããŠããããã§ãã
+
+ãã®æå㯠0.118.0 ã§å
ã«æ»ããã`yield` ã®åŸã®çµäºã³ãŒãã¯ã¬ã¹ãã³ã¹éä¿¡åŸã«å®è¡ãããããã«ãªããŸããã
+
+/// info | æ
å ±
+
+以äžã§èŠãããã«ãããã¯ããŒãžã§ã³ 0.106.0 ããåã®æåãšãšãŠã䌌ãŠããŸãããããã€ãã®ã³ãŒããŒã±ãŒã¹ã«å¯Ÿããæ¹è¯ãšãã°ä¿®æ£ãå«ãŸããŠããŸãã
+
+///
+
+#### æ©æçµäºã³ãŒãã®ãŠãŒã¹ã±ãŒã¹ { #use-cases-with-early-exit-code }
+
+ç¹å®ã®æ¡ä»¶ã§ã¯ãã¬ã¹ãã³ã¹éä¿¡åã« `yield` ãæã€äŸåé¢ä¿ã®çµäºã³ãŒããå®è¡ãããå€ãæåã®æ©æµãåãããããŠãŒã¹ã±ãŒã¹ããããŸãã
+
+äŸãã°ã`yield` ãæã€äŸåé¢ä¿ã§ããŒã¿ããŒã¹ã»ãã·ã§ã³ã䜿ã£ãŠãŠãŒã¶æ€èšŒã ããè¡ãããã®åŸã¯ *path operation 颿°* å
ã§ã¯ãã®ããŒã¿ããŒã¹ã»ãã·ã§ã³ãäžå䜿ããªãããã€ã¬ã¹ãã³ã¹éä¿¡ã«é·ãæéããããïŒäŸãã°ããŒã¿ããã£ããéã `StreamingResponse`ïŒããäœããã®çç±ã§ããŒã¿ããŒã¹ã¯äœ¿ããªãããšããã±ãŒã¹ã§ãã
+
+ãã®å Žåãã¬ã¹ãã³ã¹ã®éä¿¡ãçµãããŸã§ããŒã¿ããŒã¹ã»ãã·ã§ã³ãä¿æãããŸããã䜿ããªãã®ã§ããã°ä¿æããå¿
èŠã¯ãããŸããã
+
+次ã®ããã«ãªããŸã:
+
+{* ../../docs_src/dependencies/tutorial013_an_py310.py *}
+
+çµäºã³ãŒããããªãã¡ `Session` ã®èªåã¯ããŒãºã¯:
+
+{* ../../docs_src/dependencies/tutorial013_an_py310.py ln[19:21] *}
+
+...ã®éšåã§å®çŸ©ãããŠãããé
ãããŒã¿éä¿¡ãçµãã£ãåŸã«å®è¡ãããŸã:
+
+{* ../../docs_src/dependencies/tutorial013_an_py310.py ln[30:38] hl[31:33] *}
+
+ãããã`generate_stream()` ã¯ããŒã¿ããŒã¹ã»ãã·ã§ã³ã䜿ããªããããã¬ã¹ãã³ã¹éä¿¡äžã«ã»ãã·ã§ã³ãéãããŸãŸã«ããŠããå¿
èŠã¯å®éã«ã¯ãããŸããã
+
+SQLModelïŒãŸã㯠SQLAlchemyïŒã§ãã®ç¹å®ã®ãŠãŒã¹ã±ãŒã¹ãããå Žåã¯ãäžèŠã«ãªã£ãæç¹ã§ã»ãã·ã§ã³ãæç€ºçã«ã¯ããŒãºã§ããŸã:
+
+{* ../../docs_src/dependencies/tutorial014_an_py310.py ln[24:28] hl[28] *}
+
+ãã®ããã«ãããšãã»ãã·ã§ã³ã¯ããŒã¿ããŒã¹æ¥ç¶ãè§£æŸãããããä»ã®ãªã¯ãšã¹ããããã䜿ããããã«ãªããŸãã
+
+`yield` ãæã€äŸåé¢ä¿ã§æ©æçµäºãå¿
èŠãªå¥ã®ãŠãŒã¹ã±ãŒã¹ãããå Žåã¯ãããªãã®å
·äœçãªãŠãŒã¹ã±ãŒã¹ãšããªã `yield` ãæã€äŸåé¢ä¿ã®æ©æã¯ããŒãºãæçãã説æããŠã<a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">GitHub Discussion ã®è³ªå</a>ãäœæããŠãã ããã
+
+`yield` ãæã€äŸåé¢ä¿ã®æ©æã¯ããŒãºã«çŽåŸã§ãããŠãŒã¹ã±ãŒã¹ãããå Žåã¯ãæ©æã¯ããŒãºã«ãªããã€ã³ããæ°ããæ¹æ³ã远å ããããšãæ€èšããŸãã
+
+### `yield` ãš `except` ã䌎ãäŸåé¢ä¿ãæè¡è©³çް { #dependencies-with-yield-and-except-technical-details }
+
+FastAPI 0.110.0 ããåã§ã¯ã`yield` ãæã€äŸåé¢ä¿ã䜿ãããã®äŸåé¢ä¿å
ã§ `except` ã«ãã£ãŠäŸå€ãææããå床ãã®äŸå€ãéåºããªãã£ãå Žåã§ãããã®äŸå€ã¯èªåçã«éåºïŒãã©ã¯ãŒãïŒãããä»»æã®äŸå€ãã³ãã©ãŸãã¯å
éšãµãŒããšã©ãŒãã³ãã©ã«æž¡ãããŠããŸããã
+
+ããã¯ããã³ãã©ã®ãªããã©ã¯ãŒããããäŸå€ïŒå
éšãµãŒããšã©ãŒïŒã«ããæªåŠçã®ã¡ã¢ãªæ¶è²»ãä¿®æ£ããéåžžã® Python ã³ãŒãã®æåãšäžè²«æ§ãæããããããããŒãžã§ã³ 0.110.0 ã§å€æŽãããŸããã
+
+### ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ãš `yield` ã䌎ãäŸåé¢ä¿ãæè¡è©³çް { #background-tasks-and-dependencies-with-yield-technical-details }
+
+FastAPI 0.106.0 ããåã§ã¯ã`yield` ã®åŸã§äŸå€ãéåºããããšã¯ã§ããŸããã§ããã`yield` ãæã€äŸåé¢ä¿ã®çµäºã³ãŒãã¯ã¬ã¹ãã³ã¹éä¿¡ãåŸãã«å®è¡ãããããã[äŸå€ãã³ãã©](../tutorial/handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank} ã¯ãã§ã«å®è¡æžã¿ã§ããã
+
+ããã¯äž»ã«ãäŸåé¢ä¿ã "yield" ããåããªããžã§ã¯ããããã¯ã°ã©ãŠã³ãã¿ã¹ã¯å
ã§å©çšã§ããããã«ããããã®èšèšã§ãããçµäºã³ãŒãã¯ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯å®äºåŸã«å®è¡ãããããã§ãã
+
+ããã¯ãã¬ã¹ãã³ã¹ããããã¯ãŒã¯äžãç§»åããã®ãåŸ
ã£ãŠããéã«ãªãœãŒã¹ãä¿æããªãããã«ããæå³ã§ãFastAPI 0.106.0 ã§å€æŽãããŸããã
+
+/// tip | è±ç¥è
+
+å ããŠãããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã¯éåžžãç¬ç«ããããžãã¯ã®éåã§ãããïŒäŸãã°å°çšã®ããŒã¿ããŒã¹æ¥ç¶ãªã©ïŒããèªèº«ã®ãªãœãŒã¹ã§åå¥ã«æ±ãã¹ãã§ãã
+
+ãã®ããããã®ããæ¹ã®æ¹ãã³ãŒãã¯ããããããã¯ãªãŒã³ã«ãªããŸãã
+
+///
+
+ãã®æåã«äŸåããŠããå Žåã¯ãããã¯ã°ã©ãŠã³ãã¿ã¹ã¯çšã®ãªãœãŒã¹ãããã¯ã°ã©ãŠã³ãã¿ã¹ã¯å
éšã§äœæãã`yield` ãæã€äŸåé¢ä¿ã®ãªãœãŒã¹ã«äŸåããªãããŒã¿ã ããå
éšã§äœ¿çšããããã«ããŠãã ããã
+
+äŸãã°ãåãããŒã¿ããŒã¹ã»ãã·ã§ã³ã䜿ãã®ã§ã¯ãªããããã¯ã°ã©ãŠã³ãã¿ã¹ã¯å
ã§æ°ããããŒã¿ããŒã¹ã»ãã·ã§ã³ãäœæãããã®æ°ããã»ãã·ã§ã³ã§ããŒã¿ããŒã¹ãããªããžã§ã¯ããååŸããŸãããããŠãããã¯ã°ã©ãŠã³ãã¿ã¹ã¯é¢æ°ã®åŒæ°ãšããŠããŒã¿ããŒã¹ã®ãªããžã§ã¯ãèªäœãæž¡ãã®ã§ã¯ãªãããã®ãªããžã§ã¯ãã® ID ãæž¡ããããã¯ã°ã©ãŠã³ãã¿ã¹ã¯é¢æ°å
ã§ããäžåºŠãã®ãªããžã§ã¯ããååŸããŸãã
--- /dev/null
+# é«åºŠãª Python ã®å { #advanced-python-types }
+
+Python ã®åãæ±ããšãã«åœ¹ç«ã€è¿œå ã®ã¢ã€ãã¢ãããã€ã玹ä»ããŸãã
+
+## `Union` ãŸã㯠`Optional` ã®å©çš { #using-union-or-optional }
+
+äœããã®çç±ã§ `|` ã䜿ããªãå Žåãããšãã°åã¢ãããŒã·ã§ã³ã§ã¯ãªã `response_model=` ã®ãããªå Žæã§ã¯ã瞊æ£ïŒ`|`ïŒã®ä»£ããã« `typing` ã® `Union` ã䜿ããŸãã
+
+äŸãã°ã`str` ãŸã㯠`None` ã«ãªãåŸãããšã宣èšã§ããŸã:
+
+```python
+from typing import Union
+
+
+def say_hi(name: Union[str, None]):
+ print(f"Hi {name}!")
+```
+
+`typing` ã«ã¯ã`None` ãåãåŸãããšã宣èšããããã®ç瞮圢ãšã㊠`Optional` ããããŸãã
+
+ããããã¯ç§ã®ãšãŠã䞻芳çãªææ¡ã§ã:
+
+- ðš `Optional[SomeType]` ã®äœ¿çšã¯é¿ããŸããã
+- 代ããã« âš **`Union[SomeType, None]` ã䜿ããŸããã** âšã
+
+ã©ã¡ããç䟡ã§å
éšçã«ã¯åäžã§ããããoptionalïŒä»»æïŒããšããèªãå€ãä»»æã ãšèª€è§£ããããããå®éã®æå³ã¯ã`None` ãåãåŸããã§ãããä»»æã§ã¯ãªãäŸç¶ãšããŠå¿
é ã§ããå Žåã§ãããã§ãããã®ãã `Optional` ãã `Union` ãå§ããŸãã
+
+`Union[SomeType, None]` ã®æ¹ãæå³ãããæç¢ºã ãšæããŸãã
+
+ããã¯çšèªãååä»ãã®è©±ã«éããŸãããããã®èšèãããªããããŒã ã¡ã€ãã®ã³ãŒãã®æãæ¹ã«åœ±é¿ããŸãã
+
+äŸãšããŠæ¬¡ã®é¢æ°ãèŠãŠã¿ãŸããã:
+
+```python
+from typing import Optional
+
+
+def say_hi(name: Optional[str]):
+ print(f"Hey {name}!")
+```
+
+ãã©ã¡ãŒã¿ `name` 㯠`Optional[str]` ãšå®çŸ©ãããŠããŸãããä»»æã§ã¯ãããŸããããã®ãã©ã¡ãŒã¿ãªãã§é¢æ°ãåŒã³åºãããšã¯ã§ããŸãã:
+
+```Python
+say_hi() # ãã£ãããã¯ãšã©ãŒã«ãªããŸãïŒð±
+```
+
+`name` ãã©ã¡ãŒã¿ã«ã¯ããã©ã«ãå€ããªããããäŸç¶ãšããŠå¿
é ïŒä»»æã§ã¯ãªãïŒã§ãããã ãã`name` ã¯å€ãšã㊠`None` ãåãä»ããŸã:
+
+```Python
+say_hi(name=None) # ããã¯åäœããŸããNone ã¯æå¹ã§ã ð
+```
+
+æå ±ãšããŠãå€ãã®å Žåã¯åçŽã« `|` ã䜿ã£ãŠåã® Union ãå®çŸ©ã§ããŸã:
+
+```python
+def say_hi(name: str | None):
+ print(f"Hey {name}!")
+```
+
+ãããã£ãŠãé垞㯠`Optional` ã `Union` ãšãã£ãååãæ°ã«ããå¿
èŠã¯ãããŸãããð
--- /dev/null
+# éåæãã¹ã { #async-tests }
+
+ãããŸã§ã«ãæäŸãããŠãã `TestClient` ã䜿ã£ãŠ **FastAPI** ã¢ããªã±ãŒã·ã§ã³ããã¹ãããæ¹æ³ãèŠãŠããŸããããããŸã§ã¯ã`async` 颿°ã䜿ããªãåæãã¹ãã®ã¿ã§ããã
+
+ãã¹ãã§éåæé¢æ°ã䜿ãããšãããšãã°ããŒã¿ããŒã¹ãžéåæã«ã¯ãšãªããå Žåãªã©ã«äŸ¿å©ã§ããéåæããŒã¿ããŒã¹ã©ã€ãã©ãªã䜿ããªãããFastAPI ã¢ããªã«ãªã¯ãšã¹ããéãããã®åŸããã¯ãšã³ããæ£ããããŒã¿ãããŒã¿ããŒã¹ã«æžã蟌ããããæ€èšŒãããããšãã£ãã±ãŒã¹ãæ³åããŠãã ããã
+
+ãã®æ¹æ³ãèŠãŠãããŸãã
+
+## pytest.mark.anyio { #pytest-mark-anyio }
+
+ãã¹ãå
ã§éåæé¢æ°ãåŒã³åºãããå Žåããã¹ã颿°èªäœãéåæã§ããå¿
èŠããããŸããAnyIO ã¯ãããå®çŸããããã®äŸ¿å©ãªãã©ã°ã€ã³ãæäŸããŠãããç¹å®ã®ãã¹ã颿°ãéåæã§åŒã³åºãããšãæå®ã§ããŸãã
+
+## HTTPX { #httpx }
+
+**FastAPI** ã¢ããªã±ãŒã·ã§ã³ãéåžžã® `def` 颿°ã䜿ã£ãŠããŠãããã®å
åŽã¯äŸç¶ãšã㊠`async` ã¢ããªã±ãŒã·ã§ã³ã§ãã
+
+`TestClient` ã¯ãæšæºã® pytest ã䜿ã£ãŠéåžžã® `def` ã®ãã¹ã颿°ããéåæã® FastAPI ã¢ããªãåŒã³åºãããã®ãããŸããªãããå
éšã§è¡ããŸãããããããã®ãããŸããªããã¯ãã¹ã颿°èªäœãéåæã®å Žåã«ã¯æ©èœããŸããããã¹ããéåæã§å®è¡ãããšããã¹ã颿°å
ã§ `TestClient` ã¯äœ¿ããªããªããŸãã
+
+`TestClient` 㯠<a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a> ãåºã«äœãããŠããã幞ããªããšã« API ã®ãã¹ãã«ã¯ HTTPX ãçŽæ¥å©çšã§ããŸãã
+
+## äŸ { #example }
+
+ç°¡åãªäŸãšããŠã[倧ããªã¢ããªã±ãŒã·ã§ã³](../tutorial/bigger-applications.md){.internal-link target=_blank} ãš [ãã¹ã](../tutorial/testing.md){.internal-link target=_blank} ã§èª¬æãããã®ã«äŒŒããã¡ã€ã«æ§æãèããŸã:
+
+```
+.
+âââ app
+â  âââ __init__.py
+â  âââ main.py
+â  âââ test_main.py
+```
+
+`main.py` ã¯æ¬¡ã®ããã«ãªããŸã:
+
+{* ../../docs_src/async_tests/app_a_py310/main.py *}
+
+`test_main.py` 㯠`main.py` ã®ãã¹ããæã¡ã次ã®ããã«ãªããŸã:
+
+{* ../../docs_src/async_tests/app_a_py310/test_main.py *}
+
+## å®è¡ { #run-it }
+
+ãã¹ãã¯ãã€ãéãæ¬¡ã§å®è¡ã§ããŸã:
+
+<div class="termy">
+
+```console
+$ pytest
+
+---> 100%
+```
+
+</div>
+
+## 詳现 { #in-detail }
+
+ããŒã«ãŒ `@pytest.mark.anyio` ã¯ããã®ãã¹ã颿°ãéåæã§åŒã³åºãã¹ãã§ããããšã pytest ã«äŒããŸã:
+
+{* ../../docs_src/async_tests/app_a_py310/test_main.py hl[7] *}
+
+/// tip | è±ç¥è
+
+`TestClient` ã䜿ã£ãŠãããšããšç°ãªãããã¹ã颿°ã¯ `def` ã§ã¯ãªã `async def` ã«ãªã£ãŠããç¹ã«æ³šæããŠãã ããã
+
+///
+
+次ã«ãã¢ããªãæž¡ã㊠`AsyncClient` ãäœæãã`await` ã䜿ã£ãŠéåæãªã¯ãšã¹ããéä¿¡ã§ããŸãã
+
+{* ../../docs_src/async_tests/app_a_py310/test_main.py hl[9:12] *}
+
+ããã¯æ¬¡ãšåçã§ã:
+
+```Python
+response = client.get('/')
+```
+
+...ãããŸã§ã¯ `TestClient` ã§ãªã¯ãšã¹ããéã£ãŠããŸããã
+
+/// tip | è±ç¥è
+
+æ°ãã `AsyncClient` ã§ã¯ async/await ã䜿ã£ãŠããç¹ã«æ³šæããŠãã ããããªã¯ãšã¹ãã¯éåæã§ãã
+
+///
+
+/// warning | 泚æ
+
+ã¢ããªã±ãŒã·ã§ã³ã lifespan ã€ãã³ãã«äŸåããŠããå Žåã`AsyncClient` ã¯ãããã®ã€ãã³ããããªã¬ãŒããŸããã確å®ã«ããªã¬ãŒããã«ã¯ã<a href="https://github.com/florimondmanca/asgi-lifespan#usage" class="external-link" target="_blank">florimondmanca/asgi-lifespan</a> ã® `LifespanManager` ã䜿çšããŠãã ããã
+
+///
+
+## ãã®ä»ã®éåæé¢æ°åŒã³åºã { #other-asynchronous-function-calls }
+
+ãã¹ã颿°ãéåæã«ãªã£ãã®ã§ãFastAPI ã¢ããªãžã®ãªã¯ãšã¹ãé信以å€ã® `async` 颿°ããã³ãŒãã®ä»ã®å Žæãšåæ§ã«åŒã³åºããŠïŒ`await` ããŠïŒäœ¿ããŸãã
+
+/// tip | è±ç¥è
+
+ãã¹ãã«éåæé¢æ°åŒã³åºããçµ±åããéã«ïŒäŸ: <a href="https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop" class="external-link" target="_blank">MongoDB ã® MotorClient</a> äœ¿çšæïŒã`RuntimeError: Task attached to a different loop` ã«ééããå Žåã¯ãã€ãã³ãã«ãŒããå¿
èŠãšãããªããžã§ã¯ãã¯éåæé¢æ°å
ã§ã®ã¿ã€ã³ã¹ã¿ã³ã¹åããããã«ããŠãã ãããäŸãã° `@app.on_event("startup")` ã³ãŒã«ããã¯å
ã§è¡ããŸãã
+
+///
--- /dev/null
+# ãããã·ã®èåŸ { #behind-a-proxy }
+
+å€ãã®ç¶æ³ã§ãFastAPI ã¢ããªã®å段㫠**Traefik** ã **Nginx** ã®ãããª**ãããã·**ã眮ããŸãã
+
+ãããã®ãããã·ã¯ HTTPS èšŒææžãªã©ã®åŠçãæ
ããŸãã
+
+## ãããã·ã®è»¢éããã㌠{ #proxy-forwarded-headers }
+
+ã¢ããªã±ãŒã·ã§ã³ã®å段ã«ãã **ãããã·** ã¯éåžžããªã¯ãšã¹ãã **ãµãŒããŒ** ã«éãåã«ããã®ãªã¯ãšã¹ãããããã·ã«ãã£ãŠè»¢éãããããšãç¥ãããããã®ããããŒãåçã«ä»äžãã䜿çšäžã®å
ã®ïŒå
¬éïŒURLïŒãã¡ã€ã³ãå«ãïŒã HTTPS 䜿çšãªã©ã®æ
å ±ãäŒããŸãã
+
+**ãµãŒããŒ** ããã°ã©ã ïŒäŸãã° **FastAPI CLI** çµç±ã® **Uvicorn**ïŒã¯ãããã®ããããŒãè§£éãããã®æ
å ±ãã¢ããªã±ãŒã·ã§ã³ã«æž¡ãããšãã§ããŸãã
+
+ãããã»ãã¥ãªãã£äžããµãŒããŒã¯èªåãä¿¡é Œã§ãããããã·ã®èåŸã«ãããšåãããªãããããããã®ããããŒãè§£éããŸããã
+
+/// note | æè¡è©³çް
+
+ãããã·ã®ããããŒã¯æ¬¡ã®ãšããã§ã:
+
+* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For" class="external-link" target="_blank">X-Forwarded-For</a>
+* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto" class="external-link" target="_blank">X-Forwarded-Proto</a>
+* <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host" class="external-link" target="_blank">X-Forwarded-Host</a>
+
+///
+
+### ãããã·è»¢éããããŒãæå¹å { #enable-proxy-forwarded-headers }
+
+FastAPI CLI ã *CLI ãªãã·ã§ã³* `--forwarded-allow-ips` ä»ãã§èµ·åãã転éããããŒãä¿¡é ŒããŠèªãã§ãã IP ã¢ãã¬ã¹ãæå®ã§ããŸãã
+
+`--forwarded-allow-ips="*"` ãšãããšããã¹ãŠã®éä¿¡å
IP ãä¿¡é ŒããŸãã
+
+**ãµãŒããŒ** ãä¿¡é Œã§ãã **ãããã·** ã®èåŸã«ããããã®ãããã·ããã®ã¿æ¥ç¶ãããå Žåããããã·ã® IP ãåãå
¥ããããã«ãªããŸãã
+
+<div class="termy">
+
+```console
+$ fastapi run --forwarded-allow-ips="*"
+
+<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+</div>
+
+### HTTPS ã䌎ããªãã€ã¬ã¯ã { #redirects-with-https }
+
+äŸãã°ã*path operation* `/items/` ãå®çŸ©ããŠãããšããŸã:
+
+{* ../../docs_src/behind_a_proxy/tutorial001_01_py310.py hl[6] *}
+
+ã¯ã©ã€ã¢ã³ãã `/items` ã«ã¢ã¯ã»ã¹ãããšãæ¢å®ã§ã¯ `/items/` ã«ãªãã€ã¬ã¯ããããŸãã
+
+ãããã*CLI ãªãã·ã§ã³* `--forwarded-allow-ips` ãèšå®ããåã¯ã`http://localhost:8000/items/` ã«ãªãã€ã¬ã¯ããããå ŽåããããŸãã
+
+ã§ãããã¢ããªã±ãŒã·ã§ã³ã¯ `https://mysuperapp.com` ã§å
¬éãããŠããã`https://mysuperapp.com/items/` ã«ãªãã€ã¬ã¯ããããã¹ããããããŸããã
+
+`--proxy-headers` ãèšå®ãããšãFastAPI ã¯æ£ããå Žæã«ãªãã€ã¬ã¯ãã§ããããã«ãªããŸããð
+
+```
+https://mysuperapp.com/items/
+```
+
+/// tip | è±ç¥è
+
+HTTPS ã«ã€ããŠè©³ããç¥ãããå Žåã¯ã[HTTPS ã«ã€ããŠ](../deployment/https.md){.internal-link target=_blank} ãåç
§ããŠãã ããã
+
+///
+
+### ãããã·è»¢éããããŒã®ä»çµã¿ { #how-proxy-forwarded-headers-work }
+
+ã¯ã©ã€ã¢ã³ããš **ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒ** ã®éã§ã**ãããã·** ãã©ã®ããã«è»¢éããããŒã远å ããããå³ç€ºããŸã:
+
+```mermaid
+sequenceDiagram
+ participant Client
+ participant Proxy as Proxy/Load Balancer
+ participant Server as FastAPI Server
+
+ Client->>Proxy: HTTPS Request<br/>Host: mysuperapp.com<br/>Path: /items
+
+ Note over Proxy: Proxy adds forwarded headers
+
+ Proxy->>Server: HTTP Request<br/>X-Forwarded-For: [client IP]<br/>X-Forwarded-Proto: https<br/>X-Forwarded-Host: mysuperapp.com<br/>Path: /items
+
+ Note over Server: Server interprets headers<br/>(if --forwarded-allow-ips is set)
+
+ Server->>Proxy: HTTP Response<br/>with correct HTTPS URLs
+
+ Proxy->>Client: HTTPS Response
+```
+
+**ãããã·** ã¯å
ã®ã¯ã©ã€ã¢ã³ããªã¯ãšã¹ããåãåãã**ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒ** ã«æž¡ãåã«ç¹å¥ãªã転éãããããŒïŒ`X-Forwarded-*`ïŒã远å ããŸãã
+
+ãããã®ããããŒã¯ãéåžžã¯å€±ãããå
ã®ãªã¯ãšã¹ãã®æ
å ±ãä¿æããŸã:
+
+* **X-Forwarded-For**: å
ã®ã¯ã©ã€ã¢ã³ãã® IP ã¢ãã¬ã¹
+* **X-Forwarded-Proto**: å
ã®ãããã³ã«ïŒ`https`ïŒ
+* **X-Forwarded-Host**: å
ã®ãã¹ãïŒ`mysuperapp.com`ïŒ
+
+**FastAPI CLI** ã `--forwarded-allow-ips` ã§èšå®ãããšããããã®ããããŒãä¿¡é ŒããŠäœ¿çšããããšãã°ãªãã€ã¬ã¯ãã§æ£ãã URL ãçæããŸãã
+
+## ãã¹ãã¬ãã£ãã¯ã¹ãåé€ãããããã· { #proxy-with-a-stripped-path-prefix }
+
+ã¢ããªã±ãŒã·ã§ã³ã«ãã¹ãã¬ãã£ãã¯ã¹ãä»äžãããããã·ã䜿ãå ŽåããããŸãã
+
+ãã®ãããªå Žå㯠`root_path` ã§ã¢ããªã±ãŒã·ã§ã³ãèšå®ã§ããŸãã
+
+`root_path` ã¯ïŒFastAPI ã Starlette ãéããŠåºã¥ããŠããïŒASGI 仿§ã§æäŸãããŠããä»çµã¿ã§ãã
+
+`root_path` ã¯ãã®çš®ã®ã±ãŒã¹ãæ±ãããã«äœ¿ãããŸãã
+
+ããã¯ãµãã¢ããªã±ãŒã·ã§ã³ãããŠã³ãããéã«ãå
éšçã«äœ¿çšãããŸãã
+
+ããã§ããããã¹ãã¬ãã£ãã¯ã¹ãåé€ãããããã·ããšã¯ãã³ãŒãäžã§ã¯ `/app` ãšãããã¹ã宣èšããŠããŠãããã®äžã«ãããã·å±€ã远å ã㊠**FastAPI** ã¢ããªã±ãŒã·ã§ã³ã `/api/v1` ã®ãããªãã¹ã®äžã«é
眮ããããšãæããŸãã
+
+ãã®å Žåãå
ã®ãã¹ `/app` ã¯å®éã«ã¯ `/api/v1/app` ã§æäŸãããŸãã
+
+ãã¹ãŠã®ã³ãŒã㯠`/app` ã ããåæã«æžãããŠããã«ãããããããã§ãã
+
+{* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[6] *}
+
+ãããŠãããã·ã¯ãã¢ããªãµãŒããŒïŒãããã FastAPI CLI çµç±ã® UvicornïŒã«è»¢éããåã«ããã®å Žã§ **ãã¹ãã¬ãã£ãã¯ã¹** ã**ãåé€ã**ããã¢ããªã±ãŒã·ã§ã³åŽã«ã¯èªåã `/app` ã§æäŸãããŠããããã«èŠããããŸããããã«ãããã³ãŒãã®ãã¹ãŠã `/api/v1` ã®ãã¬ãã£ãã¯ã¹ä»ãã«æžãæããå¿
èŠããããŸããã
+
+ãããŸã§ã¯éåžžã©ããã«åäœããŸãã
+
+ããããçµ±åããã¥ã¡ã³ã UIïŒããã³ããšã³ãïŒãéããšãOpenAPI ã¹ããŒãã `/api/v1/openapi.json` ã§ã¯ãªã `/openapi.json` ããååŸããããšããŸãã
+
+ãã®ãããããã³ããšã³ãïŒãã©ãŠã¶ã§åäœïŒã¯ `/openapi.json` ã«ã¢ã¯ã»ã¹ããããšããŠãOpenAPI ã¹ããŒããååŸã§ããŸããã
+
+ãã®ã¢ããªã«ã¯ `/api/v1` ã®ãã¹ãã¬ãã£ãã¯ã¹ãä»äžãããããã·ããããããããã³ããšã³ã㯠`/api/v1/openapi.json` ããååŸããå¿
èŠããããŸãã
+
+```mermaid
+graph LR
+
+browser("Browser")
+proxy["Proxy on http://0.0.0.0:9999/api/v1/app"]
+server["Server on http://127.0.0.1:8000/app"]
+
+browser --> proxy
+proxy --> server
+```
+
+/// tip | è±ç¥è
+
+IP `0.0.0.0` ã¯ããã®ãã·ã³/ãµãŒããŒã§å©çšå¯èœãªãã¹ãŠã® IP ã§åŸ
ã¡åããããšãæå³ãã衚çŸãšããŠäžè¬çã«äœ¿ãããŸãã
+
+///
+
+ããã¥ã¡ã³ã UI ã§ã¯ããã® API ã® `server` ãïŒãããã·ã®èåŸã§ïŒ`/api/v1` ã«ããããšã宣èšãã OpenAPI ã¹ããŒããå¿
èŠã§ããäŸãã°:
+
+```JSON hl_lines="4-8"
+{
+ "openapi": "3.1.0",
+ // ã»ãã®é
ç®
+ "servers": [
+ {
+ "url": "/api/v1"
+ }
+ ],
+ "paths": {
+ // ã»ãã®é
ç®
+ }
+}
+```
+
+ãã®äŸã§ã¯ãProxyã㯠**Traefik** ã®ãããªãã®ããµãŒããŒã¯ **Uvicorn** ãš FastAPI CLI ã§ FastAPI ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŠãããã®ãæ³å®ããŠããŸãã
+
+### `root_path` ã®æå® { #providing-the-root-path }
+
+ãããå®çŸããã«ã¯ã次ã®ããã«ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ `--root-path` ã䜿çšããŸã:
+
+<div class="termy">
+
+```console
+$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
+
+<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+</div>
+
+Hypercorn ã䜿ãå Žåããåæ§ã« `--root-path` ãªãã·ã§ã³ããããŸãã
+
+/// note | æè¡è©³çް
+
+ãã®ãŠãŒã¹ã±ãŒã¹åãã«ãASGI 仿§ã¯ `root_path` ãå®çŸ©ããŠããŸãã
+
+ãã㊠`--root-path` ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ã¯ããã® `root_path` ãæäŸããŸãã
+
+///
+
+### çŸåšã® `root_path` ã®ç¢ºèª { #checking-the-current-root-path }
+
+åãªã¯ãšã¹ãã§ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠããçŸåšã® `root_path` ã¯ååŸã§ããŸããããã¯ïŒASGI 仿§ã®äžéšã§ããïŒ`scope` èŸæžã«å«ãŸããŸãã
+
+ããã§ã¯ãã¢ã®ãããã¡ãã»ãŒãžã«å«ããŠããŸãã
+
+{* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[8] *}
+
+ãã®ããã§ã次ã®ããã« Uvicorn ãèµ·åãããš:
+
+<div class="termy">
+
+```console
+$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
+
+<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+</div>
+
+ã¬ã¹ãã³ã¹ã¯æ¬¡ã®ããã«ãªããŸã:
+
+```JSON
+{
+ "message": "Hello World",
+ "root_path": "/api/v1"
+}
+```
+
+### FastAPI ã¢ããªã§ã® `root_path` èšå® { #setting-the-root-path-in-the-fastapi-app }
+
+ãããã¯ã`--root-path` ã®ãããªã³ãã³ãã©ã€ã³ãªãã·ã§ã³ãæž¡ããªãå Žåã¯ãFastAPI ã¢ããªäœææã«ãã©ã¡ãŒã¿ `root_path` ãèšå®ã§ããŸã:
+
+{* ../../docs_src/behind_a_proxy/tutorial002_py310.py hl[3] *}
+
+`FastAPI` ã« `root_path` ãæž¡ãã®ã¯ãUvicorn ã Hypercorn ã«ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ `--root-path` ãæž¡ãã®ãšåçã§ãã
+
+### `root_path` ã«ã€ã㊠{ #about-root-path }
+
+ãµãŒããŒïŒUvicornïŒã¯ããã® `root_path` ãã¢ããªã«æž¡ã以å€ã®çšéã§ã¯äœ¿çšããªãç¹ã«æ³šæããŠãã ããã
+
+ãããããã©ãŠã¶ã§ <a href="http://127.0.0.1:8000/app" class="external-link" target="_blank">http://127.0.0.1:8000/app</a> ã«ã¢ã¯ã»ã¹ãããšãéåžžã©ããã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸã:
+
+```JSON
+{
+ "message": "Hello World",
+ "root_path": "/api/v1"
+}
+```
+
+ã€ãŸãã`http://127.0.0.1:8000/api/v1/app` ã§ã¢ã¯ã»ã¹ãããããšã¯æ³å®ããŠããŸããã
+
+Uvicorn ã¯ããããã·ã `http://127.0.0.1:8000/app` ã«ã¢ã¯ã»ã¹ããŠããããšãæ³å®ããŠããããã®äžã«è¿œå ã® `/api/v1` ãã¬ãã£ãã¯ã¹ãä»ããã®ã¯ãããã·ã®è²¬åã§ãã
+
+## ãã¹ãã¬ãã£ãã¯ã¹ãåé€ãããããã·ã«ã€ã㊠{ #about-proxies-with-a-stripped-path-prefix }
+
+ãã¹ãã¬ãã£ãã¯ã¹ãåé€ãããããã·ã¯ãèšå®æ¹æ³ã®äžäŸã«ãããªãç¹ã«æ³šæããŠãã ããã
+
+å€ãã®å Žåããããã·ã¯ãã¹ãã¬ãã£ãã¯ã¹ãåé€ããªãèšå®ãæ¢å®ã§ãããã
+
+ãã®ãããªå ŽåïŒãã¹ãã¬ãã£ãã¯ã¹ãåé€ããªãå ŽåïŒã¯ããããã·ã¯ `https://myawesomeapp.com` ã®ãããªã¢ãã¬ã¹ã§åŸ
ã¡åãããã©ãŠã¶ã `https://myawesomeapp.com/api/v1/app` ã«ã¢ã¯ã»ã¹ãããµãŒããŒïŒäŸ: UvicornïŒã `http://127.0.0.1:8000` ã§åŸ
ã¡åããŠãããªãããããã·ïŒãã¬ãã£ãã¯ã¹ãåé€ããªãïŒã¯åããã¹ `http://127.0.0.1:8000/api/v1/app` ã§ Uvicorn ã«ã¢ã¯ã»ã¹ããŸãã
+
+## Traefik ã䜿ã£ãããŒã«ã«æ€èšŒ { #testing-locally-with-traefik }
+
+<a href="https://docs.traefik.io/" class="external-link" target="_blank">Traefik</a> ã䜿ãã°ããã¹ãã¬ãã£ãã¯ã¹ãåé€ããæ§æãããŒã«ã«ã§ç°¡åã«è©ŠããŸãã
+
+<a href="https://github.com/containous/traefik/releases" class="external-link" target="_blank">Traefik ãããŠã³ããŒã</a> ããŠãã ãããåäžãã€ããªãªã®ã§ãå§çž®ãã¡ã€ã«ãå±éããŠç«¯æ«ããçŽæ¥å®è¡ã§ããŸãã
+
+次ã®å
容㧠`traefik.toml` ãšãããã¡ã€ã«ãäœæããŸã:
+
+```TOML hl_lines="3"
+[entryPoints]
+ [entryPoints.http]
+ address = ":9999"
+
+[providers]
+ [providers.file]
+ filename = "routes.toml"
+```
+
+ãã㯠Traefik ã«ããŒã 9999 ã§åŸ
ã¡åããå¥ã®ãã¡ã€ã« `routes.toml` ã䜿çšããããæç€ºããŸãã
+
+/// tip | è±ç¥è
+
+æšæºã® HTTP ããŒã 80 ã§ã¯ãªã 9999 ã䜿ãã®ã¯ã管çè
ïŒ`sudo`ïŒæš©éã§å®è¡ããå¿
èŠããªããããã§ãã
+
+///
+
+次ã«ããã® `routes.toml` ãã¡ã€ã«ãäœæããŸã:
+
+```TOML hl_lines="5 12 20"
+[http]
+ [http.middlewares]
+
+ [http.middlewares.api-stripprefix.stripPrefix]
+ prefixes = ["/api/v1"]
+
+ [http.routers]
+
+ [http.routers.app-http]
+ entryPoints = ["http"]
+ service = "app"
+ rule = "PathPrefix(`/api/v1`)"
+ middlewares = ["api-stripprefix"]
+
+ [http.services]
+
+ [http.services.app]
+ [http.services.app.loadBalancer]
+ [[http.services.app.loadBalancer.servers]]
+ url = "http://127.0.0.1:8000"
+```
+
+ãã®ãã¡ã€ã«ã¯ Traefik ã« `/api/v1` ã®ãã¹ãã¬ãã£ãã¯ã¹ã䜿ãããèšå®ããŸãã
+
+ãã㊠Traefik ã¯ã`http://127.0.0.1:8000` ã§åäœããŠãã Uvicorn ãžãªã¯ãšã¹ãã転éããŸãã
+
+ã§ã¯ Traefik ãèµ·åããŸã:
+
+<div class="termy">
+
+```console
+$ ./traefik --configFile=traefik.toml
+
+INFO[0000] Configuration loaded from file: /home/user/awesomeapi/traefik.toml
+```
+
+</div>
+
+次ã«ã`--root-path` ãªãã·ã§ã³ãæå®ããŠã¢ããªãèµ·åããŸã:
+
+<div class="termy">
+
+```console
+$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
+
+<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+</div>
+
+### ã¬ã¹ãã³ã¹ã®ç¢ºèª { #check-the-responses }
+
+ããã§ãUvicorn ã®ããŒãã® URL <a href="http://127.0.0.1:8000/app" class="external-link" target="_blank">http://127.0.0.1:8000/app</a> ã«ã¢ã¯ã»ã¹ãããšãéåžžã©ããã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸã:
+
+```JSON
+{
+ "message": "Hello World",
+ "root_path": "/api/v1"
+}
+```
+
+/// tip | è±ç¥è
+
+`http://127.0.0.1:8000/app` ã«ã¢ã¯ã»ã¹ããŠããã«ããããããããªãã·ã§ã³ `--root-path` ããååŸãã `root_path` ã `/api/v1` ãšè¡šç€ºãããŠããç¹ã«æ³šç®ããŠãã ããã
+
+///
+
+次ã«ãTraefik ã®ããŒãã§ãã¬ãã£ãã¯ã¹ä»ãã® URL <a href="http://127.0.0.1:9999/api/v1/app" class="external-link" target="_blank">http://127.0.0.1:9999/api/v1/app</a> ãéããŸãã
+
+åãã¬ã¹ãã³ã¹ãåŸãããŸã:
+
+```JSON
+{
+ "message": "Hello World",
+ "root_path": "/api/v1"
+}
+```
+
+ãã ãä»åã¯ããããã·ãä»äžãããã¬ãã£ãã¯ã¹ `/api/v1` ã®ä»ãã URL ã§ãã
+
+ãã¡ãããããã§ã®æ³å®ã¯å
šå¡ããããã·çµç±ã§ã¢ããªã«ã¢ã¯ã»ã¹ããããšã§ãããããã£ãŠããã¹ãã¬ãã£ãã¯ã¹ `/api/v1` ã®ããçããæ£ãããã¢ã¯ã»ã¹æ¹æ³ã«ãªããŸãã
+
+äžæ¹ããã¬ãã£ãã¯ã¹ã®ãªãçïŒ`http://127.0.0.1:8000/app`ãUvicorn ãçŽæ¥æäŸïŒã¯ã_ãããã·_ïŒTraefikïŒå°çšã®æ¥ç¶å
ã«ãªããŸãã
+
+ããã«ããããããã·ïŒTraefikïŒããã¹ãã¬ãã£ãã¯ã¹ãã©ã®ããã«çšãããµãŒããŒïŒUvicornïŒã `--root-path` ã® `root_path` ãã©ã®ããã«å©çšããããåãããŸãã
+
+### ããã¥ã¡ã³ã UI ã®ç¢ºèª { #check-the-docs-ui }
+
+ããããã€ã³ãã§ããâš
+
+ãå
¬åŒãªãã¢ã¯ã»ã¹æ¹æ³ã¯ãå®çŸ©ãããã¹ãã¬ãã£ãã¯ã¹ä»ãã®ãããã·çµç±ã§ãããããã£ãŠæ³å®ã©ããããã¬ãã£ãã¯ã¹ãªãã® URL ã§ Uvicorn ãçŽæ¥æäŸããããã¥ã¡ã³ã UI ã«ã¢ã¯ã»ã¹ãããšåäœããŸããããããã·çµç±ã§ã¢ã¯ã»ã¹ãããããšãåæãšããŠããããã§ãã
+
+<a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> ã確èªããŠãã ãã:
+
+<img src="/img/tutorial/behind-a-proxy/image01.png">
+
+ãããããããã·ïŒããŒã `9999`ïŒã䜿ã£ããå
¬åŒãURL `/api/v1/docs` ã§ããã¥ã¡ã³ã UI ã«ã¢ã¯ã»ã¹ãããšãæ£ããåäœããŸãïŒð
+
+<a href="http://127.0.0.1:9999/api/v1/docs" class="external-link" target="_blank">http://127.0.0.1:9999/api/v1/docs</a> ã確èªããŠãã ãã:
+
+<img src="/img/tutorial/behind-a-proxy/image02.png">
+
+ãããã©ããã§ããâïž
+
+ããã¯ãFastAPI ã `root_path` ã䜿ã£ãŠãOpenAPI ã®æ¢å®ã® `server` ã `root_path` ã® URL ã§çæããããã§ãã
+
+## 远å ã®ãµãŒã㌠{ #additional-servers }
+
+/// warning | 泚æ
+
+ããã¯é«åºŠãªãŠãŒã¹ã±ãŒã¹ã§ããèªã¿é£ã°ããŠãæ§ããŸããã
+
+///
+
+æ¢å®ã§ã¯ã**FastAPI** 㯠OpenAPI ã¹ããŒãå
ã« `root_path` ã® URL ãæã€ `server` ãäœæããŸãã
+
+ããããã¹ããŒãžã³ã°ãšæ¬çªã®äž¡æ¹ãšåãããã¥ã¡ã³ã UI ã§å¯Ÿè©±ããããå Žåãªã©ãå¥ã® `servers` ãæå®ããããšãã§ããŸãã
+
+ã«ã¹ã¿ã ã® `servers` ãªã¹ããæž¡ããŠããŠãã〠`root_path`ïŒAPI ããããã·ã®èåŸã«ããããïŒãèšå®ãããŠããå Žåã**FastAPI** ã¯ãã® `root_path` ãçšãããserverãããªã¹ãã®å
é ã«æ¿å
¥ããŸãã
+
+äŸãã°:
+
+{* ../../docs_src/behind_a_proxy/tutorial003_py310.py hl[4:7] *}
+
+次ã®ãã㪠OpenAPI ã¹ããŒããçæãããŸã:
+
+```JSON hl_lines="5-7"
+{
+ "openapi": "3.1.0",
+ // ã»ãã®é
ç®
+ "servers": [
+ {
+ "url": "/api/v1"
+ },
+ {
+ "url": "https://stag.example.com",
+ "description": "Staging environment"
+ },
+ {
+ "url": "https://prod.example.com",
+ "description": "Production environment"
+ }
+ ],
+ "paths": {
+ // ã»ãã®é
ç®
+ }
+}
+```
+
+/// tip | è±ç¥è
+
+`root_path` ããååŸãã `url` å€ `/api/v1` ãæã€ server ãèªåçæãããŠããç¹ã«æ³šç®ããŠãã ããã
+
+///
+
+ããã¥ã¡ã³ã UIïŒ<a href="http://127.0.0.1:9999/api/v1/docs" class="external-link" target="_blank">http://127.0.0.1:9999/api/v1/docs</a>ïŒã§ã¯æ¬¡ã®ããã«è¡šç€ºãããŸã:
+
+<img src="/img/tutorial/behind-a-proxy/image03.png">
+
+/// tip | è±ç¥è
+
+ããã¥ã¡ã³ã UI ã¯ãéžæãã server ãšå¯Ÿè©±ããŸãã
+
+///
+
+/// note | æè¡è©³çް
+
+OpenAPI 仿§ã® `servers` ããããã£ã¯ä»»æã§ãã
+
+`servers` ãã©ã¡ãŒã¿ãæå®ãããã〠`root_path` ã `/` ã®å Žåãçæããã OpenAPI ã¹ããŒããã㯠`servers` ããããã£ãæ¢å®ã§å®å
šã«çç¥ãããŸããããã¯ã`url` ã `/` ã® server ã 1 ã€ããã®ãšåçã§ãã
+
+///
+
+### `root_path` ç±æ¥ã®èªå server ãç¡å¹å { #disable-automatic-server-from-root-path }
+
+`root_path` ãçšããèªåç㪠server ã **FastAPI** ã«å«ããŠã»ãããªãå Žåã¯ããã©ã¡ãŒã¿ `root_path_in_servers=False` ã䜿çšããŸã:
+
+{* ../../docs_src/behind_a_proxy/tutorial004_py310.py hl[9] *}
+
+ãããšãOpenAPI ã¹ããŒãã«ã¯å«ãŸããŸããã
+
+## ãµãã¢ããªã±ãŒã·ã§ã³ã®ããŠã³ã { #mounting-a-sub-application }
+
+`root_path` ã䌎ããããã·ã䜿çšãã€ã€ãµãã¢ããªã±ãŒã·ã§ã³ãããŠã³ãããå¿
èŠãããå Žåã§ãïŒ[ãµãã¢ããªã±ãŒã·ã§ã³ - ããŠã³ã](sub-applications.md){.internal-link target=_blank} åç
§ïŒãéåžžã©ããã«è¡ããŸãã
+
+FastAPI ã¯å
éšã§ `root_path` ãé©åã«æ±ãããããã®ãŸãŸåäœããŸããâš
ããããè¿ãããšããŠããã³ã³ãã³ãã **JSONã§ã·ãªã¢ã©ã€ãºå¯èœ**ã§ããããšã確å®ãªãããããçŽæ¥ã¬ã¹ãã³ã¹ã¯ã©ã¹ã«æž¡ããŠãFastAPIãã¬ã¹ãã³ã¹ã¯ã©ã¹ãžæž¡ãåã«è¿åŽã³ã³ãã³ãã `jsonable_encoder` ã«éãããšã§çºçãã远å ã®ãªãŒããŒããããåé¿ã§ããŸãã
-{* ../../docs_src/custom_response/tutorial001b_py39.py hl[2,7] *}
+{* ../../docs_src/custom_response/tutorial001b_py310.py hl[2,7] *}
/// info | æ
å ±
* `HTMLResponse` ãã€ã³ããŒãããã
* *path operation ãã³ã¬ãŒã¿* ã®ãã©ã¡ãŒã¿ `response_class` ã« `HTMLResponse` ãæž¡ãã
-{* ../../docs_src/custom_response/tutorial002_py39.py hl[2,7] *}
+{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
/// info | æ
å ±
äžèšãšåãäŸã«ãããŠã `HTMLResponse` ãè¿ããšããã®ããã«ãªããŸã:
-{* ../../docs_src/custom_response/tutorial003_py39.py hl[2,7,19] *}
+{* ../../docs_src/custom_response/tutorial003_py310.py hl[2,7,19] *}
/// warning | 泚æ
äŸãã°ããã®ããã«ãªããŸã:
-{* ../../docs_src/custom_response/tutorial004_py39.py hl[7,21,23] *}
+{* ../../docs_src/custom_response/tutorial004_py310.py hl[7,21,23] *}
ãã®äŸã§ã¯ã颿° `generate_html_response()` ã¯ã`str` ã®HTMLãè¿ãã®ã§ã¯ãªãã`Response` ãçæããŠè¿ããŠããŸãã
FastAPIïŒå®éã«ã¯StarletteïŒã¯èªåçã«Content-LengthããããŒãå«ã¿ãŸãããŸãã`media_type` ã«åºã¥ããContent-TypeããããŒãå«ã¿ãããã¹ãã¿ã€ãã®ããã«charsetã远å ããŸãã
-{* ../../docs_src/response_directly/tutorial002_py39.py hl[1,18] *}
+{* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *}
### `HTMLResponse` { #htmlresponse }
ããã¹ãããã€ããåãåãããã¬ãŒã³ããã¹ãã®ã¬ã¹ãã³ã¹ãè¿ããŸãã
-{* ../../docs_src/custom_response/tutorial005_py39.py hl[2,7,9] *}
+{* ../../docs_src/custom_response/tutorial005_py310.py hl[2,7,9] *}
### `JSONResponse` { #jsonresponse }
///
-{* ../../docs_src/custom_response/tutorial001_py39.py hl[2,7] *}
+{* ../../docs_src/custom_response/tutorial001_py310.py hl[2,7] *}
/// tip | è±ç¥è
`RedirectResponse` ãçŽæ¥è¿ããŸã:
-{* ../../docs_src/custom_response/tutorial006_py39.py hl[2,9] *}
+{* ../../docs_src/custom_response/tutorial006_py310.py hl[2,9] *}
---
ãŸãã¯ã`response_class` ãã©ã¡ãŒã¿ã§äœ¿çšã§ããŸã:
-{* ../../docs_src/custom_response/tutorial006b_py39.py hl[2,7,9] *}
+{* ../../docs_src/custom_response/tutorial006b_py310.py hl[2,7,9] *}
ãã®å Žåã*path operation*颿°ããURLãçŽæ¥è¿ããŸãã
ãŸãã`status_code` ãã©ã¡ãŒã¿ã `response_class` ãã©ã¡ãŒã¿ãšçµã¿åãããŠäœ¿ãããšãã§ããŸã:
-{* ../../docs_src/custom_response/tutorial006c_py39.py hl[2,7,9] *}
+{* ../../docs_src/custom_response/tutorial006c_py310.py hl[2,7,9] *}
### `StreamingResponse` { #streamingresponse }
éåæãžã§ãã¬ãŒã¿ããŸãã¯éåžžã®ãžã§ãã¬ãŒã¿/ã€ãã¬ãŒã¿ãåãåããã¬ã¹ãã³ã¹ããã£ãã¹ããªãŒã ããŸãã
-{* ../../docs_src/custom_response/tutorial007_py39.py hl[2,14] *}
+{* ../../docs_src/custom_response/tutorial007_py310.py hl[2,14] *}
#### ãã¡ã€ã«ã©ã€ã¯ãªããžã§ã¯ãã§ `StreamingResponse` ã䜿ã { #using-streamingresponse-with-file-like-objects }
ããã«ã¯ã¯ã©ãŠãã¹ãã¬ãŒãžãšã®é£æºãæ ååŠçãªã©ãå€ãã®ã©ã€ãã©ãªãå«ãŸããŸãã
-{* ../../docs_src/custom_response/tutorial008_py39.py hl[2,10:12,14] *}
+{* ../../docs_src/custom_response/tutorial008_py310.py hl[2,10:12,14] *}
1. ããã¯ãžã§ãã¬ãŒã¿é¢æ°ã§ããå
éšã« `yield` æãå«ãããããžã§ãã¬ãŒã¿é¢æ°ãã§ãã
2. `with` ãããã¯ã䜿ãããšã§ããžã§ãã¬ãŒã¿é¢æ°ãçµãã£ãåŸïŒã€ãŸãã¬ã¹ãã³ã¹ã®éä¿¡ãå®äºããåŸïŒã«file-likeãªããžã§ã¯ãã確å®ã«ã¯ããŒãºãããããã«ããŸãã
ãã¡ã€ã«ã¬ã¹ãã³ã¹ã«ã¯ãé©å㪠`Content-Length`ã`Last-Modified`ã`ETag` ããããŒãå«ãŸããŸãã
-{* ../../docs_src/custom_response/tutorial009_py39.py hl[2,10] *}
+{* ../../docs_src/custom_response/tutorial009_py310.py hl[2,10] *}
`response_class` ãã©ã¡ãŒã¿ã䜿ãããšãã§ããŸã:
-{* ../../docs_src/custom_response/tutorial009b_py39.py hl[2,8,10] *}
+{* ../../docs_src/custom_response/tutorial009b_py310.py hl[2,8,10] *}
ãã®å Žåã*path operation*颿°ãããã¡ã€ã«ãã¹ãçŽæ¥è¿ããŸãã
`CustomORJSONResponse` ãäœããŸããäž»ã«å¿
èŠãªã®ã¯ãã³ã³ãã³ãã `bytes` ãšããŠè¿ã `Response.render(content)` ã¡ãœãããäœãããšã§ã:
-{* ../../docs_src/custom_response/tutorial009c_py39.py hl[9:14,17] *}
+{* ../../docs_src/custom_response/tutorial009c_py310.py hl[9:14,17] *}
ãããŸã§ã¯æ¬¡ã®ããã«è¿ããŠãããã®ã:
以äžã®äŸã§ã¯ã**FastAPI** ã¯ãã¹ãŠã®*path operation*ã§ã`JSONResponse` ã®ä»£ããã« `ORJSONResponse` ãããã©ã«ããšããŠäœ¿ããŸãã
-{* ../../docs_src/custom_response/tutorial010_py39.py hl[2,4] *}
+{* ../../docs_src/custom_response/tutorial010_py310.py hl[2,4] *}
/// tip | è±ç¥è
--- /dev/null
+# Dataclasses ã®äœ¿çš { #using-dataclasses }
+
+FastAPI 㯠**Pydantic** ã®äžã«æ§ç¯ãããŠããããããŸã§ã«ãªã¯ãšã¹ããã¬ã¹ãã³ã¹ã宣èšããããã« Pydantic ã¢ãã«ãäœ¿ãæ¹æ³ã玹ä»ããŠããŸããã
+
+ããã FastAPI ã¯ãåæ§ã®æ¹æ³ã§ <a href="https://docs.python.org/3/library/dataclasses.html" class="external-link" target="_blank">`dataclasses`</a> ããµããŒãããŸã:
+
+{* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *}
+
+ãã㯠**Pydantic** ã«ãã£ãŠåŒãç¶ããµããŒããããŠããŸããPydantic ã«ã¯ <a href="https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel" class="external-link" target="_blank">`dataclasses` ã®å
éšãµããŒã</a> ãããããã§ãã
+
+ãã®ãããäžèšã®ããã«æç€ºçã« Pydantic ã䜿ã£ãŠããªãã³ãŒãã§ããFastAPI ã¯æšæºã® dataclass ã Pydantic ç¬èªã® dataclass ã«å€æããããã« Pydantic ã䜿çšããŠããŸãã
+
+ãããŠåœç¶ãªãããæ¬¡ã®ç¹ãåæ§ã«ãµããŒããããŸã:
+
+- ããŒã¿æ€èšŒ
+- ããŒã¿ã®ã·ãªã¢ã©ã€ãº
+- ããŒã¿ã®ããã¥ã¡ã³ãå ãªã©
+
+ãã㯠Pydantic ã¢ãã«ã®å Žåãšåãããã«åäœããŸããå
éšçã«ãåæ§ã« Pydantic ã䜿ã£ãŠå®çŸãããŠããŸãã
+
+/// info | æ
å ±
+
+dataclasses ã¯ãPydantic ã¢ãã«ãã§ããããšããã¹ãŠã¯è¡ããªãç¹ã«çæããŠãã ããã
+
+ãã®ãããPydantic ã¢ãã«ã䜿ãå¿
èŠãããå ŽåããããŸãã
+
+ãããæ¢åã® dataclass ã倿°ãããªããFastAPI ã§ Web API ãæ§ç¯ããéã«ããããæŽ»çšããã¡ãã£ãšãããã¯ããã¯ã«ãªããŸããð€
+
+///
+
+## `response_model` ã§ã® dataclasses { #dataclasses-in-response-model }
+
+`response_model` ãã©ã¡ãŒã¿ã§ã `dataclasses` ã䜿çšã§ããŸã:
+
+{* ../../docs_src/dataclasses_/tutorial002_py310.py hl[1,6:12,18] *}
+
+dataclass ã¯èªåçã« Pydantic ã® dataclass ã«å€æãããŸãã
+
+ãã®ããããã®ã¹ããŒã㯠API ããã¥ã¡ã³ãã® UI ã«è¡šç€ºãããŸã:
+
+<img src="/img/tutorial/dataclasses/image01.png">
+
+## ãã¹ãããããŒã¿æ§é ã§ã® dataclasses { #dataclasses-in-nested-data-structures }
+
+`dataclasses` ãä»ã®å泚éãšçµã¿åãããŠããã¹ãããããŒã¿æ§é ãäœæã§ããŸãã
+
+å Žåã«ãã£ãŠã¯ãèªåçæããã API ããã¥ã¡ã³ãã§ãšã©ãŒãçºçãããªã©ã®çç±ã§ãPydantic çã® `dataclasses` ã䜿ãå¿
èŠããããããããŸããã
+
+ãã®å Žåã¯ãæšæºã® `dataclasses` ã `pydantic.dataclasses` ã«çœ®ãæããã ãã§æžã¿ãŸããããã¯ããããã€ã³çœ®æã§ã:
+
+{* ../../docs_src/dataclasses_/tutorial003_py310.py hl[1,4,7:10,13:16,22:24,27] *}
+
+1. äŸç¶ãšããŠæšæºã® `dataclasses` ãã `field` ãã€ã³ããŒãããŸãã
+
+2. `pydantic.dataclasses` 㯠`dataclasses` ã®ããããã€ã³çœ®æã§ãã
+
+3. `Author` dataclass 㯠`Item` dataclass ã®ãªã¹ããå«ã¿ãŸãã
+
+4. `Author` dataclass ã `response_model` ãã©ã¡ãŒã¿ãšããŠäœ¿çšããŠããŸãã
+
+5. ãªã¯ãšã¹ãããã£ãšããŠã® dataclass ãšäœµããŠãä»ã®æšæºã®å泚éã䜿çšã§ããŸãã
+
+ ãã®äŸã§ã¯ã`Item` dataclass ã®ãªã¹ãã§ãã
+
+6. ããã§ã¯ãdataclass ã®ãªã¹ãã§ãã `items` ãå«ãèŸæžãè¿ããŠããŸãã
+
+ FastAPI ã¯ããŒã¿ã JSON ã« <dfn title="éä¿¡å¯èœãªåœ¢åŒã«ããŒã¿ã倿ããããš">ã·ãªã¢ã©ã€ãº</dfn> ã§ããŸãã
+
+7. ããã§ã¯ `response_model` ã« `Author` dataclass ã®ãªã¹ããšããåæ³šéã䜿çšããŠããŸãã
+
+ ãã®ããã«ã`dataclasses` ã¯æšæºã®å泚éãšçµã¿åãããããŸãã
+
+8. ãã® *path operation 颿°* ã¯ã`async def` ã§ã¯ãªãéåžžã® `def` ã䜿çšããŠããŸãã
+
+ ãã€ãã©ãããFastAPI ã§ã¯å¿
èŠã«å¿ã㊠`def` ãš `async def` ãçµã¿åãããããŸãã
+
+ ã©ã¡ãããã€äœ¿ããã®åŸ©ç¿ãå¿
èŠãªå Žåã¯ã[`async` ãš `await`](../async.md#in-a-hurry){.internal-link target=_blank} ã«é¢ããããã¥ã¡ã³ãã® _"In a hurry?"_ ã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã
+
+9. ãã® *path operation 颿°* ã¯ïŒå¯èœã§ã¯ãããŸããïŒdataclass èªäœã¯è¿ãããå
éšããŒã¿ãæã€èŸæžã®ãªã¹ããè¿ããŠããŸãã
+
+ FastAPI 㯠dataclass ãå«ã `response_model` ãã©ã¡ãŒã¿ã䜿ã£ãŠã¬ã¹ãã³ã¹ã倿ããŸãã
+
+`dataclasses` ã¯ä»ã®å泚éãšå€æ§ãªçµã¿åãããå¯èœã§ãè€éãªããŒã¿æ§é ãæ§æã§ããŸãã
+
+äžèšã®ã³ãŒãå
ã³ã¡ã³ãã®ãã³ããåç
§ããŠãããå
·äœçãªè©³çްã確èªããŠãã ããã
+
+## ããã«åŠã¶ { #learn-more }
+
+`dataclasses` ãä»ã® Pydantic ã¢ãã«ãšçµã¿åãããããç¶æ¿ããããèªåã®ã¢ãã«ã«å«ããããã§ããŸãã
+
+詳ããã¯ã<a href="https://docs.pydantic.dev/latest/concepts/dataclasses/" class="external-link" target="_blank">dataclasses ã«é¢ãã Pydantic ããã¥ã¡ã³ã</a> ãåç
§ããŠãã ããã
+
+## ããŒãžã§ã³ { #version }
+
+ãã㯠FastAPI ããŒãžã§ã³ `0.67.0` 以éã§å©çšå¯èœã§ããð
--- /dev/null
+# Lifespan ã€ãã³ã { #lifespan-events }
+
+ã¢ããªã±ãŒã·ã§ã³ãèµ·åããåã«äžåºŠã ãå®è¡ãã¹ãããžãã¯ïŒã³ãŒãïŒãå®çŸ©ã§ããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ããªã¯ãšã¹ããåãåãå§ããåã«ããã®ã³ãŒããäžåºŠã ãå®è¡ãããããšããæå³ã§ãã
+
+åæ§ã«ãã¢ããªã±ãŒã·ã§ã³ãã·ã£ããããŠã³ãããšãã«å®è¡ãã¹ãããžãã¯ïŒã³ãŒãïŒãå®çŸ©ã§ããŸãããã®å Žåããã®ã³ãŒãã¯ãïŒå€ãã®ãªã¯ãšã¹ããåŠçããïŒåŸã«äžåºŠã ãå®è¡ãããŸãã
+
+ãã®ã³ãŒãã¯ãã¢ããªã±ãŒã·ã§ã³ããªã¯ãšã¹ãã®åãä»ãããéå§ãããåããããŠåŠçããçµäºãããçŽåŸã«å®è¡ããããããã¢ããªã±ãŒã·ã§ã³ã®å
šäœã®ãLifespanãïŒãã®ãlifespanããšããèšèã¯ããåŸã§éèŠã«ãªããŸã ðïŒãã«ããŒããŸãã
+
+ããã¯ãã¢ããªå
šäœã§äœ¿çšãããªã¯ãšã¹ãéã§ãå
±æããããã€åŸã§ãã¯ãªãŒã³ã¢ãããããå¿
èŠããããããªããªãœãŒã¹ããã»ããã¢ããããã®ã«ãšãŠã䟿å©ã§ããããšãã°ãããŒã¿ããŒã¹æ¥ç¶ããŒã«ããå
±æã®æ©æ¢°åŠç¿ã¢ãã«ã®èªã¿èŸŒã¿ãªã©ã§ãã
+
+## ãŠãŒã¹ã±ãŒã¹ { #use-case }
+
+ãŸãã¯ãŠãŒã¹ã±ãŒã¹ã®äŸããå§ããŠããããã©ã®ããã«è§£æ±ºããããèŠãŠãããŸãã
+
+ãªã¯ãšã¹ããåŠçããããã«äœ¿çšããããæ©æ¢°åŠç¿ã¢ãã«ããããã€ããããšæ³åããŠãã ãããð€
+
+åãã¢ãã«ããªã¯ãšã¹ãéã§å
±æããã®ã§ããªã¯ãšã¹ãããšããŠãŒã¶ãŒããšã«å¥ã
ã®ã¢ãã«ã䜿ãããã§ã¯ãããŸããã
+
+ã¢ãã«ã®èªã¿èŸŒã¿ã«ã¯ãã£ã¹ã¯ãã倧éã®ããŒã¿ãèªãå¿
èŠããããããªãæéãããããããããŸããããããã£ãŠããªã¯ãšã¹ãããšã«èªã¿èŸŒã¿ããã¯ãããŸããã
+
+ã¢ãžã¥ãŒã«/ãã¡ã€ã«ã®ãããã¬ãã«ã§èªã¿èŸŒãããšãã§ããŸããããã®å Žåã¯ãããšãç°¡åãªèªåãã¹ããå®è¡ããã ãã§ããã¢ãã«ãèªã¿èŸŒããããšã«ãªãããã®ã¢ãã«ã®èªã¿èŸŒã¿ãåŸ
ã€å¿
èŠããããããç¬ç«ããã³ãŒãéšåãèµ°ãããã ãã®ãã¹ãã§ããé
ãããªã£ãŠããŸããŸãã
+
+ããã解決ããŸãããããªã¯ãšã¹ããåŠçããåã«ã¢ãã«ãèªã¿èŸŒã¿ãŸãããã³ãŒããããŒããããŠããæäžã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ããªã¯ãšã¹ãã®åãä»ããéå§ããçŽåã ãã«ããŸãã
+
+## Lifespan { #lifespan }
+
+ãã®ãèµ·åæããšãã·ã£ããããŠã³æãã®ããžãã¯ã¯ã`FastAPI` ã¢ããªã® `lifespan` ãã©ã¡ãŒã¿ãšãã³ã³ããã¹ããããŒãžã£ãïŒãããäœãã¯ããã«ç€ºããŸãïŒã䜿ã£ãŠå®çŸ©ã§ããŸãã
+
+ãŸãã¯äŸãèŠãŠããã詳现ã説æããŸãã
+
+次ã®ããã«ã`yield` ã䜿ãéåæé¢æ° `lifespan()` ãäœæããŸã:
+
+{* ../../docs_src/events/tutorial003_py310.py hl[16,19] *}
+
+ããã§ã¯ã`yield` ã®åã§æ©æ¢°åŠç¿ã¢ãã«ã®èŸæžã«ïŒãããŒã®ïŒã¢ãã«é¢æ°ãå
¥ããããšã§ãé«ã³ã¹ããªãèµ·åæãã®ã¢ãã«èªã¿èŸŒã¿ãã·ãã¥ã¬ãŒã·ã§ã³ããŠããŸãããã®ã³ãŒãã¯ãã¢ããªã±ãŒã·ã§ã³ããªã¯ãšã¹ãããåãä»ãå§ããåãã«ãããªãã¡èµ·åæã«å®è¡ãããŸãã
+
+ãã㊠`yield` ã®çŽåŸã§ã¢ãã«ãã¢ã³ããŒãããŸãããã®ã³ãŒãã¯ãã¢ããªã±ãŒã·ã§ã³ããªã¯ãšã¹ãåŠçããçµäºãããåŸãã·ã£ããããŠã³çŽåã«å®è¡ãããŸããããšãã°ã¡ã¢ãªã GPU ã®ãããªãªãœãŒã¹ãè§£æŸã§ããŸãã
+
+/// tip | è±ç¥è
+
+`shutdown` ã¯ãã¢ããªã±ãŒã·ã§ã³ãã忢ããããšãã«çºçããŸãã
+
+æ°ããããŒãžã§ã³ãéå§ããå¿
èŠãããããåã«å®è¡ããããããªã£ãã®ãããããŸãããð€·
+
+///
+
+### Lifespan 颿° { #lifespan-function }
+
+ãŸã泚ç®ãã¹ãã¯ã`yield` ã䜿ãéåæé¢æ°ãå®çŸ©ããŠããããšã§ããããã¯ãyield ã䜿ãäŸåé¢ä¿ïŒDependenciesïŒãã«ãšãŠããã䌌ãŠããŸãã
+
+{* ../../docs_src/events/tutorial003_py310.py hl[14:19] *}
+
+`yield` ã®åã®ååã¯ãã¢ããªã±ãŒã·ã§ã³ãéå§ããããåãã«å®è¡ãããŸãã
+
+`yield` ã®åŸåã¯ãã¢ããªã±ãŒã·ã§ã³ã®åŠçããçµäºããããåŸãã«å®è¡ãããŸãã
+
+### éåæã³ã³ããã¹ããããŒãžã£ { #async-context-manager }
+
+ãã®é¢æ°ã«ã¯ `@asynccontextmanager` ããã³ã¬ãŒããããŠããŸãã
+
+ããã«ããããã®é¢æ°ã¯ãéåæã³ã³ããã¹ããããŒãžã£ãã«ãªããŸãã
+
+{* ../../docs_src/events/tutorial003_py310.py hl[1,13] *}
+
+Python ã®ãã³ã³ããã¹ããããŒãžã£ãã¯ã`with` æã§äœ¿ãããã®ã§ããããšãã°ã`open()` ã¯ã³ã³ããã¹ããããŒãžã£ãšããŠäœ¿ããŸã:
+
+```Python
+with open("file.txt") as file:
+ file.read()
+```
+
+æè¿ã® Python ã«ã¯ãéåæã³ã³ããã¹ããããŒãžã£ãããããŸãã`async with` ã§äœ¿ããŸã:
+
+```Python
+async with lifespan(app):
+ await do_stuff()
+```
+
+ãã®ããã«ã³ã³ããã¹ããããŒãžã£ïŒãŸãã¯éåæã³ã³ããã¹ããããŒãžã£ïŒãäœããšã`with` ãããã¯ã«å
¥ãåã« `yield` ããåã®ã³ãŒããå®è¡ããã`with` ãããã¯ãåºãåŸã« `yield` ããåŸãã®ã³ãŒããå®è¡ãããŸãã
+
+äžã®ã³ãŒãäŸã§ã¯çŽæ¥ããã䜿ã£ãŠã¯ããŸããããFastAPI ã«æž¡ããŠå
éšã§äœ¿ã£ãŠããããŸãã
+
+`FastAPI` ã¢ããªã® `lifespan` ãã©ã¡ãŒã¿ã¯ãéåæã³ã³ããã¹ããããŒãžã£ããåãåãã®ã§ãæ°ããäœã£ã `lifespan` éåæã³ã³ããã¹ããããŒãžã£ãæž¡ããŸãã
+
+{* ../../docs_src/events/tutorial003_py310.py hl[22] *}
+
+## 代æ¿ã®ã€ãã³ãïŒéæšå¥šïŒ { #alternative-events-deprecated }
+
+/// warning | 泚æ
+
+æšå¥šãããæ¹æ³ã¯ãäžã§èª¬æãããšãã `FastAPI` ã¢ããªã® `lifespan` ãã©ã¡ãŒã¿ã䜿ã£ãŠãèµ·åããšãã·ã£ããããŠã³ããæ±ãããšã§ãã`lifespan` ãã©ã¡ãŒã¿ãæå®ãããšã`startup` ãš `shutdown` ã®ã€ãã³ããã³ãã©ã¯åŒã³åºãããªããªããŸãã`lifespan` ãã€ãã³ãããã©ã¡ããäžæ¹ã§ãããäž¡æ¹åæã§ã¯ãããŸããã
+
+ãã®ç¯ã¯èªã¿é£ã°ããŠãããŸããŸããã
+
+///
+
+èµ·åæãšã·ã£ããããŠã³æã«å®è¡ãããããžãã¯ãå®çŸ©ããå¥ã®æ¹æ³ããããŸãã
+
+ã¢ããªã±ãŒã·ã§ã³ãèµ·åããåããŸãã¯ã·ã£ããããŠã³ãããšãã«å®è¡ããå¿
èŠãããã€ãã³ããã³ãã©ïŒé¢æ°ïŒãå®çŸ©ã§ããŸãã
+
+ãããã®é¢æ°ã¯ `async def` ã§ããéåžžã® `def` ã§ãæ§ããŸããã
+
+### `startup` ã€ãã³ã { #startup-event }
+
+ã¢ããªã±ãŒã·ã§ã³ãéå§ãããåã«å®è¡ãã¹ã颿°ã远å ããã«ã¯ãã€ãã³ã `"startup"` ã§å®£èšããŸã:
+
+{* ../../docs_src/events/tutorial001_py310.py hl[8] *}
+
+ãã®å Žåã`startup` ã®ã€ãã³ããã³ãã©é¢æ°ã¯ items ã®ãããŒã¿ããŒã¹ãïŒåãªã `dict`ïŒãããã€ãã®å€ã§åæåããŸãã
+
+ã€ãã³ããã³ãã©é¢æ°ã¯è€æ°è¿œå ã§ããŸãã
+
+ãã¹ãŠã® `startup` ã€ãã³ããã³ãã©ãå®äºãããŸã§ãã¢ããªã±ãŒã·ã§ã³ã¯ãªã¯ãšã¹ãã®åãä»ããéå§ããŸããã
+
+### `shutdown` ã€ãã³ã { #shutdown-event }
+
+ã¢ããªã±ãŒã·ã§ã³ãã·ã£ããããŠã³ãããšãã«å®è¡ãã¹ã颿°ã远å ããã«ã¯ãã€ãã³ã `"shutdown"` ã§å®£èšããŸã:
+
+{* ../../docs_src/events/tutorial002_py310.py hl[6] *}
+
+ããã§ã¯ã`shutdown` ã®ã€ãã³ããã³ãã©é¢æ°ããããã¹ãè¡ `"Application shutdown"` ããã¡ã€ã« `log.txt` ã«æžã蟌ã¿ãŸãã
+
+/// info | æ
å ±
+
+`open()` 颿°ã® `mode="a"` ã¯ã远å ãïŒappendïŒãæå³ããŸããã€ãŸãããã®ãã¡ã€ã«ã«æ¢ã«ããå
容ãäžæžããããè¡ãåŸãã«è¿œèšãããŸãã
+
+///
+
+/// tip | è±ç¥è
+
+ãã®äŸã§ã¯ããã¡ã€ã«ãæ±ãæšæºã® Python 颿° `open()` ã䜿ã£ãŠããŸãã
+
+ãã®ããããã£ã¹ã¯ãžã®æžã蟌ã¿ããåŸ
ã€ãå¿
èŠããã I/OïŒå
¥å/åºåïŒãé¢ãããŸãã
+
+ããã `open()` èªäœã¯ `async` ã `await` ã䜿ããŸããã
+
+ãããã£ãŠãã€ãã³ããã³ãã©é¢æ°ã¯ `async def` ã§ã¯ãªãéåžžã® `def` ã§å®£èšããŠããŸãã
+
+///
+
+### `startup` ãš `shutdown` ããŸãšã㊠{ #startup-and-shutdown-together }
+
+èµ·åæãšã·ã£ããããŠã³æã®ããžãã¯ã¯é¢é£ããŠããããšãå€ãã§ããäœããéå§ããŠããçµäºãããããªãœãŒã¹ãç²åŸããŠããè§£æŸãããããªã©ã§ã.
+
+å
±æããããžãã¯ã倿°ã®ãªãå¥ã
ã®é¢æ°ã§ãããè¡ãã®ã¯é£ãããã°ããŒãã«å€æ°ãªã©ã«å€ãä¿åããå¿
èŠãåºãŠããŸãã
+
+ãã®ãããçŸåšã¯äžã§èª¬æãããšãã `lifespan` ã䜿ãããšãæšå¥šãããŠããŸãã
+
+## æè¡è©³çް { #technical-details }
+
+æè¡ãæ°ã«ãªãæ¹ãžã®çްããªè©³çްã§ããð€
+
+å
éšçã«ã¯ãASGI ã®æè¡ä»æ§ã«ãããŠããã㯠<a href="https://asgi.readthedocs.io/en/latest/specs/lifespan.html" class="external-link" target="_blank">Lifespan ãããã³ã«</a> ã®äžéšã§ããã`startup` ãš `shutdown` ãšããã€ãã³ããå®çŸ©ãããŠããŸãã
+
+/// info | æ
å ±
+
+Starlette ã® `lifespan` ãã³ãã©ã«ã€ããŠã¯ã<a href="https://www.starlette.dev/lifespan/" class="external-link" target="_blank">Starlette ã® Lifespan ããã¥ã¡ã³ã</a>ã§è©³ããèªãããšãã§ããŸãã
+
+ã³ãŒãã®ä»ã®é åã§äœ¿ãã lifespan ã®ç¶æ
ãã©ã®ããã«æ±ãããå«ãŸããŠããŸãã
+
+///
+
+## ãµãã¢ããªã±ãŒã·ã§ã³ { #sub-applications }
+
+ðš ãããã® lifespan ã€ãã³ãïŒstartup ãš shutdownïŒã¯ã¡ã€ã³ã®ã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠã®ã¿å®è¡ããã[ãµãã¢ããªã±ãŒã·ã§ã³ - ããŠã³ã](sub-applications.md){.internal-link target=_blank} ã«ã¯å®è¡ãããªãããšã«æ³šæããŠãã ããã
--- /dev/null
+# SDK ã®çæ { #generating-sdks }
+
+**FastAPI** 㯠**OpenAPI** 仿§ã«åºã¥ããŠããããããã® API ã¯å€ãã®ããŒã«ãçè§£ã§ããæšæºåœ¢åŒã§èšè¿°ã§ããŸãã
+
+ããã«ãããææ°ã®**ããã¥ã¡ã³ã**ãè€æ°èšèªã®ã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªïŒ<abbr title="Software Development Kits - ãœãããŠã§ã¢éçºããã">**SDKs**</abbr>ïŒããããŠã³ãŒããšåæãç¶ãã**ãã¹ã**ã**èªååã¯ãŒã¯ãããŒ**ã容æã«çæã§ããŸãã
+
+æ¬ã¬ã€ãã§ã¯ãFastAPI ããã¯ãšã³ãåãã® **TypeScript SDK** ãçæããæ¹æ³ã説æããŸãã
+
+## ãªãŒããœãŒã¹ã® SDK ãžã§ãã¬ãŒã¿ { #open-source-sdk-generators }
+
+å€çšéãªéžæè¢ãšã㊠<a href="https://openapi-generator.tech/" class="external-link" target="_blank">OpenAPI Generator</a> ããããŸããããã¯**倿°ã®ããã°ã©ãã³ã°èšèª**ããµããŒãããOpenAPI 仿§ãã SDK ãçæã§ããŸãã
+
+**TypeScript ã¯ã©ã€ã¢ã³ã**åãã«ã¯ã<a href="https://heyapi.dev/" class="external-link" target="_blank">Hey API</a> ãç®çç¹åã®ãœãªã¥ãŒã·ã§ã³ã§ãTypeScript ãšã³ã·ã¹ãã ã«æé©åãããäœéšãæäŸããŸãã
+
+ä»ã® SDK ãžã§ãã¬ãŒã¿ã¯ <a href="https://openapi.tools/#sdk" class="external-link" target="_blank">OpenAPI.Tools</a> ã§ãèŠã€ããããŸãã
+
+/// tip | è±ç¥è
+
+FastAPI ã¯èªåçã« **OpenAPI 3.1** ã®ä»æ§ãçæããŸãããããã£ãŠã䜿çšããããŒã«ã¯ãã®ããŒãžã§ã³ããµããŒãããŠããå¿
èŠããããŸãã
+
+///
+
+## FastAPI ã¹ãã³ãµãŒã«ãã SDK ãžã§ãã¬ãŒã¿ { #sdk-generators-from-fastapi-sponsors }
+
+ãã®ã»ã¯ã·ã§ã³ã§ã¯ãFastAPI ãã¹ãã³ãµãŒããŠããäŒæ¥ã«ããã**ãã³ãã£ãŒæ¯æŽ**ããã³**äŒæ¥æ¯æŽ**ã®ãœãªã¥ãŒã·ã§ã³ã玹ä»ããŸãããããã®è£œåã¯ãé«å質ãªçæ SDK ã«å ããŠã**è¿œå æ©èœ**ã**çµ±å**ãæäŸããŸãã
+
+âš [**FastAPI ãã¹ãã³ãµãŒãã**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} âš ããšã§ããããã®äŒæ¥ã¯ãã¬ãŒã ã¯ãŒã¯ãšãã®**ãšã³ã·ã¹ãã **ã®å¥å
šæ§ãš**æç¶å¯èœæ§**ãæ¯æŽããŠããŸãã
+
+ãã®æ¯æŽã¯ãFastAPI ã®**ã³ãã¥ããã£**ïŒçããïŒãžã®åŒ·ãã³ãããã¡ã³ãã®è¡šæã§ãããã**åªãããµãŒãã¹**ã®æäŸã ãã§ãªããå
ç¢ã§çºå±ãããã¬ãŒã ã¯ãŒã¯ FastAPI ãæ¯ããå§¿å¢ã瀺ããŠããŸããð
+
+äŸãã°ã次ã®ãããªãã®ããããŸã:
+
+* <a href="https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship" class="external-link" target="_blank">Speakeasy</a>
+* <a href="https://www.stainless.com/?utm_source=fastapi&utm_medium=referral" class="external-link" target="_blank">Stainless</a>
+* <a href="https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi" class="external-link" target="_blank">liblab</a>
+
+ãããã®ãœãªã¥ãŒã·ã§ã³ã®äžã«ã¯ãªãŒãã³ãœãŒã¹ãç¡ææ ãæäŸãããã®ããããééçã³ãããã¡ã³ããªãã§è©Šãããšãã§ããŸããä»ã®åçš SDK ãžã§ãã¬ãŒã¿ãååšãããªã³ã©ã€ã³ã§èŠã€ããããŸããð€
+
+## TypeScript SDK ãäœæãã { #create-a-typescript-sdk }
+
+ãŸãã¯ç°¡å㪠FastAPI ã¢ããªããå§ããŸã:
+
+{* ../../docs_src/generate_clients/tutorial001_py310.py hl[7:9,12:13,16:17,21] *}
+
+ããã§ã*path operation* ã¯ãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã®ãã€ããŒãã«äœ¿çšããã¢ãã«ãå®çŸ©ããŠããã`Item` ãš `ResponseMessage` ã䜿ã£ãŠããŸãã
+
+### API ããã¥ã¡ã³ã { #api-docs }
+
+`/docs` ã«ç§»åãããšããªã¯ãšã¹ãã§éä¿¡ã»ã¬ã¹ãã³ã¹ã§åä¿¡ããããŒã¿ã®**ã¹ããŒã**ã衚瀺ãããŸã:
+
+<img src="/img/tutorial/generate-clients/image01.png">
+
+ãããã®ã¹ããŒãã¯ãã¢ããªå
ã§ã¢ãã«ãšããŠå®£èšãããŠãããã衚瀺ãããŸãã
+
+ãã®æ
å ±ã¯ã¢ããªã® **OpenAPI ã¹ããŒã**ã«å«ãŸããAPI ããã¥ã¡ã³ãã«è¡šç€ºãããŸãã
+
+OpenAPI ã«å«ãŸãããããã®ã¢ãã«æ
å ±ã䜿ã£ãŠã**ã¯ã©ã€ã¢ã³ãã³ãŒããçæ**ã§ããŸãã
+
+### Hey API { #hey-api }
+
+ã¢ãã«ãåãã FastAPI ã¢ããªãããã°ãHey API ã§ TypeScript ã¯ã©ã€ã¢ã³ããçæã§ããŸããæãææ©ãæ¹æ³ã¯ npx ã䜿ãããšã§ãã
+
+```sh
+npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client
+```
+
+ããã§ TypeScript SDK ã `./src/client` ã«çæãããŸãã
+
+<a href="https://heyapi.dev/openapi-ts/get-started" class="external-link" target="_blank">`@hey-api/openapi-ts` ã®ã€ã³ã¹ããŒã«æ¹æ³</a>ãã<a href="https://heyapi.dev/openapi-ts/output" class="external-link" target="_blank">çæç©ã®è©³çް</a>ã¯å
¬åŒãµã€ããåç
§ããŠãã ããã
+
+### SDK ã®å©çš { #using-the-sdk }
+
+ããã§ã¯ã©ã€ã¢ã³ãã³ãŒãã import ããŠå©çšã§ããŸããäŸãã°æ¬¡ã®ããã«ãªããã¡ãœããã«å¯ŸããŠè£å®ãå¹ããŸã:
+
+<img src="/img/tutorial/generate-clients/image02.png">
+
+éä¿¡ãããã€ããŒãã«ãè£å®ãé©çšãããŸã:
+
+<img src="/img/tutorial/generate-clients/image03.png">
+
+/// tip | è±ç¥è
+
+FastAPI ã¢ããªã® `Item` ã¢ãã«ã§å®çŸ©ãã `name` ãš `price` ã«è£å®ãå¹ããŠããç¹ã«æ³šç®ããŠãã ããã
+
+///
+
+éä¿¡ããŒã¿ã«å¯Ÿããã€ã³ã©ã€ã³ãšã©ãŒã衚瀺ãããŸã:
+
+<img src="/img/tutorial/generate-clients/image04.png">
+
+ã¬ã¹ãã³ã¹ãªããžã§ã¯ãã«ãè£å®ããããŸã:
+
+<img src="/img/tutorial/generate-clients/image05.png">
+
+## ã¿ã°ä»ãã® FastAPI ã¢ã㪠{ #fastapi-app-with-tags }
+
+å®éçšã§ã¯ã¢ããªã¯å€§ãããªãã*path operation* ã®ã°ã«ãŒãåãã«ã¿ã°ã䜿ãããšãå€ãã§ãããã
+
+äŸãã° **items** çšãš **users** çšã®ã»ã¯ã·ã§ã³ããããã¿ã°ã§åããããŸã:
+
+{* ../../docs_src/generate_clients/tutorial002_py310.py hl[21,26,34] *}
+
+### ã¿ã°ä»ã TypeScript ã¯ã©ã€ã¢ã³ãã®çæ { #generate-a-typescript-client-with-tags }
+
+ã¿ã°ãçšãã FastAPI ã¢ããªããã¯ã©ã€ã¢ã³ããçæãããšãéåžžã¯ã©ã€ã¢ã³ãåŽã®ã³ãŒããã¿ã°ããšã«åå²ãããŸãã
+
+ããã«ãããã¯ã©ã€ã¢ã³ãã³ãŒããæ£ããæŽçã»ã°ã«ãŒãã³ã°ãããŸã:
+
+<img src="/img/tutorial/generate-clients/image06.png">
+
+ãã®äŸã§ã¯æ¬¡ã®ããã«ãªããŸã:
+
+* `ItemsService`
+* `UsersService`
+
+### ã¯ã©ã€ã¢ã³ãã®ã¡ãœããå { #client-method-names }
+
+çŸç¶ã§ã¯ãçæãããã¡ãœããåïŒ`createItemItemsPost` ãªã©ïŒã¯ããŸããããã§ã¯ãããŸãã:
+
+```TypeScript
+ItemsService.createItemItemsPost({name: "Plumbus", price: 5})
+```
+
+ããã¯ãã¯ã©ã€ã¢ã³ããžã§ãã¬ãŒã¿ãå *path operation* ã® OpenAPI å
éšã® **operation ID** ãçšããããã§ãã
+
+OpenAPI ã§ã¯ operation ID ã¯å
šãŠã® *path operation* ãéããŠäžæã§ããå¿
èŠããããŸãããã®ãã FastAPI ã¯**颿°å**ã**ãã¹**ã**HTTP ã¡ãœãã/ãªãã¬ãŒã·ã§ã³**ãçµã¿åãã㊠operation ID ãçæããäžææ§ãä¿èšŒããŸãã
+
+次ã«ãããæ¹åããæ¹æ³ã瀺ããŸããð€
+
+## ã«ã¹ã¿ã operation ID ãšããè¯ãã¡ãœããå { #custom-operation-ids-and-better-method-names }
+
+operation ID ã®**çææ¹æ³**ã**倿Ž**ããŠç°¡æœã«ããã¯ã©ã€ã¢ã³ãåŽã®**ã¡ãœããåãã·ã³ãã«**ã«ã§ããŸãã
+
+ãã®å Žåã§ãå operation ID ã**äžæ**ã§ããããšã¯å¥ã®æ¹æ³ã§ä¿èšŒããå¿
èŠããããŸãã
+
+äŸãã°ãå *path operation* ã«ã¿ã°ãä»ãã**ã¿ã°**ãš *path operation* ã®**åå**ïŒé¢æ°åïŒãã operation ID ãçæã§ããŸãã
+
+### äžæ ID çæé¢æ°ã®ã«ã¹ã¿ãã€ãº { #custom-generate-unique-id-function }
+
+FastAPI ã¯å *path operation* ã«**äžæ ID**ãçšããŠããããã㯠**operation ID** ã®ã»ããå¿
èŠã«å¿ããŠãªã¯ãšã¹ããã¬ã¹ãã³ã¹ã®ã«ã¹ã¿ã ã¢ãã«åã«ã䜿ãããŸãã
+
+ãã®é¢æ°ã¯ã«ã¹ã¿ãã€ãºå¯èœã§ãã`APIRoute` ãåãåããæååãè¿ããŸãã
+
+äŸãã°ããã§ã¯ãæåã®ã¿ã°ïŒé垞㯠1 ã€ïŒãš *path operation* åïŒé¢æ°åïŒã䜿ããŸãã
+
+ãã®ã«ã¹ã¿ã 颿°ã **FastAPI** ã® `generate_unique_id_function` ãã©ã¡ãŒã¿ã«æž¡ããŸã:
+
+{* ../../docs_src/generate_clients/tutorial003_py310.py hl[6:7,10] *}
+
+### ã«ã¹ã¿ã operation ID ã§ TypeScript ã¯ã©ã€ã¢ã³ããçæ { #generate-a-typescript-client-with-custom-operation-ids }
+
+ãã®ç¶æ
ã§ã¯ã©ã€ã¢ã³ããåçæãããšãã¡ãœããåãæ¹åãããŠããŸã:
+
+<img src="/img/tutorial/generate-clients/image07.png">
+
+ã芧ã®ãšãããã¡ãœããåã¯ã¿ã°åãšé¢æ°åã®ã¿ã«ãªããURL ãã¹ã HTTP ãªãã¬ãŒã·ã§ã³ã®æ
å ±ã¯å«ãŸããŸããã
+
+### ã¯ã©ã€ã¢ã³ãçæåãã® OpenAPI 仿§ã®ååŠç { #preprocess-the-openapi-specification-for-the-client-generator }
+
+ããã§ãçæã³ãŒãã«ã¯**éè€æ
å ±**ãæ®ã£ãŠããŸãã
+
+`ItemsService`ïŒã¿ã°ç±æ¥ïŒãã items é¢é£ã§ããããšã¯ãã§ã«åããã®ã«ãã¡ãœããåã«ãã¿ã°åãå眮ãããŠããŸããð
+
+OpenAPI å
šäœãšããŠã¯ operation ID ã®**äžææ§**ã®ããã«ããã®ãã¬ãã£ãã¯ã¹ãç¶æãããå Žåãããã§ãããã
+
+ãããçæã¯ã©ã€ã¢ã³ãçšã«ã¯ãã¯ã©ã€ã¢ã³ããçæããçŽåã« OpenAPI ã® operation ID ã**å å·¥**ããŠãã¡ãœããåããã**èŠããã**ã**ã¯ãªãŒã³**ã«ã§ããŸãã
+
+OpenAPI ã® JSON ã `openapi.json` ãšããŠä¿åããæ¬¡ã®ãããªã¹ã¯ãªããã§**ãã®ã¿ã°ã®ãã¬ãã£ãã¯ã¹ãé€å»**ã§ããŸã:
+
+{* ../../docs_src/generate_clients/tutorial004_py310.py *}
+
+//// tab | Node.js
+
+```Javascript
+{!> ../../docs_src/generate_clients/tutorial004.js!}
+```
+
+////
+
+ããã«ãã operation ID 㯠`items-get_items` ã®ãããªåœ¢ããåãªã `get_items` ã«çœ®ãæãããã¯ã©ã€ã¢ã³ããžã§ãã¬ãŒã¿ã¯ããç°¡æœãªã¡ãœããåãçæã§ããŸãã
+
+### ååŠçæžã¿ OpenAPI ãã TypeScript ã¯ã©ã€ã¢ã³ããçæ { #generate-a-typescript-client-with-the-preprocessed-openapi }
+
+çæå
ã `openapi.json` ã«ãªã£ãã®ã§ãå
¥åã®å ŽæãæŽæ°ããŸã:
+
+```sh
+npx @hey-api/openapi-ts -i ./openapi.json -o src/client
+```
+
+æ°ããã¯ã©ã€ã¢ã³ããçæãããšã**ã¯ãªãŒã³ãªã¡ãœããå**ã«ãªãã**è£å®**ã**ã€ã³ã©ã€ã³ãšã©ãŒ**ãªã©ããã®ãŸãŸå©çšã§ããŸã:
+
+<img src="/img/tutorial/generate-clients/image08.png">
+
+## å©ç¹ { #benefits }
+
+èªåçæãããã¯ã©ã€ã¢ã³ãã䜿ããšã次ã®ãããªå¯Ÿè±¡ã§**è£å®**ãåŸãããŸã:
+
+* ã¡ãœãã
+* æ¬äœã®ãªã¯ãšã¹ããã€ããŒããã¯ãšãªãã©ã¡ãŒã¿ç
+* ã¬ã¹ãã³ã¹ã®ãã€ããŒã
+
+ãŸããããããç®æã§**ã€ã³ã©ã€ã³ãšã©ãŒ**ãåŸãããŸãã
+
+ããã¯ãšã³ãã³ãŒããæŽæ°ããŠããã³ããšã³ãã**åçæ**ããã°ãæ°ãã *path operation* ã¯ã¡ãœãããšããŠè¿œå ãããå€ããã®ã¯åé€ããããã®ä»ã®å€æŽãçæã³ãŒãã«åæ ãããŸããð€
+
+ã€ãŸãã倿Žãããã°èªåçã«ã¯ã©ã€ã¢ã³ãã³ãŒãã«**åæ **ãããŸããã¯ã©ã€ã¢ã³ãã**ãã«ã**ããã°ã䜿çšããŒã¿ã«**äžæŽå**ãããã°ãšã©ãŒã«ãªããŸãã
+
+ãã®çµæãå€ãã®ãšã©ãŒãéçºã®åææ®µéã§**æ©æçºèŠ**ã§ããæ¬çªã§æçµãŠãŒã¶ãŒã«äžå
·åãçŸããŠããåå ããããã°ããå¿
èŠããªããªããŸããâš
--- /dev/null
+# é«åºŠãªããã«ãŠã§ã¢ { #advanced-middleware }
+
+ã¡ã€ã³ã®ãã¥ãŒããªã¢ã«ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã«[ã«ã¹ã¿ã ããã«ãŠã§ã¢](../tutorial/middleware.md){.internal-link target=_blank}ã远å ããæ¹æ³ãåŠã³ãŸããã
+
+ãããŠã[`CORSMiddleware` ã䜿ã£ã CORS ã®æ±ãæ¹](../tutorial/cors.md){.internal-link target=_blank}ãåŠã³ãŸããã
+
+ãã®ã»ã¯ã·ã§ã³ã§ã¯ããã®ä»ã®ããã«ãŠã§ã¢ã®äœ¿ãæ¹ãèŠãŠãããŸãã
+
+## ASGI ããã«ãŠã§ã¢ã®è¿œå { #adding-asgi-middlewares }
+
+**FastAPI** 㯠Starlette ãåºç€ãšããŠããã<abbr title="Asynchronous Server Gateway Interface - éåæãµãŒããŒã²ãŒããŠã§ã€ã€ã³ã¿ãŒãã§ãŒã¹">ASGI</abbr> 仿§ãå®è£
ããŠãããããä»»æã® ASGI ããã«ãŠã§ã¢ãå©çšã§ããŸãã
+
+ããã«ãŠã§ã¢ã¯ ASGI 仿§ã«åŸã£ãŠããã°ãFastAPI ã Starlette å°çšã«äœãããŠããªããŠãåäœããŸãã
+
+äžè¬ã«ãASGI ããã«ãŠã§ã¢ã¯æåã®åŒæ°ãšã㊠ASGI ã¢ããªãåãåãã¯ã©ã¹ã§ãã
+
+ãã®ããããµãŒãããŒãã£ã® ASGI ããã«ãŠã§ã¢ã®ããã¥ã¡ã³ãã§ã¯ãããããæ¬¡ã®ããã«æžãããŠããã§ããã:
+
+```Python
+from unicorn import UnicornMiddleware
+
+app = SomeASGIApp()
+
+new_app = UnicornMiddleware(app, some_config="rainbow")
+```
+
+ããã FastAPIïŒæ£ç¢ºã«ã¯ StarletteïŒã¯ãå
éšããã«ãŠã§ã¢ããµãŒããŒãšã©ãŒãåŠçããã«ã¹ã¿ã äŸå€ãã³ãã©ãæ£ããåäœããããšãä¿èšŒãããããç°¡åãªæ¹æ³ãæäŸããŠããŸãã
+
+ãã®ããã«ã¯ïŒCORS ã®äŸãšåæ§ã«ïŒ`app.add_middleware()` ã䜿ããŸãã
+
+```Python
+from fastapi import FastAPI
+from unicorn import UnicornMiddleware
+
+app = FastAPI()
+
+app.add_middleware(UnicornMiddleware, some_config="rainbow")
+```
+
+`app.add_middleware()` ã¯ãæåã®åŒæ°ã«ããã«ãŠã§ã¢ã®ã¯ã©ã¹ãåãããã以å€ã®è¿œå åŒæ°ã¯ããã«ãŠã§ã¢ã«æž¡ãããŸãã
+
+## çµã¿èŸŒã¿ããã«ãŠã§ã¢ { #integrated-middlewares }
+
+**FastAPI** ã¯äžè¬çãªãŠãŒã¹ã±ãŒã¹ã«å¯Ÿå¿ããããã€ãã®ããã«ãŠã§ã¢ãå«ãã§ããŸãã以äžã§ãã®äœ¿ãæ¹ãèŠãŠãããŸãã
+
+/// note | æè¡è©³çް
+
+以äžã®äŸã§ã¯ã`from starlette.middleware.something import SomethingMiddleware` ã䜿ãããšãã§ããŸãã
+
+**FastAPI** ã¯éçºè
ã§ããããªãã®äŸ¿å®ã®ããã« `fastapi.middleware` ã«ããã€ãã®ããã«ãŠã§ã¢ãæäŸããŠããŸããããããå©çšå¯èœãªããã«ãŠã§ã¢ã®å€ã㯠Starlette ããçŽæ¥æäŸãããŠããŸãã
+
+///
+
+## `HTTPSRedirectMiddleware` { #httpsredirectmiddleware }
+
+ãã¹ãŠã®åä¿¡ãªã¯ãšã¹ãã `https` ãŸã㯠`wss` ã§ãªããã°ãªããªãããã«åŒ·å¶ããŸãã
+
+`http` ãŸã㯠`ws` ãžã®åä¿¡ãªã¯ãšã¹ãã¯ãå®å
šãªã¹ããŒã ã«ãªãã€ã¬ã¯ããããŸãã
+
+{* ../../docs_src/advanced_middleware/tutorial001_py310.py hl[2,6] *}
+
+## `TrustedHostMiddleware` { #trustedhostmiddleware }
+
+HTTP Host Header æ»æãé²ãããããã¹ãŠã®åä¿¡ãªã¯ãšã¹ãã«æ£ããèšå®ããã `Host` ããããŒã匷å¶ããŸãã
+
+{* ../../docs_src/advanced_middleware/tutorial002_py310.py hl[2,6:8] *}
+
+ãµããŒããããåŒæ°ã¯æ¬¡ã®ãšããã§ã:
+
+- `allowed_hosts` - èš±å¯ãããã¹ãåã®ãã¡ã€ã³åãªã¹ãã`*.example.com` ã®ãããªã¯ã€ã«ãã«ãŒããã¡ã€ã³ã§ãµããã¡ã€ã³ã®ãããã³ã°ããµããŒãããŸããä»»æã®ãã¹ãåãèš±å¯ããã«ã¯ã`allowed_hosts=["*"]` ã䜿ããããã®ããã«ãŠã§ã¢ãçç¥ããŸãã
+- `www_redirect` - True ã«èšå®ãããšãèš±å¯ããããã¹ãã®é www çãžã®ãªã¯ãšã¹ãã www çãžãªãã€ã¬ã¯ãããŸããããã©ã«ã㯠`True` ã§ãã
+
+åä¿¡ãªã¯ãšã¹ããæ£ããæ€èšŒãããªãå Žåã`400` ã®ã¬ã¹ãã³ã¹ãè¿ãããŸãã
+
+## `GZipMiddleware` { #gzipmiddleware }
+
+`Accept-Encoding` ããããŒã« "gzip" ãå«ããªã¯ãšã¹ãã«å¯Ÿã㊠GZip ã¬ã¹ãã³ã¹ãåŠçããŸãã
+
+ãã®ããã«ãŠã§ã¢ã¯ãéåžžã®ã¬ã¹ãã³ã¹ãšã¹ããªãŒãã³ã°ã¬ã¹ãã³ã¹ã®äž¡æ¹ãåŠçããŸãã
+
+{* ../../docs_src/advanced_middleware/tutorial003_py310.py hl[2,6] *}
+
+ãµããŒããããåŒæ°ã¯æ¬¡ã®ãšããã§ã:
+
+- `minimum_size` - ãã®ãã€ãæ°ã®æå°ãµã€ãºæªæºã®ã¬ã¹ãã³ã¹ã¯ GZip å§çž®ããŸãããããã©ã«ã㯠`500` ã§ãã
+- `compresslevel` - GZip å§çž®æã«äœ¿çšããŸãã1 ãã 9 ãŸã§ã®æŽæ°ã§ããããã©ã«ã㯠`9`ãå€ãå°ããã»ã©å§çž®ã¯éããªããŸãããã¡ã€ã«ãµã€ãºã¯å€§ãããªããå€ã倧ããã»ã©å§çž®ã¯é
ããªããŸãããã¡ã€ã«ãµã€ãºã¯å°ãããªããŸãã
+
+## ãã®ä»ã®ããã«ãŠã§ã¢ { #other-middlewares }
+
+ä»ã«ãå€ãã® ASGI ããã«ãŠã§ã¢ããããŸãã
+
+äŸãã°:
+
+- <a href="https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py" class="external-link" target="_blank">Uvicorn ã® `ProxyHeadersMiddleware`</a>
+- <a href="https://github.com/florimondmanca/msgpack-asgi" class="external-link" target="_blank">MessagePack</a>
+
+ä»ã«å©çšå¯èœãªããã«ãŠã§ã¢ã«ã€ããŠã¯ã<a href="https://www.starlette.dev/middleware/" class="external-link" target="_blank">Starlette ã®ããã«ãŠã§ã¢ããã¥ã¡ã³ã</a>ã <a href="https://github.com/florimondmanca/awesome-asgi" class="external-link" target="_blank">ASGI Awesome List</a> ãåç
§ããŠãã ããã
--- /dev/null
+# OpenAPI ã³ãŒã«ãã㯠{ #openapi-callbacks }
+
+ããªãã¯ã*path operation* ãæã€ API ãäœæããä»è
ïŒå€ãã®å Žåãããªãã® API ããå©çšãããåäžã®éçºè
ïŒãäœæãã *å€éš API* ãžãªã¯ãšã¹ããããªã¬ãŒã§ããããã«ã§ããŸãã
+
+ããªãã® API ã¢ããªã *å€éš API* ãåŒã³åºããšãã«èµ·ããåŠçã¯ãã³ãŒã«ããã¯ããšåŒã°ããŸãããªããªããå€éšéçºè
ãäœæãããœãããŠã§ã¢ãããªãã® API ã«ãªã¯ãšã¹ããéãããã®åŸã§ããªãã® API ããåŒã³è¿ããã*å€éš API*ïŒããããåãéçºè
ãäœæïŒãžãªã¯ãšã¹ããéãããã§ãã
+
+ãã®å Žåããã® *å€éš API* ãã©ã®ããã§ãããã¹ããããããã¥ã¡ã³ãåããããªãã§ããããã©ã㪠*path operation* ãæã¡ãã©ããªããã£ãåãåããã©ããªã¬ã¹ãã³ã¹ãè¿ããããªã©ã§ãã
+
+## ã³ãŒã«ããã¯ã®ããã¢ã㪠{ #an-app-with-callbacks }
+
+äŸã§èŠãŠãããŸãã
+
+ããªããè«æ±æžãäœæã§ããã¢ããªãéçºããŠãããšæ³åããŠãã ããã
+
+ãããã®è«æ±æžã¯ `id`ã`title`ïŒä»»æïŒã`customer`ã`total` ãæã¡ãŸãã
+
+ããªãã® API ã®å©çšè
ïŒå€éšéçºè
ïŒã¯ãPOST ãªã¯ãšã¹ãã§ããªãã® API ã«è«æ±æžãäœæããŸãã
+
+ãã®åŸãããªãã® API ã¯ïŒä»®ã«ããããŸãããïŒ:
+
+* å€éšéçºè
ã®é¡§å®¢ã«è«æ±æžãéããŸãã
+* 代éãååããŸãã
+* API å©çšè
ïŒå€éšéçºè
ïŒã«éç¥ãéãè¿ããŸãã
+ * ããã¯ïŒããªãã® API ããïŒå€éšéçºè
ãæäŸãã *å€éš API* ã« POST ãªã¯ãšã¹ããéãããšã§è¡ãããŸãïŒããããã³ãŒã«ããã¯ãã§ãïŒã
+
+## éåžžã® FastAPI ã¢ã㪠{ #the-normal-fastapi-app }
+
+ãŸããã³ãŒã«ããã¯ã远å ããåã®éåžžã® API ã¢ããªãã©ããªããèŠãŠã¿ãŸãããã
+
+`Invoice` ããã£ãåãåããã¯ãšãªãã©ã¡ãŒã¿ `callback_url` ã«ã³ãŒã«ããã¯çšã® URL ãå«ãã *path operation* ãæã¡ãŸãã
+
+ãã®éšåã¯ãšãŠãæ®éã§ãã»ãšãã©ã®ã³ãŒãã¯ãã§ã«èŠèŠããããã¯ãã§ã:
+
+{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[7:11,34:51] *}
+
+/// tip | è±ç¥è
+
+`callback_url` ã¯ãšãªãã©ã¡ãŒã¿ã¯ãPydantic ã® <a href="https://docs.pydantic.dev/latest/api/networks/" class="external-link" target="_blank">Url</a> åã䜿çšããŸãã
+
+///
+
+å¯äžã®æ°ããç¹ã¯ã*path operation ãã³ã¬ãŒã¿*ã®åŒæ°ãšã㊠`callbacks=invoices_callback_router.routes` ãæž¡ãããšã§ãããããäœãã¯æ¬¡ã§èŠãŸãã
+
+## ã³ãŒã«ããã¯ã®ããã¥ã¡ã³ãå { #documenting-the-callback }
+
+å®éã®ã³ãŒã«ããã¯ã®ã³ãŒãã¯ãããªãèªèº«ã® API ã¢ããªã«å€§ããäŸåããŸãã
+
+ãããŠã¢ããªããšã«å€§ããç°ãªãã§ãããã
+
+ããã¯æ¬¡ã®ããã« 1ã2 è¡ã®ã³ãŒããããããŸãã:
+
+```Python
+callback_url = "https://example.com/api/v1/invoices/events/"
+httpx.post(callback_url, json={"description": "Invoice paid", "paid": True})
+```
+
+ããããããããã³ãŒã«ããã¯ã§æãéèŠãªç¹ã¯ãããªãã® API å©çšè
ïŒå€éšéçºè
ïŒãã*ããªãã® API* ãã³ãŒã«ããã¯ã®ãªã¯ãšã¹ãããã£ãªã©ã§éãããŒã¿ã«åŸã£ãŠã*å€éš API* ãæ£ããå®è£
ããããšã確å®ã«ããããšã§ãã
+
+ããã§æ¬¡ã«è¡ãã®ã¯ã*ããªãã® API* ããã®ã³ãŒã«ããã¯ãåãåãããã«ããã® *å€éš API* ãã©ãããã¹ãããããã¥ã¡ã³ãåããã³ãŒãã远å ããããšã§ãã
+
+ãã®ããã¥ã¡ã³ãã¯ããªãã® API ã® `/docs` ã® Swagger UI ã«è¡šç€ºãããå€éšéçºè
ã« *å€éš API* ã®äœãæ¹ãç¥ãããŸãã
+
+ãã®äŸã§ã¯ã³ãŒã«ããã¯èªäœã¯å®è£
ããŸããïŒãã㯠1 è¡ã®ã³ãŒãã§ãããã§ãããïŒãããã¥ã¡ã³ãéšåã®ã¿ã§ãã
+
+/// tip | è±ç¥è
+
+å®éã®ã³ãŒã«ããã¯ã¯åãªã HTTP ãªã¯ãšã¹ãã§ãã
+
+èªåã§ã³ãŒã«ããã¯ãå®è£
ããå Žåã¯ã<a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a> ã <a href="https://requests.readthedocs.io/" class="external-link" target="_blank">Requests</a> ã®ãããªãã®ã䜿ããŸãã
+
+///
+
+## ã³ãŒã«ããã¯ã®ããã¥ã¡ã³ãçšã³ãŒããæžã { #write-the-callback-documentation-code }
+
+ãã®ã³ãŒãã¯ããªãã®ã¢ããªã§å®è¡ãããŸããã*å€éš API* ãã©ãããã¹ãããããã¥ã¡ã³ãåããããã ãã«å¿
èŠã§ãã
+
+ããããããªãã¯ãã§ã« **FastAPI** ã§ API ã®èªåããã¥ã¡ã³ããç°¡åã«äœãæ¹æ³ãç¥ã£ãŠããŸãã
+
+ãã®ç¥èã䜿ã£ãŠã*å€éš API* ãã©ãããã¹ãããããã¥ã¡ã³ãåããŸãâŠâŠã€ãŸããå€éš API ãå®è£
ãã¹ã *path operation(s)*ïŒããªãã® API ãåŒã³åºããã®ïŒãäœæããŸãã
+
+/// tip | è±ç¥è
+
+ã³ãŒã«ããã¯ãããã¥ã¡ã³ãåããã³ãŒããæžããšãã¯ãããªãããã®ãå€éšéçºè
ãã ãšæ³åããã®ã圹ã«ç«ã€ãããããŸãããããŸå®è£
ããŠããã®ã¯ãããªãã® APIãã§ã¯ãªãã*å€éš API* ã§ãã
+
+ãã®ïŒå€éšéçºè
ã®ïŒèŠç¹ãäžæçã«æ¡çšãããšããã® *å€éš API* ã«å¯ŸããŠãã©ã¡ãŒã¿ãããã£çšã® Pydantic ã¢ãã«ãã¬ã¹ãã³ã¹ãªã©ãã©ãã«çœ®ãã®ãèªç¶ããããæç¢ºã«æããããã§ãããã
+
+///
+
+### ã³ãŒã«ããã¯çš APIRouter ãäœæ { #create-a-callback-apirouter }
+
+ãŸãã1 ã€ä»¥äžã®ã³ãŒã«ããã¯ãå«ãæ°ãã `APIRouter` ãäœæããŸãã
+
+{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[1,23] *}
+
+### ã³ãŒã«ããã¯ã® path operation ãäœæ { #create-the-callback-path-operation }
+
+äžã§äœæããã®ãšåã `APIRouter` ã䜿ã£ãŠãã³ãŒã«ããã¯ã® *path operation* ãäœæããŸãã
+
+èŠãç®ã¯éåžžã® FastAPI ã® *path operation* ãšåãã§ã:
+
+* åãåãããã£ã®å®£èšïŒäŸ: `body: InvoiceEvent`ïŒãå¿
èŠã§ãããã
+* è¿ãã¬ã¹ãã³ã¹ã®å®£èšïŒäŸ: `response_model=InvoiceEventReceived`ïŒãæãŠãŸãã
+
+{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[14:16,19:20,26:30] *}
+
+éåžžã® *path operation* ãšç°ãªãäž»ãªç¹ã 2 ã€ãããŸã:
+
+* å®éã®ã³ãŒãã¯äžèŠã§ããããªãã®ã¢ããªã¯ãã®ã³ãŒããæ±ºããŠåŒã³ãŸããããã㯠*å€éš API* ãããã¥ã¡ã³ãåããããã ãã«äœ¿ãããŸãããããã£ãŠã颿°æ¬äœã¯ `pass` ã§æ§ããŸããã
+* *ãã¹* ã«ã¯ã*ããªãã® API* ã«éãããå
ã®ãªã¯ãšã¹ãã®ãã©ã¡ãŒã¿ãäžéšã倿°ãšããŠäœ¿ãã <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression" class="external-link" target="_blank">OpenAPI 3 ã®åŒ</a>ïŒåŸè¿°ïŒãå«ããããŸãã
+
+### ã³ãŒã«ããã¯ã®ãã¹åŒ { #the-callback-path-expression }
+
+ã³ãŒã«ããã¯ã® *ãã¹* ã«ã¯ã*ããªãã® API* ã«éãããå
ã®ãªã¯ãšã¹ãã®äžéšãå«ãããã <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression" class="external-link" target="_blank">OpenAPI 3 ã®åŒ</a>ã䜿çšã§ããŸãã
+
+ãã®äŸã§ã¯ã`str` ã¯æ¬¡ã®ãšããã§ã:
+
+```Python
+"{$callback_url}/invoices/{$request.body.id}"
+```
+
+ã€ãŸããããªãã® API å©çšè
ïŒå€éšéçºè
ïŒã *ããªãã® API* ã«æ¬¡ã®ããã«ãªã¯ãšã¹ããéã£ãå Žå:
+
+```
+https://yourapi.com/invoices/?callback_url=https://www.external.org/events
+```
+
+JSON ããã£ã¯:
+
+```JSON
+{
+ "id": "2expen51ve",
+ "customer": "Mr. Richie Rich",
+ "total": "9999"
+}
+```
+
+ãã®åŸ *ããªãã® API* ã¯è«æ±æžãåŠçããã®ã¡ã»ã© `callback_url`ïŒ*å€éš API*ïŒãžã³ãŒã«ããã¯ã®ãªã¯ãšã¹ããéããŸã:
+
+```
+https://www.external.org/events/invoices/2expen51ve
+```
+
+JSON ããã£ã¯æ¬¡ã®ãããªå
容ã§ã:
+
+```JSON
+{
+ "description": "Payment celebration",
+ "paid": true
+}
+```
+
+ãã㊠*å€éš API* ããã¯æ¬¡ã®ãã㪠JSON ããã£ã®ã¬ã¹ãã³ã¹ãæåŸ
ããŸã:
+
+```JSON
+{
+ "ok": true
+}
+```
+
+/// tip | è±ç¥è
+
+䜿çšãããã³ãŒã«ãã㯠URL ã«ã¯ãã¯ãšãªãã©ã¡ãŒã¿ `callback_url`ïŒ`https://www.external.org/events`ïŒã§åãåã£ã URL ãšãJSON ããã£å
ã®è«æ±æž `id`ïŒ`2expen51ve`ïŒãå«ãŸããŠããç¹ã«æ³šç®ããŠãã ããã
+
+///
+
+### ã³ãŒã«ããã¯çšã«ãŒã¿ãŒã远å { #add-the-callback-router }
+
+ããã§ãäžã§äœæããã³ãŒã«ããã¯çšã«ãŒã¿ãŒå
ã«ãå¿
èŠãªã³ãŒã«ããã¯ã® *path operation(s)*ïŒ*å€éšéçºè
* ã *å€éš API* ã«å®è£
ãã¹ããã®ïŒãçšæã§ããŸããã
+
+次ã«ã*ããªãã® API ã® path operation ãã³ã¬ãŒã¿*ã® `callbacks` ãã©ã¡ãŒã¿ã«ããã®ã³ãŒã«ããã¯çšã«ãŒã¿ãŒã®å±æ§ `.routes`ïŒå®äœã¯ã«ãŒã/*path operations* ã® `list`ïŒãæž¡ããŸã:
+
+{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
+
+/// tip | è±ç¥è
+
+`callback=` ã«æž¡ãã®ã¯ã«ãŒã¿ãŒæ¬äœïŒ`invoices_callback_router`ïŒã§ã¯ãªãã屿§ `.routes`ïŒ`invoices_callback_router.routes`ïŒã§ããç¹ã«æ³šæããŠãã ããã
+
+///
+
+### ããã¥ã¡ã³ããç¢ºèª { #check-the-docs }
+
+ã¢ããªãèµ·åã㊠<a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> ã«ã¢ã¯ã»ã¹ããŸãã
+
+ããªãã® *path operation* ã«ãCallbacksãã»ã¯ã·ã§ã³ãå«ãŸãã*å€éš API* ãã©ãããã¹ããã衚瀺ãããŠããã®ã確èªã§ããŸã:
+
+<img src="/img/tutorial/openapi-callbacks/image01.png">
--- /dev/null
+# OpenAPI ã® Webhook { #openapi-webhooks }
+
+ã¢ããªãããçš®ã®**ã€ãã³ã**ã**éç¥**ããããã«ãããŒã¿ä»ãã§çžæã®ã¢ããªïŒãªã¯ãšã¹ãéä¿¡ïŒãåŒã³åºãå¯èœæ§ãããããšããAPI ã®**ãŠãŒã¶ãŒ**ã«äŒãããå ŽåããããŸãã
+
+ããã¯ãéåžžã®ããã«ãŠãŒã¶ãŒãããªãã® API ã«ãªã¯ãšã¹ããéãã®ã§ã¯ãªãã**ããªãã® APIïŒããªãã®ã¢ããªïŒ**ã**çžæã®ã·ã¹ãã **ïŒçžæã® APIãã¢ããªïŒã«ãªã¯ãšã¹ããéãããšããããšã§ãã
+
+ããã¯äžè¬ã«**Webhook**ãšåŒã°ããŸãã
+
+## Webhook ã®æé { #webhooks-steps }
+
+éåžžã®æµããšããŠããŸãããªãã®ã³ãŒãå
ã§ãéä¿¡ããã¡ãã»ãŒãžãããªãã¡ãªã¯ãšã¹ãã®**æ¬æïŒããã£ïŒ**ã**å®çŸ©**ããŸãã
+
+å ããŠãã¢ããªããããã®ãªã¯ãšã¹ãïŒã€ãã³ãïŒãéä¿¡ãã**ã¿ã€ãã³ã°**ãäœããã®åœ¢ã§å®çŸ©ããŸãã
+
+ãããŠ**ãŠãŒã¶ãŒ**ã¯ãã¢ããªããã®ãªã¯ãšã¹ããéãã¹ã**URL**ãïŒããšãã°ã©ããã® Web ããã·ã¥ããŒãã§ïŒå®çŸ©ããŸãã
+
+Webhook ã® URL ãç»é²ããæ¹æ³ãå®éã«ãªã¯ãšã¹ããéãã³ãŒããªã©ããããã®**ããžãã¯**ã¯ãã¹ãŠããªã次第ã§ãã**ããªãèªèº«ã®ã³ãŒã**ã§å¥œããªããã«å®è£
ããŸãã
+
+## FastAPI ãš OpenAPI ã«ãã Webhook ã®ããã¥ã¡ã³ãå { #documenting-webhooks-with-fastapi-and-openapi }
+
+**FastAPI** ãš OpenAPI ã䜿ããšãWebhook ã®ååãã¢ããªãéä¿¡ã§ãã HTTP ã®æäœïŒäŸ: `POST`, `PUT` ãªã©ïŒãã¢ããªãéããªã¯ãšã¹ãã®**ããã£**ãå®çŸ©ã§ããŸãã
+
+ããã«ããããŠãŒã¶ãŒãããªãã® **Webhook** ãªã¯ãšã¹ããåãåãããã®**API ãå®è£
**ããã®ã倧å¹
ã«ç°¡åã«ãªããŸããå Žåã«ãã£ãŠã¯ããŠãŒã¶ãŒãèªåãã¡ã® API ã³ãŒããèªåçæã§ãããããããŸããã
+
+/// info | æ
å ±
+
+Webhook 㯠OpenAPI 3.1.0 以äžã§å©çšå¯èœã§ãFastAPI `0.99.0` 以äžã察å¿ããŠããŸãã
+
+///
+
+## Webhook ãæã€ã¢ã㪠{ #an-app-with-webhooks }
+
+**FastAPI** ã¢ããªã±ãŒã·ã§ã³ãäœæãããšã`webhooks` ãšãã屿§ããããããã§ *path operations* ãšåæ§ã«ïŒäŸ: `@app.webhooks.post()`ïŒ*webhook* ãå®çŸ©ã§ããŸãã
+
+{* ../../docs_src/openapi_webhooks/tutorial001_py310.py hl[9:12,15:20] *}
+
+å®çŸ©ãã webhook 㯠**OpenAPI** ã¹ããŒãããã³èªåçæããã **ããã¥ã¡ã³ã UI** ã«åæ ãããŸãã
+
+/// info | æ
å ±
+
+`app.webhooks` ãªããžã§ã¯ãã¯å®éã«ã¯åãªã `APIRouter` ã§ãè€æ°ãã¡ã€ã«ã§ã¢ããªãæ§æããéã«äœ¿ããã®ãšåãåã§ãã
+
+///
+
+Webhook ã§ã¯ïŒ`/items/` ã®ãããªïŒ*ãã¹*ã宣èšããŠããããã§ã¯ãªãç¹ã«æ³šæããŠãã ãããããã§æž¡ãæåå㯠webhook ã®**èå¥å**ïŒã€ãã³ãåïŒã§ããããšãã° `@app.webhooks.post("new-subscription")` ã§ã® webhook å㯠`new-subscription` ã§ãã
+
+ããã¯ã**ãŠãŒã¶ãŒ**ãå®éã« Webhook ãªã¯ãšã¹ããåãåããã**URL ãã¹**ããå¥ã®æ¹æ³ïŒäŸ: Web ããã·ã¥ããŒãïŒã§å®çŸ©ããããšãæ³å®ããŠããããã§ãã
+
+### ããã¥ã¡ã³ãã®ç¢ºèª { #check-the-docs }
+
+ã¢ããªãèµ·åãã<a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> ã«ã¢ã¯ã»ã¹ããŸãã
+
+ããã¥ã¡ã³ãã«ã¯éåžžã® *path operations* ã«å ããŠã**webhooks** ã衚瀺ãããŸã:
+
+<img src="/img/tutorial/openapi-webhooks/image01.png">
åãªãã¬ãŒã·ã§ã³ã§äžæã«ãªãããã«ããå¿
èŠããããŸãã
-{* ../../docs_src/path_operation_advanced_configuration/tutorial001_py39.py hl[6] *}
+{* ../../docs_src/path_operation_advanced_configuration/tutorial001_py310.py hl[6] *}
### *path operation颿°* ã®ååãoperationIdãšããŠäœ¿çšãã { #using-the-path-operation-function-name-as-the-operationid }
ãã¹ãŠã® *path operation* ã远å ããåŸã«è¡ãã¹ãã§ãã
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py39.py hl[2, 12:21, 24] *}
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
/// tip | è±ç¥è
çæãããOpenAPIã¹ããŒãïŒã€ãŸããèªåããã¥ã¡ã³ãçæã®ä»çµã¿ïŒãã *path operation* ãé€å€ããã«ã¯ã`include_in_schema` ãã©ã¡ãŒã¿ã䜿çšã㊠`False` ã«èšå®ããŸãã
-{* ../../docs_src/path_operation_advanced_configuration/tutorial003_py39.py hl[6] *}
+{* ../../docs_src/path_operation_advanced_configuration/tutorial003_py310.py hl[6] *}
## docstringã«ãã説æã®é«åºŠãªèšå® { #advanced-description-from-docstring }
ãã® `openapi_extra` ã¯ãäŸãã° [OpenAPI Extensions](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions) ã宣èšããã®ã«åœ¹ç«ã¡ãŸãã
-{* ../../docs_src/path_operation_advanced_configuration/tutorial005_py39.py hl[6] *}
+{* ../../docs_src/path_operation_advanced_configuration/tutorial005_py310.py hl[6] *}
èªåAPIããã¥ã¡ã³ããéããšããã®æ¡åŒµã¯ç¹å®ã® *path operation* ã®äžéšã«è¡šç€ºãããŸãã
ãã㯠`openapi_extra` ã§è¡ããŸãã
-{* ../../docs_src/path_operation_advanced_configuration/tutorial006_py39.py hl[19:36, 39:40] *}
+{* ../../docs_src/path_operation_advanced_configuration/tutorial006_py310.py hl[19:36, 39:40] *}
-ãã®äŸã§ã¯ãPydanticã¢ãã«ãäžå宣èšããŠããŸãããå®éããªã¯ãšã¹ãããã£ã¯JSONãšã㊠<abbr title="converted from some plain format, like bytes, into Python objects â bytesãªã©ã®ãã¬ãŒã³ãªåœ¢åŒããPythonãªããžã§ã¯ãã«å€æããããš">parsed</abbr> ããããçŽæ¥ `bytes` ãšããŠèªã¿åãããŸãããã㊠`magic_data_reader()` 颿°ããäœããã®æ¹æ³ã§ãããããŒã¹ãã責åãæ
ããŸãã
+ãã®äŸã§ã¯ãPydanticã¢ãã«ãäžå宣èšããŠããŸãããå®éããªã¯ãšã¹ãããã£ã¯JSONãšã㊠<dfn title="bytes ãªã©ã®ãã¬ãŒã³ãªåœ¢åŒãã Python ãªããžã§ã¯ãã«å€æããã">ããŒã¹</dfn> ããããçŽæ¥ `bytes` ãšããŠèªã¿åãããŸãããã㊠`magic_data_reader()` 颿°ããäœããã®æ¹æ³ã§ãããããŒã¹ãã責åãæ
ããŸãã
ããã§ãããªã¯ãšã¹ãããã£ã«æåŸ
ãããã¹ããŒãã宣èšã§ããŸãã
äŸãã°ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãPydanticã¢ãã«ããJSON SchemaãæœåºããFastAPIã®çµ±åæ©èœããJSONã®èªåããªããŒã·ã§ã³ã䜿ã£ãŠããŸãããå®éããªã¯ãšã¹ãã®content typeãJSONã§ã¯ãªãYAMLãšããŠå®£èšããŠããŸãã
-{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py39.py hl[15:20, 22] *}
+{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py310.py hl[15:20, 22] *}
ããã§ããããã©ã«ãã®çµ±åæ©èœã䜿ã£ãŠããªãã«ãããããããYAMLã§åãåãããããŒã¿ã®ããã«ãPydanticã¢ãã«ã䜿ã£ãŠæåã§JSON SchemaãçæããŠããŸãã
ãã®åŸãã³ãŒãå
ã§ãã®YAMLã³ã³ãã³ããçŽæ¥ããŒã¹ããããã«åãPydanticã¢ãã«ã䜿ã£ãŠYAMLã³ã³ãã³ããæ€èšŒããŠããŸãã
-{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py39.py hl[24:31] *}
+{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py310.py hl[24:31] *}
/// tip | è±ç¥è
--- /dev/null
+# ã¬ã¹ãã³ã¹ - ã¹ããŒã¿ã¹ã³ãŒãã®å€æŽ { #response-change-status-code }
+
+ãã§ã«ãããã©ã«ãã®[ã¬ã¹ãã³ã¹ã®ã¹ããŒã¿ã¹ã³ãŒã](../tutorial/response-status-code.md){.internal-link target=_blank}ãèšå®ã§ããããšããåç¥ãããããŸããã
+
+ãããå Žåã«ãã£ãŠã¯ãããã©ã«ããšã¯ç°ãªãã¹ããŒã¿ã¹ã³ãŒããè¿ãå¿
èŠããããŸãã
+
+## ãŠãŒã¹ã±ãŒã¹ { #use-case }
+
+ããšãã°ãããã©ã«ãã§ã¯ HTTP ã¹ããŒã¿ã¹ã³ãŒã "OK" `200` ãè¿ããããšããŸãã
+
+ããããããŒã¿ãååšããªããã°ãããäœæããHTTP ã¹ããŒã¿ã¹ã³ãŒã "CREATED" `201` ãè¿ãããã
+
+ããã§ããè¿ãããŒã¿ã¯ `response_model` ã§ãã£ã«ã¿ã»å€æã§ããããã«ããŠããããã
+
+ãã®ãããªå Žå㯠`Response` ãã©ã¡ãŒã¿ã䜿ããŸãã
+
+## `Response` ãã©ã¡ãŒã¿ã䜿ã { #use-a-response-parameter }
+
+*path operation* 颿°ã§ `Response` åã®ãã©ã¡ãŒã¿ã宣èšã§ããŸãïŒCookie ãããããŒãšåæ§ã§ãïŒã
+
+ãããŠããã®*äžæçãª*ã¬ã¹ãã³ã¹ãªããžã§ã¯ãã« `status_code` ãèšå®ã§ããŸãã
+
+{* ../../docs_src/response_change_status_code/tutorial001_py310.py hl[1,9,12] *}
+
+ãã®åŸã¯éåžžã©ãããå¿
èŠãªä»»æã®ãªããžã§ã¯ãïŒ`dict`ãããŒã¿ããŒã¹ã¢ãã«ãªã©ïŒãè¿ããŸãã
+
+ãã㊠`response_model` ã宣èšããŠããã°ãè¿ãããªããžã§ã¯ãã®ãã£ã«ã¿ãšå€æã«ã¯åŒãç¶ãããã䜿ãããŸãã
+
+FastAPI ã¯ãã®*äžæçãª*ã¬ã¹ãã³ã¹ããã¹ããŒã¿ã¹ã³ãŒãïŒããã³ Cookie ãšããããŒïŒãåãåºãã`response_model` ã«ãã£ãŠãã£ã«ã¿æžã¿ã®è¿åŽå€ãå«ãæçµçãªã¬ã¹ãã³ã¹ã«åæ ããŸãã
+
+ãŸãã`Response` ãã©ã¡ãŒã¿ã¯äŸåé¢ä¿å
ã«å®£èšããŠã¹ããŒã¿ã¹ã³ãŒããèšå®ããããšãã§ããŸãããã ããæåŸã«èšå®ããããã®ãåªå
ãããç¹ã«æ³šæããŠãã ããã
--- /dev/null
+# ã¬ã¹ãã³ã¹ã® Cookie { #response-cookies }
+
+## `Response` ãã©ã¡ãŒã¿ã䜿ã { #use-a-response-parameter }
+
+*path operation 颿°*ã§ `Response` åã®ãã©ã¡ãŒã¿ã宣èšã§ããŸãã
+
+ãããŠããã®*äžæç*ãªã¬ã¹ãã³ã¹ãªããžã§ã¯ãã« Cookie ãèšå®ã§ããŸãã
+
+{* ../../docs_src/response_cookies/tutorial002_py310.py hl[1, 8:9] *}
+
+ãã®åŸã¯éåžžã©ãããå¿
èŠãªä»»æã®ãªããžã§ã¯ãïŒ`dict`ãããŒã¿ããŒã¹ã¢ãã«ãªã©ïŒãè¿ããŸãã
+
+`response_model` ã宣èšããŠããå Žåã§ããè¿ãããªããžã§ã¯ãã¯åŒãç¶ããã£ã«ã¿ããã³å€æãããŸãã
+
+**FastAPI** ã¯ãã®*äžæç*ãªã¬ã¹ãã³ã¹ãã CookieïŒããã³ããããŒãã¹ããŒã¿ã¹ã³ãŒãïŒãåãåºãã`response_model` ã«ãã£ãŠãã£ã«ã¿ãããè¿åŽå€ãå«ãæçµçãªã¬ã¹ãã³ã¹ã«èšå®ããŸãã
+
+`Response` ãã©ã¡ãŒã¿ã¯äŸåé¢ä¿ã§ã宣èšã§ããããã§ CookieïŒãããããŒïŒãèšå®ããããšãå¯èœã§ãã
+
+## `Response` ãçŽæ¥è¿ã { #return-a-response-directly }
+
+ã³ãŒãã§ `Response` ãçŽæ¥è¿ããšãã«ãCookie ãäœæããããšãã§ããŸãã
+
+ãã®ããã«ã¯ã[Response ãçŽæ¥è¿ã](response-directly.md){.internal-link target=_blank} ã§èª¬æãããŠãããšããã«ã¬ã¹ãã³ã¹ãäœæããŸãã
+
+ãã®ã¬ã¹ãã³ã¹ã« Cookie ãèšå®ããŠããè¿ããŸã:
+
+{* ../../docs_src/response_cookies/tutorial001_py310.py hl[10:12] *}
+
+/// tip | è±ç¥è
+
+`Response` ãã©ã¡ãŒã¿ã䜿ããã«ã¬ã¹ãã³ã¹ãçŽæ¥è¿ãå ŽåãFastAPI ã¯ãã®ã¬ã¹ãã³ã¹ããã®ãŸãŸè¿ããŸãã
+
+ãã®ãããããŒã¿ã®åãæ£ããããšã確èªããå¿
èŠããããŸããäŸãã°ã`JSONResponse` ãè¿ããªããJSON ãšäºææ§ãããå¿
èŠããããŸãã
+
+ãŸãã`response_model` ã«ãã£ãŠãã£ã«ã¿ãããã¹ãããŒã¿ãéã£ãŠããªãããšã確èªããŠãã ããã
+
+///
+
+### 詳现æ
å ± { #more-info }
+
+/// note | æè¡è©³çް
+
+`from starlette.responses import Response` ã `from starlette.responses import JSONResponse` ã䜿ãããšãã§ããŸãã
+
+**FastAPI** ã¯éçºè
ã®å©äŸ¿æ§ã®ããã«ã`starlette.responses` ãšåããã®ã `fastapi.responses` ãšããŠæäŸããŠããŸãããã ããå©çšå¯èœãªã¬ã¹ãã³ã¹ã®å€§å㯠Starlette ããçŽæ¥æäŸãããŠããŸãã
+
+ãŸãã`Response` ã¯ããããŒã Cookie ã®èšå®ã«é »ç¹ã«äœ¿ãããããã`fastapi.Response` ãšããŠãæäŸãããŠããŸãã
+
+///
+
+å©çšå¯èœãªãã¹ãŠã®ãã©ã¡ãŒã¿ããªãã·ã§ã³ã«ã€ããŠã¯ã<a href="https://www.starlette.dev/responses/#set-cookie" class="external-link" target="_blank">Starlette ã®ããã¥ã¡ã³ã</a>ãåç
§ããŠãã ããã
XMLãæååã«ãã`Response` ã«å«ãããããè¿ããŸãã
-{* ../../docs_src/response_directly/tutorial002_py39.py hl[1,18] *}
+{* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *}
## åè { #notes }
--- /dev/null
+# ã¬ã¹ãã³ã¹ããã㌠{ #response-headers }
+
+## `Response` ãã©ã¡ãŒã¿ã䜿ã { #use-a-response-parameter }
+
+ïŒCookie ãšåæ§ã«ïŒ*path operation 颿°*ã§ `Response` åã®ãã©ã¡ãŒã¿ã宣èšã§ããŸãã
+
+ãããŠããã®*äžæç*ãªã¬ã¹ãã³ã¹ãªããžã§ã¯ãã«ããããŒãèšå®ã§ããŸãã
+
+{* ../../docs_src/response_headers/tutorial002_py310.py hl[1, 7:8] *}
+
+ãã®åŸã¯éåžžã©ãããå¿
èŠãªä»»æã®ãªããžã§ã¯ãïŒ`dict`ãããŒã¿ããŒã¹ã¢ãã«ãªã©ïŒãè¿ããŸãã
+
+`response_model` ã宣èšããŠããå Žåã¯ãè¿ãããªããžã§ã¯ãã®ãã£ã«ã¿ãšå€æã«åŒãç¶ã䜿çšãããŸãã
+
+**FastAPI** ã¯ãã®*äžæç*ãªã¬ã¹ãã³ã¹ããããããŒïŒCookie ãã¹ããŒã¿ã¹ã³ãŒããå«ãïŒãåãåºãã`response_model` ã«ãã£ãŠãã£ã«ã¿ãããè¿åŽå€ãå«ãæçµçãªã¬ã¹ãã³ã¹ã«åæ ããŸãã
+
+ãŸããäŸåé¢ä¿ã®äžã§ `Response` ãã©ã¡ãŒã¿ã宣èšãããã®äžã§ããããŒïŒã CookieïŒãèšå®ããããšãã§ããŸãã
+
+## `Response` ãçŽæ¥è¿ã { #return-a-response-directly }
+
+`Response` ãçŽæ¥è¿ãå Žåã«ãããããŒã远å ã§ããŸãã
+
+[Response ãçŽæ¥è¿ã](response-directly.md){.internal-link target=_blank} ã§èª¬æããããã«ã¬ã¹ãã³ã¹ãäœæããããããŒã远å ã®ãã©ã¡ãŒã¿ãšããŠæž¡ããŸã:
+
+{* ../../docs_src/response_headers/tutorial001_py310.py hl[10:12] *}
+
+/// note | æè¡è©³çް
+
+`from starlette.responses import Response` ã `from starlette.responses import JSONResponse` ã䜿ãããšãã§ããŸãã
+
+**FastAPI** ã¯ãéçºè
ã§ããããªããžã®äŸ¿å®ãšããŠã`starlette.responses` ãšåããã®ã `fastapi.responses` ãšããŠæäŸããŠããŸããããããå©çšå¯èœãªã¬ã¹ãã³ã¹ã®å€§åã¯çŽæ¥ Starlette ããæ¥ãŠããŸãã
+
+ãŸãã`Response` ã¯ããããŒã Cookie ãèšå®ããã®ã«ãã䜿ãããããã**FastAPI** 㯠`fastapi.Response` ã§ãæäŸããŠããŸãã
+
+///
+
+## ã«ã¹ã¿ã ããã㌠{ #custom-headers }
+
+ç¬èªã®ã«ã¹ã¿ã ããããŒã¯ã<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">`X-` ãã¬ãã£ãã¯ã¹ã䜿ã£ãŠ</a>远å ã§ããããšã«æ³šæããŠãã ããã
+
+ãã ãããã©ãŠã¶ã®ã¯ã©ã€ã¢ã³ãã«èŠããããã«ãããã«ã¹ã¿ã ããããŒãããå Žåã¯ãCORS èšå®ã«ãããã远å ããå¿
èŠããããŸãïŒ[CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank} ãåç
§ïŒããã®ãšãã<a href="https://www.starlette.dev/middleware/#corsmiddleware" class="external-link" target="_blank">Starlette ã® CORS ããã¥ã¡ã³ã</a>ã«èšèŒã® `expose_headers` ãã©ã¡ãŒã¿ã䜿çšããŸãã
--- /dev/null
+# HTTP Basic èªèšŒ { #http-basic-auth }
+
+æãã·ã³ãã«ãªã±ãŒã¹ã§ã¯ãHTTP Basic èªèšŒãå©çšã§ããŸãã
+
+HTTP Basic èªèšŒã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã¯ãŠãŒã¶ãŒåãšãã¹ã¯ãŒããå«ãããããŒãæåŸ
ããŸãã
+
+ãããåãåããªãå ŽåãHTTP 401 "Unauthorized" ãšã©ãŒãè¿ããŸãã
+
+ãããŠãå€ã `Basic` ã®ããã㌠`WWW-Authenticate` ããä»»æã® `realm` ãã©ã¡ãŒã¿ãšãšãã«è¿ããŸãã
+
+ããã«ããããã©ãŠã¶ã¯çµã¿èŸŒã¿ã®ãŠãŒã¶ãŒåãšãã¹ã¯ãŒãå
¥åããã³ããã衚瀺ããŸãã
+
+ãã®åŸããã®ãŠãŒã¶ãŒåãšãã¹ã¯ãŒããå
¥åãããšããã©ãŠã¶ã¯ããããããããŒã«èªåçã«ä»äžããŠéä¿¡ããŸãã
+
+## ã·ã³ãã«ãª HTTP Basic èªèšŒ { #simple-http-basic-auth }
+
+- `HTTPBasic` ãš `HTTPBasicCredentials` ãã€ã³ããŒãããŸãã
+- `HTTPBasic` ã䜿ã£ãŠã`security` ã¹ããŒã ããäœæããŸãã
+- ãã® `security` ãäŸåé¢ä¿ãšã㊠path operation ã«äœ¿çšããŸãã
+- `HTTPBasicCredentials` åã®ãªããžã§ã¯ããè¿ããŸã:
+ - éä¿¡ããã `username` ãš `password` ãå«ã¿ãŸãã
+
+{* ../../docs_src/security/tutorial006_an_py310.py hl[4,8,12] *}
+
+URL ãæåã«éãããšãããšãïŒãŸãã¯ããã¥ã¡ã³ãã§ãExecuteããã¿ã³ãã¯ãªãã¯ãããšãïŒããã©ãŠã¶ã¯ãŠãŒã¶ãŒåãšãã¹ã¯ãŒãã®å
¥åãæ±ããŸã:
+
+<img src="/img/tutorial/security/image12.png">
+
+## ãŠãŒã¶ãŒåã®ç¢ºèª { #check-the-username }
+
+ããå®å
šãªäŸã§ãã
+
+äŸåé¢ä¿ã䜿ã£ãŠãŠãŒã¶ãŒåãšãã¹ã¯ãŒããæ£ãããã確èªããŸãã
+
+ããã«ã¯ãPython æšæºã¢ãžã¥ãŒã« <a href="https://docs.python.org/3/library/secrets.html" class="external-link" target="_blank">`secrets`</a> ãçšããŠãŠãŒã¶ãŒåãšãã¹ã¯ãŒããæ€èšŒããŸãã
+
+`secrets.compare_digest()` 㯠`bytes` ããASCII æåïŒè±èªã®æåïŒã®ã¿ãå«ã `str` ãåãåãå¿
èŠããããŸããã€ãŸãã`Sebastián` ã®ããã« `á` ãå«ãæåã§ã¯ãã®ãŸãŸã§ã¯åäœããŸããã
+
+ããã«å¯ŸåŠããããããŸã `username` ãš `password` ã UTF-8 ã§ãšã³ã³ãŒãã㊠`bytes` ã«å€æããŸãã
+
+ãã®ããã§ã`secrets.compare_digest()` ã䜿ã£ãŠã`credentials.username` ã `"stanleyjobson"` ã§ããã`credentials.password` ã `"swordfish"` ã§ããããšã確èªããŸãã
+
+{* ../../docs_src/security/tutorial007_an_py310.py hl[1,12:24] *}
+
+ããã¯æ¬¡ã®ãããªã³ãŒãã«çžåœããŸã:
+
+```Python
+if not (credentials.username == "stanleyjobson") or not (credentials.password == "swordfish"):
+ # Return some error
+ ...
+```
+
+ããã `secrets.compare_digest()` ã䜿ãããšã§ããã¿ã€ãã³ã°æ»æããšåŒã°ããçš®é¡ã®æ»æã«å¯ŸããŠå®å
šã«ãªããŸãã
+
+### ã¿ã€ãã³ã°æ»æ { #timing-attacks }
+
+ãã¿ã€ãã³ã°æ»æããšã¯äœã§ããããïŒ
+
+æ»æè
ããŠãŒã¶ãŒåãšãã¹ã¯ãŒããæšæž¬ããããšããŠãããšæ³åããŠãã ããã
+
+ãããŠããŠãŒã¶ãŒå `johndoe`ããã¹ã¯ãŒã `love123` ã䜿ã£ãŠãªã¯ãšã¹ããéããŸãã
+
+ãã®å Žåãã¢ããªã±ãŒã·ã§ã³å
ã® Python ã³ãŒãã¯æ¬¡ã®ãããªãã®ãšç䟡ã«ãªããŸã:
+
+```Python
+if "johndoe" == "stanleyjobson" and "love123" == "swordfish":
+ ...
+```
+
+ããããPython 㯠`johndoe` ã®æåã® `j` ãš `stanleyjobson` ã®æåã® `s` ãæ¯èŒããæç¹ã§ãäž¡è
ã®æååãåãã§ãªããšå€æããŠããã« `False` ãè¿ããŸããã€ãŸããæ®ãã®æåãæ¯èŒããŠèšç®è³æºãç¡é§ã«ããå¿
èŠã¯ãªãããšèããããã§ãããããŠã¢ããªã±ãŒã·ã§ã³ã¯ããŠãŒã¶ãŒåãŸãã¯ãã¹ã¯ãŒããæ£ãããããŸããããšè¿ããŸãã
+
+次ã«ãæ»æè
ããŠãŒã¶ãŒå `stanleyjobsox`ããã¹ã¯ãŒã `love123` ã§è©ŠããšããŸãã
+
+ã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸã:
+
+```Python
+if "stanleyjobsox" == "stanleyjobson" and "love123" == "swordfish":
+ ...
+```
+
+ãã®å ŽåãPython 㯠`stanleyjobsox` ãš `stanleyjobson` ã®äž¡æ¹ã§ `stanleyjobso` å
šäœãæ¯èŒããŠãããæååãåãã§ãªããšæ°ã¥ããŸãããããã£ãŠãããŠãŒã¶ãŒåãŸãã¯ãã¹ã¯ãŒããæ£ãããããŸããããšå¿çãããŸã§ã«äœåã«æ°ãã€ã¯ãç§ããããŸãã
+
+#### å¿çæéãæ»æè
ãå©ãã { #the-time-to-answer-helps-the-attackers }
+
+ããã§ããµãŒããŒãããŠãŒã¶ãŒåãŸãã¯ãã¹ã¯ãŒããæ£ãããããŸããããšããã¬ã¹ãã³ã¹ãè¿ããŸã§ã«ããããã«é·ãæéãããã£ãããšã«æ°ã¥ãã°ãæ»æè
ã¯äœãããæ£è§£ã«è¿ã¥ãããããªãã¡å
é ã®ããã€ãã®æåãæ£ããã£ãããšãç¥ãããšãã§ããŸãã
+
+ãããšã`johndoe` ããã `stanleyjobsox` ã«è¿ããã®ãçã£ãŠå詊è¡ã§ããŸãã
+
+#### ããããã¬ãã«ã®æ»æ { #a-professional-attack }
+
+ãã¡ãããæ»æè
ã¯ããããæäœæ¥ã§ã¯è¡ãããããã°ã©ã ãæžããŠã1 ç§éã«æ°åãæ°çŸäžåã®ãã¹ããè¡ãã§ãããããã㊠1 åã« 1 æåãã€æ£ããæåãèŠã€ããŠãããŸãã
+
+ããããããšã§ãæ°åããæ°æéã®ãã¡ã«ãæ»æè
ã¯ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã®ãå©ããïŒå¿çã«ããã£ãæéïŒã ããå©çšããŠãæ£ãããŠãŒã¶ãŒåãšãã¹ã¯ãŒããæšæž¬ã§ããŠããŸããŸãã
+
+#### `secrets.compare_digest()` ã§å¯Ÿç { #fix-it-with-secrets-compare-digest }
+
+ããããç§ãã¡ã®ã³ãŒãã§ã¯å®éã« `secrets.compare_digest()` ã䜿çšããŠããŸãã
+
+èŠããã«ã`stanleyjobsox` ãš `stanleyjobson` ãæ¯èŒããã®ã«ãããæéã¯ã`johndoe` ãš `stanleyjobson` ãæ¯èŒããã®ã«ãããæéãšåãã«ãªããŸãããã¹ã¯ãŒãã§ãåæ§ã§ãã
+
+ãã®ããã«ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã§ `secrets.compare_digest()` ã䜿ããšããã®çš®ã®äžé£ã®ã»ãã¥ãªãã£æ»æã«å¯ŸããŠå®å
šã«ãªããŸãã
+
+### ãšã©ãŒãè¿ã { #return-the-error }
+
+èªèšŒæ
å ±ãäžæ£ã§ããããšãæ€åºããããã¹ããŒã¿ã¹ã³ãŒã 401ïŒèªèšŒæ
å ±ãæäŸãããªãå ŽåãšåãïŒã§ `HTTPException` ãè¿ãããã©ãŠã¶ã«å床ãã°ã€ã³ããã³ããã衚瀺ãããããã«ããã㌠`WWW-Authenticate` ã远å ããŸã:
+
+{* ../../docs_src/security/tutorial007_an_py310.py hl[26:30] *}
--- /dev/null
+# é«åºŠãªã»ãã¥ãªã㣠{ #advanced-security }
+
+## è¿œå æ©èœ { #additional-features }
+
+[ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã: ã»ãã¥ãªãã£](../../tutorial/security/index.md){.internal-link target=_blank}ã§æ±ã£ããã®ä»¥å€ã«ããã»ãã¥ãªãã£ãæ±ãããã®è¿œå æ©èœãããã€ããããŸãã
+
+/// tip | è±ç¥è
+
+次ã®ç¯ã¯å¿
ããããé«åºŠãã§ã¯ãããŸããã
+
+ããªãã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ããã®äžã®ããããã«è§£æ±ºçããããããããŸããã
+
+///
+
+## ãŸããã¥ãŒããªã¢ã«ãèªã { #read-the-tutorial-first }
+
+以äžã®ç¯ã¯ããã§ã«ã¡ã€ã³ã®[ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã: ã»ãã¥ãªãã£](../../tutorial/security/index.md){.internal-link target=_blank}ãèªãã§ããããšãåæãšããŸãã
+
+ããããåãæŠå¿µã«åºã¥ããŠããŸãããããã€ãã®è¿œå æ©èœãå©çšã§ããŸãã
--- /dev/null
+# OAuth2 ã®ã¹ã³ãŒã { #oauth2-scopes }
+
+OAuth2 ã®ã¹ã³ãŒã㯠**FastAPI** ã§çŽæ¥å©çšã§ããã·ãŒã ã¬ã¹ã«çµ±åãããŠããŸãã
+
+ããã«ãããOAuth2 æšæºã«åŸã£ãããããã现ããªæš©éã·ã¹ãã ããOpenAPI 察å¿ã¢ããªã±ãŒã·ã§ã³ïŒããã³ API ããã¥ã¡ã³ãïŒã«çµ±åã§ããŸãã
+
+ã¹ã³ãŒãä»ãã® OAuth2 ã¯ãFacebookãGoogleãGitHubãMicrosoftãX (Twitter) ãªã©ãå€ãã®å€§æèªèšŒãããã€ãã§äœ¿ãããŠããä»çµã¿ã§ãããŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã«ç¹å®ã®æš©éãä»äžããããã«å©çšãããŸãã
+
+ãFacebook ã§ãã°ã€ã³ããGoogle ã§ãã°ã€ã³ããGitHub ã§ãã°ã€ã³ããMicrosoft ã§ãã°ã€ã³ããX (Twitter) ã§ãã°ã€ã³ããããã³ã«ããã®ã¢ããªã±ãŒã·ã§ã³ã¯ã¹ã³ãŒãä»ãã® OAuth2 ã䜿ã£ãŠããŸãã
+
+ãã®ç¯ã§ã¯ãåãã¹ã³ãŒãä»ã OAuth2 ã䜿ã£ãŠã**FastAPI** ã¢ããªã±ãŒã·ã§ã³ã§èªèšŒãšèªå¯ã管çããæ¹æ³ãèŠãŠãããŸãã
+
+/// warning | 泚æ
+
+ããã¯ããé«åºŠãªå
容ã§ããã¯ãããã°ããã§ããã°èªã¿é£ã°ããŠãæ§ããŸããã
+
+OAuth2 ã®ã¹ã³ãŒãã¯å¿
ãããå¿
èŠã§ã¯ãªããèªèšŒãšèªå¯ã¯å¥œããªããæ¹ã§å®è£
ã§ããŸãã
+
+ãã ããã¹ã³ãŒãä»ãã® OAuth2 ã¯ãAPIïŒOpenAPIïŒã API ããã¥ã¡ã³ãã«ãããã«çµ±åã§ããŸãã
+
+ãšã¯ããããããã®ã¹ã³ãŒãããã®ä»ã®ã»ãã¥ãªãã£ïŒèªå¯èŠä»¶ã®é©çšã¯ãå¿
èŠã«å¿ããŠã³ãŒãã®äžã§è¡ãå¿
èŠããããŸãã
+
+å€ãã®å Žåãã¹ã³ãŒãä»ã OAuth2 ã¯ãªãŒããŒã¹ããã¯ã«ãªãããŸãã
+
+ããã§ãå¿
èŠã ãšåãã£ãŠããå Žåããèå³ãããå Žåã¯ããã®ãŸãŸèªã¿é²ããŠãã ããã
+
+///
+
+## OAuth2 ã®ã¹ã³ãŒããš OpenAPI { #oauth2-scopes-and-openapi }
+
+OAuth2 仿§ã§ã¯ããã¹ã³ãŒããã¯ç©ºçœã§åºåãããæååã®äžèЧãšããŠå®çŸ©ãããŠããŸãã
+
+åæååã®å
容ã¯ä»»æã§ããã空çœã¯å«ããããŸããã
+
+ãããã®ã¹ã³ãŒãã¯ãæš©éãã衚ããŸãã
+
+OpenAPIïŒäŸ: API ããã¥ã¡ã³ãïŒã§ã¯ããã»ãã¥ãªãã£ã¹ããŒã ããå®çŸ©ã§ããŸãã
+
+ãããã®ã»ãã¥ãªãã£ã¹ããŒã ã®äžã€ã OAuth2 ã䜿ãå Žåãã¹ã³ãŒãã宣èšããŠå©çšã§ããŸãã
+
+åãã¹ã³ãŒããã¯ããã ã®æååïŒç©ºçœãªãïŒã§ãã
+
+éåžžãç¹å®ã®ã»ãã¥ãªãã£æš©éã宣èšããããã«äœ¿ãããŸããäŸãã°:
+
+- `users:read` ã `users:write` ã¯äžè¬çãªäŸã§ãã
+- `instagram_basic` 㯠Facebook / Instagram ã§äœ¿ãããŠããŸãã
+- `https://www.googleapis.com/auth/drive` 㯠Google ã§äœ¿ãããŠããŸãã
+
+/// info | æ
å ±
+
+OAuth2 ã«ãããŠãã¹ã³ãŒããã¯ãå¿
èŠãªç¹å®ã®æš©éã宣èšããåãªãæååã§ãã
+
+`:` ã®ãããªä»ã®æåãå«ãŸããŠããŠããURL ã§ãã£ãŠãåé¡ãããŸããã
+
+ãããã®è©³çްã¯å®è£
äŸåã§ãã
+
+OAuth2 ã«ãšã£ãŠã¯ãåã«æååã«éããŸããã
+
+///
+
+## å
šäœå { #global-view }
+
+ãŸããã¡ã€ã³ã®**ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã**ã«ãã [OAuth2ïŒãã¹ã¯ãŒãããã·ã¥åããïŒãBearer ãš JWT ããŒã¯ã³](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank} ã®äŸãã倿Žãããéšåããã¹ã³ãŒãä»ã OAuth2 ã䜿ã£ãŠææ©ãèŠãŠã¿ãŸãããã
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *}
+
+ã§ã¯ããããã®å€æŽãäžã€ãã€ç¢ºèªããŠãããŸãã
+
+## OAuth2 ã®ã»ãã¥ãªãã£ã¹ããŒã { #oauth2-security-scheme }
+
+æåã®å€æŽç¹ã¯ã`me` ãš `items` ã® 2 ã€ã®ã¹ã³ãŒããæã€ OAuth2 ã»ãã¥ãªãã£ã¹ããŒã ã宣èšããŠããããšã§ãã
+
+`scopes` ãã©ã¡ãŒã¿ã¯ãåã¹ã³ãŒããããŒããã®èª¬æãå€ãšãã `dict` ãåãåããŸã:
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[63:66] *}
+
+ãããã®ã¹ã³ãŒãã宣èšããŠããããããã°ã€ã³ïŒèªå¯æã« API ããã¥ã¡ã³ãã«è¡šç€ºãããŸãã
+
+ãããŠãä»äžããã¹ã³ãŒãïŒ`me`ã`items`ïŒãéžæã§ããŸãã
+
+ããã¯ãFacebookãGoogleãGitHub ãªã©ã§ãã°ã€ã³æã«æš©éãä»äžããéãšåãä»çµã¿ã§ã:
+
+<img src="/img/tutorial/security/image11.png">
+
+## ã¹ã³ãŒãä»ãã® JWT ããŒã¯ã³ { #jwt-token-with-scopes }
+
+次ã«ãããŒã¯ã³ã® path operation ãä¿®æ£ããŠãèŠæ±ãããã¹ã³ãŒããè¿ãããã«ããŸãã
+
+åŒãç¶ãåã `OAuth2PasswordRequestForm` ã䜿çšããŸããããã«ã¯ããªã¯ãšã¹ãã§åãåã£ãåã¹ã³ãŒããå«ãã`str` ã® `list` ã§ãã `scopes` ããããã£ãå«ãŸããŸãã
+
+ãããŠããã®ã¹ã³ãŒãã JWT ããŒã¯ã³ã®äžéšãšããŠè¿ããŸãã
+
+/// danger | èŠå
+
+ç°¡åã®ãããããã§ã¯åãåã£ãã¹ã³ãŒãããã®ãŸãŸããŒã¯ã³ã«è¿œå ããŠããŸãã
+
+ããããæ¬çªã¢ããªã±ãŒã·ã§ã³ã§ã¯ã»ãã¥ãªãã£ã®ããããŠãŒã¶ãŒãå®éã«æã€ããšãã§ããã¹ã³ãŒãããŸãã¯äºåã«å®çŸ©ããã¹ã³ãŒãã ãã远å ããããã«ããŠãã ããã
+
+///
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[157] *}
+
+## path operation ãšäŸåé¢ä¿ã§ã¹ã³ãŒããå®£èš { #declare-scopes-in-path-operations-and-dependencies }
+
+ããã§ã¯ã`/users/me/items/` ã® path operation ã `items` ã¹ã³ãŒããå¿
èŠãšããããã«å®£èšããŸãã
+
+ãã®ããã«ã`fastapi` ãã `Security` ãã€ã³ããŒãããŠäœ¿ããŸãã
+
+`Security` ã¯ïŒ`Depends` ãšåæ§ã«ïŒäŸåé¢ä¿ã宣èšã§ããŸãããããã«ã¹ã³ãŒãïŒæååïŒã®ãªã¹ããåãåã `scopes` ãã©ã¡ãŒã¿ãæã¡ãŸãã
+
+ãã®å Žåã`Security` ã«äŸå颿° `get_current_active_user` ãæž¡ããŸãïŒ`Depends` ãšåæ§ã§ãïŒã
+
+å ããŠã`items` ãšãã 1 ã€ã®ã¹ã³ãŒãïŒè€æ°ã§ãå¯ïŒãå«ã `list` ãæž¡ããŸãã
+
+äŸå颿° `get_current_active_user` ã¯ã`Depends` ã ãã§ãªã `Security` ã§ããµãäŸåé¢ä¿ã宣èšã§ããŸããèªèº«ã®ãµãäŸå颿°ïŒ`get_current_user`ïŒã宣èšããããã«ã¹ã³ãŒãèŠä»¶ã远å ããŸãã
+
+ãã®å Žåã`me` ã¹ã³ãŒããèŠæ±ããŸãïŒè€æ°ã®ã¹ã³ãŒããå¯ïŒã
+
+/// note | åè
+
+ç°ãªãå Žæã§ç°ãªãã¹ã³ãŒãã远å ããå¿
èŠã¯å¿
ããããããŸããã
+
+ããã§ã¯ã**FastAPI** ãç°ãªãã¬ãã«ã§å®£èšãããã¹ã³ãŒããã©ã®ããã«æ±ããã瀺ãããã«ããããŠããŸãã
+
+///
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
+
+/// info | æè¡è©³çް
+
+`Security` ã¯å®éã«ã¯ `Depends` ã®ãµãã¯ã©ã¹ã§ãåŸè¿°ãã远å ãã©ã¡ãŒã¿ã 1 ã€ããã ãã§ãã
+
+ããã `Depends` ã®ä»£ããã« `Security` ã䜿ãããšã§ã**FastAPI** ã¯ã»ãã¥ãªãã£ã¹ã³ãŒãã宣èšã»å
éšå©çšã§ããOpenAPI ã§ API ãããã¥ã¡ã³ãåã§ãããšå€æããŸãã
+
+ãªãã`fastapi` ãã `Query`ã`Path`ã`Depends`ã`Security` ãªã©ãã€ã³ããŒãããéããããã¯å®éã«ã¯ç¹æ®ãªã¯ã©ã¹ãè¿ã颿°ã§ãã
+
+///
+
+## `SecurityScopes` ã䜿ã { #use-securityscopes }
+
+次ã«ãäŸå颿° `get_current_user` ãæŽæ°ããŸãã
+
+ããã¯äžèšã®äŸåé¢ä¿ãã䜿çšãããŸãã
+
+ããã§ãå
ã»ã©äœæããåã OAuth2 ã¹ããŒã ãäŸåé¢ä¿ïŒ`oauth2_scheme`ïŒãšããŠå®£èšããŠäœ¿ããŸãã
+
+ãã®äŸå颿°èªäœã¯ã¹ã³ãŒãèŠä»¶ãæããªãããã`oauth2_scheme` ã«ã¯ `Depends` ã䜿ããŸããã»ãã¥ãªãã£ã¹ã³ãŒããæå®ããå¿
èŠããªãå Žå㯠`Security` ã䜿ãå¿
èŠã¯ãããŸããã
+
+ããã«ã`fastapi.security` ããã€ã³ããŒãããç¹å¥ãªå `SecurityScopes` ã®ãã©ã¡ãŒã¿ã宣èšããŸãã
+
+ãã® `SecurityScopes` ã¯ã©ã¹ã¯ `Request` ã«äŒŒãŠããŸãïŒ`Request` ã¯ãªã¯ãšã¹ããªããžã§ã¯ããçŽæ¥ååŸããããã«äœ¿ããŸããïŒã
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[9,106] *}
+
+## `scopes` ã䜿ã { #use-the-scopes }
+
+ãã©ã¡ãŒã¿ `security_scopes` 㯠`SecurityScopes` åã«ãªããŸãã
+
+ãã®ãªããžã§ã¯ãã¯ãèªèº«ããã³ããããµãäŸåãšããŠäœ¿ããã¹ãŠã®äŸåé¢ä¿ã§èŠæ±ãããã¹ã³ãŒããå«ã `scopes` ããããã£ïŒãªã¹ãïŒãæã¡ãŸããã€ãŸãããã¹ãŠã®ãäŸåå
ã... å°ãåããã«ãããããããŸããããåŸã§å床説æããŸãã
+
+`security_scopes`ïŒ`SecurityScopes` ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ïŒã¯ãèŠæ±ãããã¹ã³ãŒãã空çœã§é£çµãã 1 ã€ã®æååãè¿ã `scope_str` ãæäŸããŸãïŒããã䜿ããŸãïŒã
+
+åŸã§è€æ°ç®æã§åå©çšïŒraiseïŒã§ããããã«ã`HTTPException` ã 1 ã€äœæããŸãã
+
+ãã®äŸå€ã«ã¯ãèŠæ±ãããã¹ã³ãŒããããã°ãããã空çœåºåãã®æååïŒ`scope_str` ã䜿çšïŒãšããŠå«ããŸãããã®ã¹ã³ãŒãæåå㯠`WWW-Authenticate` ãããã«å
¥ããŸãïŒä»æ§ã®äžéšã§ãïŒã
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[106,108:116] *}
+
+## `username` ãšããŒã¿æ§é ã®æ€èšŒ { #verify-the-username-and-data-shape }
+
+`username` ãååŸã§ããŠããããšã確èªããã¹ã³ãŒããåãåºããŸãã
+
+ãããŠããã®ããŒã¿ã Pydantic ã¢ãã«ã§æ€èšŒããŸãïŒ`ValidationError` äŸå€ãææïŒãJWT ããŒã¯ã³ã®èªã¿åãã Pydantic ã«ããããŒã¿æ€èšŒã§ãšã©ãŒãçºçããå Žåã¯ãå
ã»ã©äœæãã `HTTPException` ãéåºããŸãã
+
+ãã®ããã«ãPydantic ã¢ãã« `TokenData` ã«æ°ãããããã㣠`scopes` ã远å ããŸãã
+
+Pydantic ã§ããŒã¿ãæ€èšŒããããšã§ãäŸãã°ã¹ã³ãŒã㯠`str` ã® `list`ã`username` 㯠`str` ãšãã£ããæ£ç¢ºãªåã«ãªã£ãŠããããšãä¿èšŒã§ããŸãã
+
+ããããŠããã°ãäŸãã°èª€ã£ãŠ `dict` ãªã©ãå
¥ã£ãŠåŸã§ã¢ããªã±ãŒã·ã§ã³ãç Žå£ããŠããŸããã»ãã¥ãªãã£ãªã¹ã¯ã«ãªãããšãã£ãäºæ
ãé¿ããããŸãã
+
+ãŸãããã® `username` ãæã€ãŠãŒã¶ãŒãååšããããšã確èªããååšããªããã°ããã¯ãå
ã»ã©ã®äŸå€ãéåºããŸãã
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[47,117:129] *}
+
+## `scopes` ã®æ€èšŒ { #verify-the-scopes }
+
+ãã®äŸå颿°ããã³ãã¹ãŠã®äŸåå
ïŒpath operation ãå«ãïŒãèŠæ±ãããã¹ãŠã®ã¹ã³ãŒãããåãåã£ãããŒã¯ã³ã«å«ãŸããŠããããšãæ€èšŒããå«ãŸããŠããªããã° `HTTPException` ãéåºããŸãã
+
+ãã®ããã«ãããããã¹ãŠã®ã¹ã³ãŒãã `str` ã® `list` ãšããŠå«ã `security_scopes.scopes` ã䜿ããŸãã
+
+{* ../../docs_src/security/tutorial005_an_py310.py hl[130:136] *}
+
+## äŸåé¢ä¿ããªãŒãšã¹ã³ãŒã { #dependency-tree-and-scopes }
+
+äŸåé¢ä¿ããªãŒãšã¹ã³ãŒããããäžåºŠèŠãŠã¿ãŸãããã
+
+`get_current_active_user` äŸåé¢ä¿ã¯ `get_current_user` ããµãäŸåãšããŠæã€ããã`get_current_active_user` ã§å®£èšããã `"me"` ã¹ã³ãŒãã¯ã`get_current_user` ã«æž¡ããã `security_scopes.scopes` ã®å¿
é ã¹ã³ãŒãäžèЧã«å«ãŸããŸãã
+
+path operation èªäœã `"items"` ã¹ã³ãŒãã宣èšãããããããã `get_current_user` ã«æž¡ããã `security_scopes.scopes` ã«å«ãŸããŸãã
+
+äŸåé¢ä¿ãšã¹ã³ãŒãã®éå±€ã¯æ¬¡ã®ããã«ãªããŸã:
+
+- *path operation* `read_own_items` ã«ã¯:
+ - äŸåé¢ä¿ã«å¯ŸããŠå¿
é ã¹ã³ãŒã `["items"]` ããã:
+ - `get_current_active_user`:
+ - äŸå颿° `get_current_active_user` ã«ã¯:
+ - äŸåé¢ä¿ã«å¯ŸããŠå¿
é ã¹ã³ãŒã `["me"]` ããã:
+ - `get_current_user`:
+ - äŸå颿° `get_current_user` ã«ã¯:
+ - èªèº«ã«å¿
é ã¹ã³ãŒãã¯ãªãã
+ - `oauth2_scheme` ã䜿ãäŸåé¢ä¿ãããã
+ - `SecurityScopes` åã® `security_scopes` ãã©ã¡ãŒã¿ããã:
+ - ãã® `security_scopes` ãã©ã¡ãŒã¿ã¯ãäžã§å®£èšããããã¹ãŠã®ã¹ã³ãŒããå«ã `list` ãæã€ `scopes` ããããã£ãæã€ããããã£ãŠ:
+ - *path operation* `read_own_items` ã§ã¯ã`security_scopes.scopes` 㯠`["me", "items"]` ãå«ãã
+ - *path operation* `read_users_me` ã§ã¯ã`security_scopes.scopes` 㯠`["me"]` ãå«ããããã¯äŸåé¢ä¿ `get_current_active_user` ã«å®£èšãããŠããããã
+ - *path operation* `read_system_status` ã§ã¯ã`security_scopes.scopes` 㯠`[]`ïŒç©ºïŒã«ãªãã`scopes` ãæã€ `Security` ã宣èšããŠãããããã®äŸåé¢ä¿ `get_current_user` ã `scopes` ã宣èšããŠããªãããã
+
+/// tip | è±ç¥è
+
+éèŠã§ãéæ³ã®ããããªç¹ã¯ã`get_current_user` ã path operation ããšã«ç°ãªã `scopes` ã®ãªã¹ãããã§ãã¯ããããšã«ãªãããšããããšã§ãã
+
+ããã¯ãããããã® path operation ãšããã® path operation ã®äŸåé¢ä¿ããªãŒå
ã®åäŸåé¢ä¿ã§å®£èšããã `scopes` ã«ãã£ãŠæ±ºãŸããŸãã
+
+///
+
+## `SecurityScopes` ã®è©³çް { #more-details-about-securityscopes }
+
+`SecurityScopes` ã¯ã©ã®å°ç¹ã§ããè€æ°ç®æã§ã䜿ããŸãããã«ãŒããã®äŸåé¢ä¿ã§ããå¿
èŠã¯ãããŸããã
+
+åžžã«ããã®æç¹ã® `Security` äŸåé¢ä¿ãšã**ãã®ç¹å®ã®** path operation ãš **ãã®ç¹å®ã®** äŸåé¢ä¿ããªãŒã«ãããããã¹ãŠã®äŸåå
ã§å®£èšãããã»ãã¥ãªãã£ã¹ã³ãŒããæã¡ãŸãã
+
+`SecurityScopes` ã«ã¯äŸåå
ã§å®£èšããããã¹ãŠã®ã¹ã³ãŒããå
¥ããããããŒã¯ã³ãå¿
èŠãªã¹ã³ãŒããæã£ãŠãããã©ãããäžå€®ã®äŸå颿°ã§æ€èšŒããpath operation ããšã«ç°ãªãã¹ã³ãŒãèŠä»¶ã宣èšããããšãã£ãäœ¿ãæ¹ãã§ããŸãã
+
+ããã㯠path operation ããšã«ç¬ç«ããŠæ€èšŒãããŸãã
+
+## ãã§ã㯠{ #check-it }
+
+API ããã¥ã¡ã³ããéããšãèªèšŒããŠãèš±å¯ããã¹ã³ãŒããæå®ã§ããŸãã
+
+<img src="/img/tutorial/security/image11.png">
+
+ã©ã®ã¹ã³ãŒããéžæããªãå Žåã¯ãèªèšŒæžã¿ãã«ã¯ãªããŸããã`/users/me/` ã `/users/me/items/` ã«ã¢ã¯ã»ã¹ããããšãããšãæš©éãäžè¶³ããŠãããšãããšã©ãŒã«ãªããŸãã`/status/` ã«ã¯åŒãç¶ãã¢ã¯ã»ã¹ã§ããŸãã
+
+`me` ã¹ã³ãŒãã ããéžæãã`items` ã¹ã³ãŒããéžæããªãå Žåã¯ã`/users/me/` ã«ã¯ã¢ã¯ã»ã¹ã§ããŸããã`/users/me/items/` ã«ã¯ã¢ã¯ã»ã¹ã§ããŸããã
+
+ããã¯ããŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã«äžããæš©éã®ç¯å²ã«å¿ããŠããµãŒãããŒãã£ã¢ããªã±ãŒã·ã§ã³ããããã® path operation ã®ããããã«ããŠãŒã¶ãŒããæäŸãããããŒã¯ã³ã§ã¢ã¯ã»ã¹ããããšãããšãã«èµ·ããåäœã§ãã
+
+## ãµãŒãããŒãã£çµ±åã«ã€ã㊠{ #about-third-party-integrations }
+
+ãã®äŸã§ã¯ãOAuth2 ã®ãpasswordããããŒã䜿çšããŠããŸãã
+
+ããã¯ãïŒããããèªåã®ããã³ããšã³ãã§ïŒèªåãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã«ãã°ã€ã³ããå Žåã«é©ããŠããŸãã
+
+èªåãã¡ã§ç®¡çããŠããããã`username` ãš `password` ãåãåãçžæãä¿¡é Œã§ããããã§ãã
+
+ããããä»è
ãæ¥ç¶ãã OAuth2 ã¢ããªã±ãŒã·ã§ã³ïŒFacebookãGoogleãGitHub ãªã©ã«çžåœããèªèšŒãããã€ãïŒãæ§ç¯ããå Žåã¯ãä»ã®ããããã®ãããŒã䜿çšãã¹ãã§ãã
+
+æãäžè¬çãªã®ã¯ implicit ãããŒã§ãã
+
+æãå®å
šãªã®ã¯ code ãããŒã§ãããæé ãå€ãå®è£
ãããè€éã§ããè€éãªãããå€ãã®ãããã€ãã¯çµå± implicit ãããŒãæšå¥šããããšããããŸãã
+
+/// note | åè
+
+åèªèšŒãããã€ãããããŒã«ç¬èªã®åç§°ãä»ããèªç€Ÿã®ãã©ã³ãã®äžéšã«ããã®ã¯äžè¬çã§ãã
+
+ããããæçµçã«ã¯åã OAuth2 æšæºãå®è£
ããŠããŸãã
+
+///
+
+**FastAPI** ã«ã¯ãããããã¹ãŠã® OAuth2 èªèšŒãããŒåãã®ãŠãŒãã£ãªãã£ã `fastapi.security.oauth2` ã«å«ãŸããŠããŸãã
+
+## ãã³ã¬ãŒã¿ `dependencies` ã§ã® `Security` { #security-in-decorator-dependencies }
+
+ãã³ã¬ãŒã¿ã® `dependencies` ãã©ã¡ãŒã¿ã« `Depends` ã® `list` ãå®çŸ©ã§ããã®ãšåæ§ïŒ[path operation ãã³ã¬ãŒã¿ã§ã®äŸåé¢ä¿](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} åç
§ïŒãããã§ `scopes` ãæå®ãã `Security` ã䜿çšã§ããŸãã
--- /dev/null
+# èšå®ãšç°å¢å€æ° { #settings-and-environment-variables }
+
+å€ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ã¯å€éšã®èšå®ãæ§æãå¿
èŠãšããŸããããšãã°ãã·ãŒã¯ã¬ããããŒãããŒã¿ããŒã¹èªèšŒæ
å ±ãã¡ãŒã«ãµãŒãã¹ã®èªèšŒæ
å ±ãªã©ã§ãã
+
+ãããã®èšå®ã®å€ãã¯å¯å€ïŒå€æŽããããïŒã§ãããŒã¿ããŒã¹ã®URLã®ãããªãã®ããããŸãããŸããå€ãã¯ã·ãŒã¯ã¬ããã®ããã«æ©åŸ®ãªæ
å ±ã§ãã
+
+ãã®ãããã¢ããªã±ãŒã·ã§ã³ãèªã¿åãç°å¢å€æ°ã§æäŸããã®ãäžè¬çã§ãã
+
+/// tip | è±ç¥è
+
+ç°å¢å€æ°ã«ã€ããŠçè§£ããã«ã¯ã[ç°å¢å€æ°](../environment-variables.md){.internal-link target=_blank}ãåç
§ããŠãã ããã
+
+///
+
+## åãšããªããŒã·ã§ã³ { #types-and-validation }
+
+ãããã®ç°å¢å€æ°ã¯ Python ã®å€éšã«ãããä»ã®ããã°ã©ã ãã·ã¹ãã å
šäœïŒLinuxãWindowsãmacOS ãšãã£ãç°ãªãOSãå«ãïŒãšäºææ§ãå¿
èŠãªãããæååããã¹ãã®ã¿ãæ±ããŸãã
+
+ã€ãŸããPython ã§ç°å¢å€æ°ããèªã¿åãããå€ã¯ãã¹ãŠ `str` ã«ãªããä»ã®åãžã®å€æãããªããŒã·ã§ã³ã¯ã³ãŒãã§è¡ãå¿
èŠããããŸãã
+
+## Pydantic ã® `Settings` { #pydantic-settings }
+
+幞ããªããšã«ãPydantic ã«ã¯ç°å¢å€æ°ããæ¥ãèšå®ãæ±ãããã®åªãããŠãŒãã£ãªãã£ãããã<a href="https://docs.pydantic.dev/latest/concepts/pydantic_settings/" class="external-link" target="_blank">Pydantic: Settings management</a> ã§æäŸãããŠããŸãã
+
+### `pydantic-settings` ã®ã€ã³ã¹ããŒã« { #install-pydantic-settings }
+
+ãŸãã[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank}ãäœæããŠæå¹åãã`pydantic-settings` ããã±ãŒãžãã€ã³ã¹ããŒã«ããŸã:
+
+<div class="termy">
+
+```console
+$ pip install pydantic-settings
+---> 100%
+```
+
+</div>
+
+ãŸããæ¬¡ã®ããã« `all` ãšã¯ã¹ãã©ãã€ã³ã¹ããŒã«ãããšä»å±ããŸã:
+
+<div class="termy">
+
+```console
+$ pip install "fastapi[all]"
+---> 100%
+```
+
+</div>
+
+### `Settings` ãªããžã§ã¯ããäœæ { #create-the-settings-object }
+
+Pydantic ãã `BaseSettings` ãã€ã³ããŒãããŠããã®ãµãã¯ã©ã¹ãäœæããŸãããã㯠Pydantic ã¢ãã«ãšã»ãŒåãã§ãã
+
+Pydantic ã¢ãã«ãšåæ§ã«ãåã¢ãããŒã·ã§ã³ãšïŒå¿
èŠãªãïŒããã©ã«ãå€ãæã€ã¯ã©ã¹å±æ§ã宣èšããŸãã
+
+`Field()` ã«ãã远å ããªããŒã·ã§ã³ãªã©ãPydantic ã¢ãã«ã§äœ¿ããã®ãšåãããªããŒã·ã§ã³æ©èœããã¹ãŠå©çšã§ããŸãã
+
+{* ../../docs_src/settings/tutorial001_py310.py hl[2,5:8,11] *}
+
+/// tip | è±ç¥è
+
+ã³ããçšã«ææ©ã䜿ãããå Žåã¯ããã®äŸã§ã¯ãªããäžã®æåŸã®äŸã䜿ã£ãŠãã ããã
+
+///
+
+ãã®åŸããã® `Settings` ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ïŒãã®äŸã§ã¯ `settings` ãªããžã§ã¯ãïŒãäœæãããšãPydantic ã¯ç°å¢å€æ°ã倧æåå°æåãåºå¥ããã«èªã¿åããŸããã€ãŸãã倧æåã® `APP_NAME` ãšãã倿°ã¯ã屿§ `app_name` ã«å¯ŸããŠãèªã¿åãããŸãã
+
+次ã«ãããŒã¿ã倿ã»ããªããŒã·ã§ã³ãããŸãããããã£ãŠã`settings` ãªããžã§ã¯ãã䜿ããšã宣èšããåã®ããŒã¿ïŒäŸ: `items_per_user` 㯠`int`ïŒãåŸãããŸãã
+
+### `settings` ã®äœ¿çš { #use-the-settings }
+
+次ã«ãã¢ããªã±ãŒã·ã§ã³ã§æ°ãã `settings` ãªããžã§ã¯ãã䜿çšã§ããŸã:
+
+{* ../../docs_src/settings/tutorial001_py310.py hl[18:20] *}
+
+### ãµãŒããŒãå®è¡ { #run-the-server }
+
+次ã«ãèšå®ãç°å¢å€æ°ãšããŠæž¡ããŠãµãŒããŒãå®è¡ããŸããããšãã°ã`ADMIN_EMAIL` ãš `APP_NAME` ãæ¬¡ã®ããã«èšå®ã§ããŸã:
+
+<div class="termy">
+
+```console
+$ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.py
+
+<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+</div>
+
+/// tip | è±ç¥è
+
+1ã€ã®ã³ãã³ãã«è€æ°ã®ç°å¢å€æ°ãèšå®ããã«ã¯ãã¹ããŒã¹ã§åºåã£ãŠã³ãã³ãã®åã«äžŠã¹ãŸãã
+
+///
+
+ãããšã`admin_email` ã®èšå®ã¯ `"deadpool@example.com"` ã«èšå®ãããŸãã
+
+`app_name` 㯠`"ChimichangApp"` ã«ãªããŸãã
+
+`items_per_user` ã¯ããã©ã«ãå€ã® `50` ã®ãŸãŸã§ãã
+
+## å¥ã¢ãžã¥ãŒã«ã§ã®èšå® { #settings-in-another-module }
+
+[å€§èŠæš¡ã¢ããªã±ãŒã·ã§ã³ - è€æ°ãã¡ã€ã«](../tutorial/bigger-applications.md){.internal-link target=_blank} ã§èŠãããã«ããããã®èšå®ãå¥ã®ã¢ãžã¥ãŒã«ãã¡ã€ã«ã«çœ®ãããšãã§ããŸãã
+
+ããšãã°ã`config.py` ãšãããã¡ã€ã«ã«æ¬¡ã®ããã«æžããŸã:
+
+{* ../../docs_src/settings/app01_py310/config.py *}
+
+ãããŠã`main.py` ãšãããã¡ã€ã«ã§ããã䜿ããŸã:
+
+{* ../../docs_src/settings/app01_py310/main.py hl[3,11:13] *}
+
+/// tip | è±ç¥è
+
+[å€§èŠæš¡ã¢ããªã±ãŒã·ã§ã³ - è€æ°ãã¡ã€ã«](../tutorial/bigger-applications.md){.internal-link target=_blank} ã§èŠãããã«ã`__init__.py` ãã¡ã€ã«ãå¿
èŠã§ãã
+
+///
+
+## äŸåé¢ä¿ã§ã®èšå® { #settings-in-a-dependency }
+
+å Žåã«ãã£ãŠã¯ãã©ãã§ã䜿ãã°ããŒãã«ãª `settings` ãªããžã§ã¯ããæã€ä»£ããã«ãäŸåé¢ä¿ããèšå®ãæäŸãããšäŸ¿å©ãªããšããããŸãã
+
+ããã¯ç¹ã«ãã¹ãæã«æçšã§ãäŸåé¢ä¿ãç¬èªã®ã«ã¹ã¿ã èšå®ã§ç°¡åã«ãªãŒããŒã©ã€ãã§ããããã§ãã
+
+### èšå®ãã¡ã€ã« { #the-config-file }
+
+åã®äŸããç¶ãããšã`config.py` ãã¡ã€ã«ã¯æ¬¡ã®ããã«ãªããŸã:
+
+{* ../../docs_src/settings/app02_an_py310/config.py hl[10] *}
+
+ããã§ã¯ãããã©ã«ãã®ã€ã³ã¹ã¿ã³ã¹ `settings = Settings()` ãäœæããŠããªãããšã«æ³šæããŠãã ããã
+
+### ã¡ã€ã³ã¢ããªãã¡ã€ã« { #the-main-app-file }
+
+ããã§ã¯ãæ°ãã `config.Settings()` ãè¿ãäŸåé¢ä¿ãäœæããŸãã
+
+{* ../../docs_src/settings/app02_an_py310/main.py hl[6,12:13] *}
+
+/// tip | è±ç¥è
+
+`@lru_cache` ã«ã€ããŠã¯åŸã§èª¬æããŸãã
+
+ä»ã¯ `get_settings()` ãæ®éã®é¢æ°ã ãšèããŠãã ããã
+
+///
+
+ãããŠã*path operation 颿°*ããäŸåé¢ä¿ãšããŠèŠæ±ããå¿
èŠãªå Žæã§ã©ãã§ã䜿ããŸãã
+
+{* ../../docs_src/settings/app02_an_py310/main.py hl[17,19:21] *}
+
+### èšå®ãšãã¹ã { #settings-and-testing }
+
+次ã«ã`get_settings` ã®äŸåé¢ä¿ãªãŒããŒã©ã€ããäœãããšã§ããã¹ãäžã«å¥ã®èšå®ãªããžã§ã¯ããæäŸããã®ããšãŠãç°¡åã«ãªããŸã:
+
+{* ../../docs_src/settings/app02_an_py310/test_main.py hl[9:10,13,21] *}
+
+äŸåé¢ä¿ãªãŒããŒã©ã€ãã§ã¯ãæ°ãã `Settings` ãªããžã§ã¯ããäœãéã« `admin_email` ã«æ°ããå€ãèšå®ãããã®æ°ãããªããžã§ã¯ããè¿ããŸãã
+
+ãããŠãããã䜿çšãããŠããããšããã¹ãã§ããŸãã
+
+## `.env` ãã¡ã€ã«ã®èªã¿èŸŒã¿ { #reading-a-env-file }
+
+倿Žãå€ããªããããªèšå®ã倿°ããå Žåãç°å¢ããšã«ãã¡ã€ã«ã«å
¥ããŠãç°å¢å€æ°ãšããŠããããèªã¿èŸŒããšäŸ¿å©ãªããšããããŸãã
+
+ãã®ãã©ã¯ãã£ã¹ã¯ååã«äžè¬çã§ååãããããããã®ç°å¢å€æ°ã¯éåžž `.env` ãšãããã¡ã€ã«ã«çœ®ããããã®ãã¡ã€ã«ã¯ãdotenvããšåŒã°ããŸãã
+
+/// tip | è±ç¥è
+
+ãããïŒ`.`ïŒã§å§ãŸããã¡ã€ã«ã¯ãLinux ã macOS ã®ãã㪠Unix ç³»ã·ã¹ãã ã§ã¯é ããã¡ã€ã«ã§ãã
+
+ãã ããdotenv ãã¡ã€ã«ã¯å¿
ããããã®æ£ç¢ºãªãã¡ã€ã«åã§ããå¿
èŠã¯ãããŸããã
+
+///
+
+Pydantic ã¯å€éšã©ã€ãã©ãªã䜿ã£ãŠãã®çš®ã®ãã¡ã€ã«ããã®èªã¿èŸŒã¿ããµããŒãããŠããŸãã詳现㯠<a href="https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support" class="external-link" target="_blank">Pydantic Settings: Dotenv (.env) support</a> ãåç
§ããŠãã ããã
+
+/// tip | è±ç¥è
+
+ãããæ©èœãããã«ã¯ã`pip install python-dotenv` ãå¿
èŠã§ãã
+
+///
+
+### `.env` ãã¡ã€ã« { #the-env-file }
+
+次ã®ãã㪠`.env` ãã¡ã€ã«ãçšæã§ããŸã:
+
+```bash
+ADMIN_EMAIL="deadpool@example.com"
+APP_NAME="ChimichangApp"
+```
+
+### `.env` ããèšå®ãèªã { #read-settings-from-env }
+
+ãããŠã`config.py` ãæ¬¡ã®ããã«æŽæ°ããŸã:
+
+{* ../../docs_src/settings/app03_an_py310/config.py hl[9] *}
+
+/// tip | è±ç¥è
+
+`model_config` 屿§ã¯ Pydantic ã®èšå®å°çšã§ãã詳ãã㯠<a href="https://docs.pydantic.dev/latest/concepts/config/" class="external-link" target="_blank">Pydantic: Concepts: Configuration</a> ãåç
§ããŠãã ããã
+
+///
+
+ããã§ã¯ãPydantic ã® `Settings` ã¯ã©ã¹å
ã§èšå® `env_file` ãå®çŸ©ãã䜿çšããã dotenv ãã¡ã€ã«ã®ãã¡ã€ã«åãæå®ããŠããŸãã
+
+### `lru_cache` ã§ `Settings` ãäžåºŠã ãäœæ { #creating-the-settings-only-once-with-lru-cache }
+
+ãã£ã¹ã¯ãããã¡ã€ã«ãèªãã®ã¯éåžžã³ã¹ãïŒé
å»¶ïŒãé«ãåŠçãªã®ã§ã1åã ãå®è¡ããŠåãèšå®ãªããžã§ã¯ããåå©çšããåãªã¯ãšã¹ãããšã«èªã¿çŽããªãã®ãæãŸããã§ãã
+
+ããããæ¬¡ã®ããã«ãããã³ã«:
+
+```Python
+Settings()
+```
+
+æ°ãã `Settings` ãªããžã§ã¯ããäœæããããã®äœææã« `.env` ãã¡ã€ã«ãå床èªã¿èŸŒãŸããŸãã
+
+äŸå颿°ã次ã®ããã§ããã°:
+
+```Python
+def get_settings():
+ return Settings()
+```
+
+åãªã¯ãšã¹ãããšã«ãã®ãªããžã§ã¯ããäœæããåãªã¯ãšã¹ãããšã« `.env` ãã¡ã€ã«ãèªã¿èŸŒãããšã«ãªããŸããâ ïž
+
+ããããäžã« `@lru_cache` ãã³ã¬ãŒã¿ã䜿ã£ãŠããã®ã§ã`Settings` ãªããžã§ã¯ãã¯æåã«åŒã³åºããããšãã«äžåºŠã ãäœæãããŸããâïž
+
+{* ../../docs_src/settings/app03_an_py310/main.py hl[1,11] *}
+
+ãã®åŸã®ãªã¯ãšã¹ãçšã®äŸåé¢ä¿ã§ `get_settings()` ãåŒã°ãããã³ã«ã`get_settings()` ã®å
éšã³ãŒããå®è¡ããŠæ°ãã `Settings` ãªããžã§ã¯ããäœãã®ã§ã¯ãªããæåã®åŒã³åºãã§è¿ãããã®ãšåããªããžã§ã¯ããäœåºŠã§ãè¿ããŸãã
+
+#### `lru_cache` ã®æè¡è©³çް { #lru-cache-technical-details }
+
+`@lru_cache` ã¯ãæ¯å颿°ã®ã³ãŒããå®è¡ããŠåèšç®ããã®ã§ã¯ãªããæåã«è¿ããå€ãè¿ãããã«ã修食ãã颿°ã倿ŽããŸãã
+
+ãããã£ãŠããã®äžã®é¢æ°ã¯åŒæ°ã®çµã¿åããããšã«äžåºŠã ãå®è¡ãããŸãããããŠããã®ååŒæ°ã®çµã¿åããã§è¿ãããå€ã¯ããŸã£ããåãåŒæ°ã®çµã¿åããã§åŒã³åºããããšãã«äœåºŠã§ãåå©çšãããŸãã
+
+ããšãã°ã次ã®ãããªé¢æ°ããããšããŸã:
+
+```Python
+@lru_cache
+def say_hi(name: str, salutation: str = "Ms."):
+ return f"Hello {salutation} {name}"
+```
+
+ããã°ã©ã ã¯æ¬¡ã®ããã«å®è¡ãããŸã:
+
+```mermaid
+sequenceDiagram
+
+participant code as Code
+participant function as say_hi()
+participant execute as Execute function
+
+ rect rgba(0, 255, 0, .1)
+ code ->> function: say_hi(name="Camila")
+ function ->> execute: execute function code
+ execute ->> code: return the result
+ end
+
+ rect rgba(0, 255, 255, .1)
+ code ->> function: say_hi(name="Camila")
+ function ->> code: return stored result
+ end
+
+ rect rgba(0, 255, 0, .1)
+ code ->> function: say_hi(name="Rick")
+ function ->> execute: execute function code
+ execute ->> code: return the result
+ end
+
+ rect rgba(0, 255, 0, .1)
+ code ->> function: say_hi(name="Rick", salutation="Mr.")
+ function ->> execute: execute function code
+ execute ->> code: return the result
+ end
+
+ rect rgba(0, 255, 255, .1)
+ code ->> function: say_hi(name="Rick")
+ function ->> code: return stored result
+ end
+
+ rect rgba(0, 255, 255, .1)
+ code ->> function: say_hi(name="Camila")
+ function ->> code: return stored result
+ end
+```
+
+ä»åã®äŸå颿° `get_settings()` ã®å Žåã颿°ã¯åŒæ°ãäžååããŸããããã®ãããåžžã«åãå€ãè¿ããŸãã
+
+ãã®æ¹æ³ã¯ãã»ãšãã©ã°ããŒãã«å€æ°ã®ããã«æ¯ãèããŸããããããäŸå颿°ã䜿ã£ãŠããã®ã§ããã¹ãã®ããã«ç°¡åã«ãªãŒããŒã©ã€ãã§ããŸãã
+
+`@lru_cache` 㯠Python æšæºã©ã€ãã©ãªã® `functools` ã®äžéšã§ãã詳现㯠<a href="https://docs.python.org/3/library/functools.html#functools.lru_cache" class="external-link" target="_blank">Python ã® `@lru_cache` ããã¥ã¡ã³ã</a>ãåç
§ããŠãã ããã
+
+## ãŸãšã { #recap }
+
+Pydantic Settings ã䜿ãããšã§ãã¢ããªã±ãŒã·ã§ã³ã®èšå®ãæ§æããPydantic ã¢ãã«ã®åãæŽ»ãããŠæ±ããŸãã
+
+* äŸåé¢ä¿ã䜿ãããšã§ããã¹ããç°¡çŽ åã§ããŸãã
+* `.env` ãã¡ã€ã«ãå©çšã§ããŸãã
+* `@lru_cache` ã䜿ããšãåãªã¯ãšã¹ãããšã« dotenv ãã¡ã€ã«ãç¹°ãè¿ãèªã¿èŸŒãã®ãé¿ãã€ã€ããã¹ãæã«ã¯ãªãŒããŒã©ã€ãã§ããŸãã
--- /dev/null
+# ãµãã¢ããªã±ãŒã·ã§ã³ - ããŠã³ã { #sub-applications-mounts }
+
+ããããç¬ç«ãã OpenAPI ãšããã¥ã¡ã³ã UI ãæã€2ã€ã®ç¬ç«ãã FastAPI ã¢ããªã±ãŒã·ã§ã³ãå¿
èŠãªå Žåãã¡ã€ã³ã¢ããªã«1ã€ïŒä»¥äžïŒã®ãµãã¢ããªã±ãŒã·ã§ã³ããããŠã³ããã§ããŸãã
+
+## FastAPI ã¢ããªã±ãŒã·ã§ã³ã®ããŠã³ã { #mounting-a-fastapi-application }
+
+ãããŠã³ãããšã¯ãç¹å®ã®ãã¹ã«å®å
šã«ãç¬ç«ãããã¢ããªã±ãŒã·ã§ã³ã远å ãããã®ãµãã¢ããªã±ãŒã·ã§ã³ã§å®£èšããã path operation ã«ãã£ãŠããã®ãã¹ä»¥äžã®ãã¹ãŠãåŠçãããããšãæå³ããŸãã
+
+### ãããã¬ãã«ã¢ããªã±ãŒã·ã§ã³ { #top-level-application }
+
+ãŸããã¡ã€ã³ã®ãããã¬ãã« **FastAPI** ã¢ããªã±ãŒã·ã§ã³ãšããã® path operation ãäœæããŸã:
+
+{* ../../docs_src/sub_applications/tutorial001_py310.py hl[3, 6:8] *}
+
+### ãµãã¢ããªã±ãŒã·ã§ã³ { #sub-application }
+
+次ã«ããµãã¢ããªã±ãŒã·ã§ã³ãšãã® path operation ãäœæããŸãã
+
+ãã®ãµãã¢ããªã±ãŒã·ã§ã³ã¯éåžžã® FastAPI ã¢ããªã±ãŒã·ã§ã³ã§ãããããããããŠã³ããããŸã:
+
+{* ../../docs_src/sub_applications/tutorial001_py310.py hl[11, 14:16] *}
+
+### ãµãã¢ããªã±ãŒã·ã§ã³ãããŠã³ã { #mount-the-sub-application }
+
+ãããã¬ãã«ã®ã¢ããªã±ãŒã·ã§ã³ `app` ã«ããµãã¢ããªã±ãŒã·ã§ã³ `subapi` ãããŠã³ãããŸãã
+
+ãã®äŸã§ã¯ããã¹ `/subapi` ã«ããŠã³ããããŸã:
+
+{* ../../docs_src/sub_applications/tutorial001_py310.py hl[11, 19] *}
+
+### èªå API ããã¥ã¡ã³ãã®ç¢ºèª { #check-the-automatic-api-docs }
+
+ã§ã¯ã`fastapi` ã³ãã³ãã§ãã®ãã¡ã€ã«ãå®è¡ããŸã:
+
+<div class="termy">
+
+```console
+$ fastapi dev main.py
+
+<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+</div>
+
+ãããŠã<a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> ãéããŸãã
+
+ã¡ã€ã³ã¢ããªçšã®èªå API ããã¥ã¡ã³ãã衚瀺ããããã®ã¢ããªèªèº«ã® path operation ã®ã¿ãå«ãŸããŸã:
+
+<img src="/img/tutorial/sub-applications/image01.png">
+
+次ã«ããµãã¢ããªã±ãŒã·ã§ã³ã®ããã¥ã¡ã³ã <a href="http://127.0.0.1:8000/subapi/docs" class="external-link" target="_blank">http://127.0.0.1:8000/subapi/docs</a> ãéããŸãã
+
+ãµãã¢ããªã±ãŒã·ã§ã³çšã®èªå API ããã¥ã¡ã³ãã衚瀺ããããã®ã¢ããªèªèº«ã® path operation ã®ã¿ããæ£ãããµããã¹æ¥é èŸ `/subapi` ã®äžã§è¡šç€ºãããŸã:
+
+<img src="/img/tutorial/sub-applications/image02.png">
+
+ã©ã¡ãã® UI ã§ãæäœããã°æ£ããåäœããŸãããã©ãŠã¶ãããããã®ã¢ããªïŒãµãã¢ããªãšéä¿¡ã§ããããã§ãã
+
+### æè¡è©³çް: `root_path` { #technical-details-root-path }
+
+äžèšã®ããã«ãµãã¢ããªã±ãŒã·ã§ã³ãããŠã³ããããšãFastAPI 㯠ASGI 仿§ã® `root_path` ãšåŒã°ããä»çµã¿ã䜿ã£ãŠããã®ãµãã¢ããªã±ãŒã·ã§ã³ãžã®ããŠã³ããã¹ãäŒæããŸãã
+
+ãã®ããããµãã¢ããªã±ãŒã·ã§ã³ã¯ããã¥ã¡ã³ã UI ã§ãã®ãã¹æ¥é èŸã䜿çšãã¹ãããšãèªèã§ããŸãã
+
+ããã«ããµãã¢ããªã±ãŒã·ã§ã³èªèº«ãå¥ã®ãµãã¢ããªã±ãŒã·ã§ã³ãããŠã³ãããŠããŠãåé¡ãããŸãããFastAPI ããããã® `root_path` ããã¹ãŠèªåçã«åŠçããããã§ãã
+
+`root_path` ã®è©³çްãæç€ºçãªæå®æ¹æ³ã«ã€ããŠã¯ã[ãããã·ã®èåŸã§](behind-a-proxy.md){.internal-link target=_blank} ã®ç¯ã§åŠã¹ãŸãã
--- /dev/null
+# ãã³ãã¬ãŒã { #templates }
+
+**FastAPI** ã§ã¯ä»»æã®ãã³ãã¬ãŒããšã³ãžã³ã䜿çšã§ããŸãã
+
+Flask ãªã©ã§ã䜿ãããŠãã Jinja2 ãäžè¬çãªéžæè¢ã§ãã
+
+Starlette ã«ãã£ãŠæäŸããã**FastAPI** ã¢ããªã§çŽæ¥äœ¿ãããç°¡åã«èšå®ã§ãããŠãŒãã£ãªãã£ããããŸãã
+
+## äŸåé¢ä¿ã®ã€ã³ã¹ããŒã« { #install-dependencies }
+
+[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank} ãäœæããŠæå¹åãã`jinja2` ãã€ã³ã¹ããŒã«ããŸã:
+
+<div class="termy">
+
+```console
+$ pip install jinja2
+
+---> 100%
+```
+
+</div>
+
+## `Jinja2Templates` ã®äœ¿çš { #using-jinja2templates }
+
+* `Jinja2Templates` ãã€ã³ããŒãããŸãã
+* åŸã§åå©çšã§ãã `templates` ãªããžã§ã¯ããäœæããŸãã
+* ãã³ãã¬ãŒããè¿ã path operation ã« `Request` ãã©ã¡ãŒã¿ã宣èšããŸãã
+* äœæãã `templates` ã䜿ã£ãŠ `TemplateResponse` ãã¬ã³ããªã³ã°ããŠè¿ããŸãããã³ãã¬ãŒãåããªã¯ãšã¹ããªããžã§ã¯ããJinja2 ãã³ãã¬ãŒãå
ã§äœ¿çšããããŒãšå€ã®ãã¢ãããªã "context" ã®èŸæžãæž¡ããŸãã
+
+{* ../../docs_src/templates/tutorial001_py310.py hl[4,11,15:18] *}
+
+/// note | åè
+
+FastAPI 0.108.0ãStarlette 0.29.0 以åã§ã¯ã`name` ã¯æåã®ãã©ã¡ãŒã¿ã§ããã
+
+ãŸããã以åã®ããŒãžã§ã³ã§ã¯ã`request` ãªããžã§ã¯ã㯠Jinja2 çšã®ã³ã³ããã¹ãå
ã®ããŒãšå€ã®ãã¢ã®äžéšãšããŠæž¡ãããŠããŸããã
+
+///
+
+/// tip | è±ç¥è
+
+`response_class=HTMLResponse` ã宣èšãããšãããã¥ã¡ã³ã UI ãã¬ã¹ãã³ã¹ã HTML ã§ããããšãèªèã§ããŸãã
+
+///
+
+/// note | æè¡è©³çް
+
+`from starlette.templating import Jinja2Templates` ã䜿ãããšãã§ããŸãã
+
+**FastAPI** ã¯ãéçºè
ã§ããããªãã®å©äŸ¿æ§ã®ããã«ã`starlette.templating` ãšåããã®ã `fastapi.templating` ãšããŠæäŸããŠããŸããããããå©çšå¯èœãªã¬ã¹ãã³ã¹ã®ã»ãšãã©ã¯ Starlette ããçŽæ¥æäŸãããŠããŸãã`Request` ã `StaticFiles` ãåæ§ã§ãã
+
+///
+
+## ãã³ãã¬ãŒãã®äœæ { #writing-templates }
+
+äŸãã°ã`templates/item.html` ã«æ¬¡ã®ãããªãã³ãã¬ãŒããæžããŸã:
+
+```jinja hl_lines="7"
+{!../../docs_src/templates/templates/item.html!}
+```
+
+### ãã³ãã¬ãŒãã®ã³ã³ããã¹ãå€ { #template-context-values }
+
+次ã®ãã㪠HTML å
ã§:
+
+{% raw %}
+
+```jinja
+Item ID: {{ id }}
+```
+
+{% endraw %}
+
+...æž¡ãã "context" ã® `dict` ããååŸãã `id` ã衚瀺ãããŸã:
+
+```Python
+{"id": id}
+```
+
+äŸãã°ãID ã `42` ã®å Žåã¯æ¬¡ã®ããã«ã¬ã³ããªã³ã°ãããŸã:
+
+```html
+Item ID: 42
+```
+
+### ãã³ãã¬ãŒãã® `url_for` ã®åŒæ° { #template-url-for-arguments }
+
+ãã³ãã¬ãŒãå
ã§ã `url_for()` ã䜿çšã§ããŸããåŒæ°ã«ã¯ã察å¿ãã path operation 颿°ã§äœ¿ãããã®ãšåãåŒæ°ãåããŸãã
+
+ãããã£ãŠã次ã®éšåã¯:
+
+{% raw %}
+
+```jinja
+<a href="{{ url_for('read_item', id=id) }}">
+```
+
+{% endraw %}
+
+...path operation 颿° `read_item(id=id)` ãåŠçããã®ãšåã URL ãžã®ãªã³ã¯ãçæããŸãã
+
+äŸãã°ãID ã `42` ã®å Žåã¯æ¬¡ã®ããã«ã¬ã³ããªã³ã°ãããŸã:
+
+```html
+<a href="/items/42">
+```
+
+## ãã³ãã¬ãŒããšéçãã¡ã€ã« { #templates-and-static-files }
+
+ãã³ãã¬ãŒãå
ã§ `url_for()` ã䜿çšããäŸãã° `name="static"` ã§ããŠã³ããã `StaticFiles` ã«å¯ŸããŠå©çšã§ããŸãã
+
+```jinja hl_lines="4"
+{!../../docs_src/templates/templates/item.html!}
+```
+
+ãã®äŸã§ã¯ã`static/styles.css` ã® CSS ãã¡ã€ã«ã«ãªã³ã¯ããŸã:
+
+```CSS hl_lines="4"
+{!../../docs_src/templates/static/styles.css!}
+```
+
+ãŸãã`StaticFiles` ã䜿çšããŠããããããã® CSS ãã¡ã€ã«ã¯ **FastAPI** ã¢ããªã±ãŒã·ã§ã³ãã URL `/static/styles.css` ã§èªåçã«é
ä¿¡ãããŸãã
+
+## ããã«è©³ãã { #more-details }
+
+ãã詳ããå
容ïŒãã³ãã¬ãŒãã®ãã¹ãæ¹æ³ãªã©ïŒã«ã€ããŠã¯ã<a href="https://www.starlette.dev/templates/" class="external-link" target="_blank">Starlette ã®ãã³ãã¬ãŒãã«é¢ããããã¥ã¡ã³ã</a>ãåç
§ããŠãã ããã
--- /dev/null
+# äŸåé¢ä¿ã®ãªãŒããŒã©ã€ãã«ãããã¹ã { #testing-dependencies-with-overrides }
+
+## ãã¹ãæã®äŸåé¢ä¿ã®ãªãŒããŒã©ã€ã { #overriding-dependencies-during-testing }
+
+ãã¹ãäžã«äŸåé¢ä¿ããªãŒããŒã©ã€ããããå Žé¢ãããã€ããããŸãã
+
+å
ã®äŸåé¢ä¿ïŒããã³ããã«ã¶ãäžãããµãäŸåé¢ä¿ïŒãå®è¡ããããªãå Žåã§ãã
+
+代ããã«ããã¹ãã®éã ãïŒç¹å®ã®ãã¹ãã ãã§ãïŒäœ¿ãããå¥ã®äŸåé¢ä¿ãæäŸããå
ã®äŸåé¢ä¿ã®å€ã䜿ãããŠããç®æã§å©çšã§ããå€ãè¿ãããã®ã§ãã
+
+### ãŠãŒã¹ã±ãŒã¹: å€éšãµãŒãã¹ { #use-cases-external-service }
+
+äŸãšããŠãåŒã³åºãå¿
èŠãããå€éšã®èªèšŒãããã€ãããããšããŸãã
+
+ããŒã¯ã³ãéããšãèªèšŒæžã¿ãŠãŒã¶ãŒãè¿ã£ãŠããŸãã
+
+ãã®ãããã€ãã¯ãªã¯ãšã¹ãããšã«èª²éããããããããããã¹ãçšã«åºå®ã®ã¢ãã¯ãŠãŒã¶ãŒã䜿ãå Žåã«æ¯ã¹ãŠåŒã³åºãã«äœåãªæéãããããããããŸããã
+
+å€éšãããã€ãèªäœã®åäœã¯äžåºŠã¯ãã¹ããããã§ãããããå®è¡ããããã¹ãŠã®ãã¹ãã§æ¯ååŒã³åºãå¿
èŠã¯ãããŸããã
+
+ãã®å Žåããã®ãããã€ããåŒã³åºãäŸåé¢ä¿ããªãŒããŒã©ã€ããããã¹ãã®ãšãã ãã¢ãã¯ãŠãŒã¶ãŒãè¿ãã«ã¹ã¿ã ã®äŸåé¢ä¿ã䜿ããŸãã
+
+### app.dependency_overrides 屿§ã䜿ã { #use-the-app-dependency-overrides-attribute }
+
+ãã®ãããªå Žåã®ããã«ã**FastAPI** ã¢ããªã±ãŒã·ã§ã³ã«ã¯ `app.dependency_overrides` ãšãã屿§ããããããã¯åçŽãª `dict` ã§ãã
+
+ãã¹ãçšã«äŸåé¢ä¿ããªãŒããŒã©ã€ãããã«ã¯ãããŒã«å
ã®äŸåé¢ä¿ïŒé¢æ°ïŒããå€ã«ãªãŒããŒã©ã€ãããäŸåé¢ä¿ïŒå¥ã®é¢æ°ïŒãèšå®ããŸãã
+
+ãããš **FastAPI** ã¯å
ã®äŸåé¢ä¿ã®ä»£ããã«ãã®ãªãŒããŒã©ã€ããåŒã³åºããŸãã
+
+{* ../../docs_src/dependency_testing/tutorial001_an_py310.py hl[26:27,30] *}
+
+/// tip | è±ç¥è
+
+ã¢ããªã±ãŒã·ã§ã³å
ã®ã©ãã§äœ¿ãããŠããäŸåé¢ä¿ã«å¯ŸããŠããäŸåé¢ä¿ã®ãªãŒããŒã©ã€ããèšå®ã§ããŸãã
+
+å
ã®äŸåé¢ä¿ã¯ã*path operation 颿°*ã*path operation ãã³ã¬ãŒã¿*ïŒæ»ãå€ã䜿ããªãå ŽåïŒã`.include_router()` ã®åŒã³åºããªã©ãããŸããŸãªå Žæã§äœ¿ãããŠããŠãããŸããŸããã
+
+FastAPI ã¯ããã§ããªãŒããŒã©ã€ãã§ããŸãã
+
+///
+
+ãã®åŸã`app.dependency_overrides` ã空㮠`dict` ã«èšå®ããããšã§ããªãŒããŒã©ã€ãããªã»ããïŒåé€ïŒã§ããŸã:
+
+```Python
+app.dependency_overrides = {}
+```
+
+/// tip | è±ç¥è
+
+äžéšã®ãã¹ãã®éã ãäŸåé¢ä¿ããªãŒããŒã©ã€ããããå Žåã¯ããã¹ãã®éå§æïŒãã¹ã颿°å
ïŒã«ãªãŒããŒã©ã€ããèšå®ããçµäºæïŒãã¹ã颿°ã®æ«å°ŸïŒã«ãªã»ãããããšããã§ãã
+
+///
--- /dev/null
+# ã€ãã³ãã®ãã¹ã: lifespan ãš startup - shutdown { #testing-events-lifespan-and-startup-shutdown }
+
+ãã¹ãã§ `lifespan` ãå®è¡ããå¿
èŠãããå Žåã¯ã`with` æãšäœµçšã㊠`TestClient` ã䜿çšã§ããŸã:
+
+{* ../../docs_src/app_testing/tutorial004_py310.py hl[9:15,18,27:28,30:32,41:43] *}
+
+ãã詳ããå
容ã¯ã[å
¬åŒ Starlette ããã¥ã¡ã³ãã®ããã¹ãã§ã® lifespan ã®å®è¡ã](https://www.starlette.dev/lifespan/#running-lifespan-in-tests) ãåç
§ããŠãã ããã
+
+éæšå¥šã® `startup` ããã³ `shutdown` ã€ãã³ãã«ã€ããŠã¯ã次ã®ããã« `TestClient` ã䜿çšã§ããŸã:
+
+{* ../../docs_src/app_testing/tutorial003_py310.py hl[9:12,20:24] *}
--- /dev/null
+# WebSocket ã®ãã¹ã { #testing-websockets }
+
+WebSocket ããã¹ãããã®ã«ãåã `TestClient` ã䜿çšã§ããŸãã
+
+ãã®ããã«ã`with` æã®äžã§ `TestClient` ã䜿çšããWebSocket ã«æ¥ç¶ããŸã:
+
+{* ../../docs_src/app_testing/tutorial002_py310.py hl[27:31] *}
+
+/// note | åè
+
+詳现ã«ã€ããŠã¯ãStarlette ã®ããã¥ã¡ã³ãã<a href="https://www.starlette.dev/testclient/#testing-websocket-sessions" class="external-link" target="_blank">WebSocket ã®ãã¹ã</a>ããåç
§ããŠãã ããã
+
+///
--- /dev/null
+# Request ãçŽæ¥äœ¿ã { #using-the-request-directly }
+
+ãããŸã§ãå¿
èŠãªãªã¯ãšã¹ãã®åéšåãããã®åãšãšãã«å®£èšããŠããŸããã
+
+次ã®å ŽæããããŒã¿ãååŸããŸã:
+
+- ãã¹ã®ãã©ã¡ãŒã¿
+- ããããŒ
+- ã¯ãããŒ
+- ãªã©
+
+ããããããšã§ã**FastAPI** ã¯ãã®ããŒã¿ãæ€èšŒãã倿ããAPI ã®ããã¥ã¡ã³ããèªåçæããŸãã
+
+ãããã`Request` ãªããžã§ã¯ãã«çŽæ¥ã¢ã¯ã»ã¹ããå¿
èŠãããå Žé¢ããããŸãã
+
+## `Request` ãªããžã§ã¯ãã®è©³çް { #details-about-the-request-object }
+
+**FastAPI** ã¯å
éšçã«ã¯ **Starlette** ã®äžã«ããã€ãã®ããŒã«å±€ãèŒãããã®ãªã®ã§ãå¿
èŠã«å¿ã㊠Starlette ã® <a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">`Request`</a> ãªããžã§ã¯ããçŽæ¥äœ¿ããŸãã
+
+ãŸãã`Request` ãªããžã§ã¯ãããçŽæ¥ããŒã¿ïŒäŸ: ããã£ïŒãååŸããå Žåããã®ããŒã¿ã¯ FastAPI ã«ãã£ãŠæ€èšŒã»å€æã»ããã¥ã¡ã³ãåïŒOpenAPI ã«ããèªå API ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹åãïŒãããŸããã
+
+ãã ããéåžžã©ããã«å®£èšãããä»ã®ãã©ã¡ãŒã¿ïŒäŸ: Pydantic ã¢ãã«ã®ããã£ïŒã¯åŒãç¶ãæ€èšŒã»å€æã»æ³šéä»ããªã©ãè¡ãããŸãã
+
+ããã§ãã`Request` ãªããžã§ã¯ããååŸããã®ãæçšãªç¹å®ã®ã±ãŒã¹ããããŸãã
+
+## `Request` ãªããžã§ã¯ããçŽæ¥äœ¿ã { #use-the-request-object-directly }
+
+ããšãã°ãpath operation 颿°å
ã§ã¯ã©ã€ã¢ã³ãã® IP ã¢ãã¬ã¹ïŒãã¹ããååŸããããšããŸãã
+
+ãã®ããã«ã¯ããªã¯ãšã¹ãã«çŽæ¥ã¢ã¯ã»ã¹ããå¿
èŠããããŸãã
+
+{* ../../docs_src/using_request_directly/tutorial001_py310.py hl[1,7:8] *}
+
+path operation 颿°ã®åŒæ°ãšã㊠`Request` åã®ãã©ã¡ãŒã¿ã宣èšãããšã**FastAPI** ã¯ãã®åŒæ°ã« `Request` ãæž¡ããŸãã
+
+/// tip | è±ç¥è
+
+ãã®äŸã§ã¯ã`Request` åã®åŒæ°ã«å ããŠããã¹ãã©ã¡ãŒã¿ã宣èšããŠããŸãã
+
+ãã®ããããã¹ãã©ã¡ãŒã¿ã¯åãåºãããæ€èšŒãããæå®ããåã«å€æãããOpenAPI ã§æ³šéïŒããã¥ã¡ã³ãåïŒãããŸãã
+
+åæ§ã«ãéåžžã©ããä»»æã®ä»ã®ãã©ã¡ãŒã¿ã宣èšãã€ã€ã远å ã§ `Request` ãåãåããŸãã
+
+///
+
+## `Request` ã®ããã¥ã¡ã³ã { #request-documentation }
+
+ãã詳ããã¯ã<a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">å
¬åŒ Starlette ããã¥ã¡ã³ããµã€ãã® `Request` ãªããžã§ã¯ã</a>ãåç
§ããŠãã ããã
+
+/// note | æè¡è©³çް
+
+`from starlette.requests import Request` ã䜿ãããšãã§ããŸãã
+
+**FastAPI** ã¯éçºè
ã§ããçããã®äŸ¿å®ã®ããã«çŽæ¥æäŸããŠããŸããããã㯠Starlette ãããã®ãŸãŸæäŸãããŠãããã®ã§ãã
+
+///
ããããããã¯WebSocketsã®ãµãŒããŒãµã€ãã«çŠç¹ãåœãŠãåäœããäŸã瀺ãæãç°¡åãªæ¹æ³ã§ãã
-{* ../../docs_src/websockets/tutorial001_py39.py hl[2,6:38,41:43] *}
+{* ../../docs_src/websockets/tutorial001_py310.py hl[2,6:38,41:43] *}
## `websocket` ãäœæãã { #create-a-websocket }
**FastAPI** ã¢ããªã±ãŒã·ã§ã³ã§ã`websocket` ãäœæããŸãã
-{* ../../docs_src/websockets/tutorial001_py39.py hl[1,46:47] *}
+{* ../../docs_src/websockets/tutorial001_py310.py hl[1,46:47] *}
/// note | æè¡è©³çް
WebSocketã«ãŒãã§ã¯ãã¡ãã»ãŒãžãåŸ
æ©ããŠéä¿¡ããããã« `await` ã䜿çšã§ããŸãã
-{* ../../docs_src/websockets/tutorial001_py39.py hl[48:52] *}
+{* ../../docs_src/websockets/tutorial001_py310.py hl[48:52] *}
ãã€ããªãããã¹ãããŒã¿ãJSONããŒã¿ãéåä¿¡ã§ããŸãã
WebSocketæ¥ç¶ãéãããããšã `await websocket.receive_text()` ã¯äŸå€ `WebSocketDisconnect` ãçºçããããã®äŸã®ããã«ãã£ããããŠåŠçããããšãã§ããŸãã
-{* ../../docs_src/websockets/tutorial003_py39.py hl[79:81] *}
+{* ../../docs_src/websockets/tutorial003_py310.py hl[79:81] *}
詊ããŠã¿ãã«ã¯ã
--- /dev/null
+# WSGI ã®çµã¿èŸŒã¿ - FlaskãDjango ãªã© { #including-wsgi-flask-django-others }
+
+[ãµãã¢ããªã±ãŒã·ã§ã³ - ããŠã³ã](sub-applications.md){.internal-link target=_blank}ã[ãããã·ã®èåŸ](behind-a-proxy.md){.internal-link target=_blank} ã§èŠãããã«ãWSGI ã¢ããªã±ãŒã·ã§ã³ãããŠã³ãã§ããŸãã
+
+ãã®ããã« `WSGIMiddleware` ã䜿çšããŠãFlask ã Django ãªã©ã® WSGI ã¢ããªãã©ããã§ããŸãã
+
+## `WSGIMiddleware` ã®äœ¿çš { #using-wsgimiddleware }
+
+/// info | æ
å ±
+
+ããã«ã¯ `a2wsgi` ã®ã€ã³ã¹ããŒã«ãå¿
èŠã§ããäŸ: `pip install a2wsgi`ã
+
+///
+
+`a2wsgi` ãã `WSGIMiddleware` ãã€ã³ããŒãããŸãã
+
+次ã«ããã®ããã«ãŠã§ã¢ã§ WSGIïŒäŸ: FlaskïŒã¢ããªãã©ããããŸãã
+
+ãããŠãããããããã¹ã®äžã«ããŠã³ãããŸãã
+
+{* ../../docs_src/wsgi/tutorial001_py310.py hl[1,3,23] *}
+
+/// note | åè
+
+以å㯠`fastapi.middleware.wsgi` ã® `WSGIMiddleware` ã䜿çšããããšãæšå¥šãããŠããŸããããçŸåšã¯éæšå¥šã§ãã
+
+代ããã« `a2wsgi` ããã±ãŒãžã䜿çšããããšãæšå¥šããŸããäœ¿ãæ¹ã¯åãã§ãã
+
+`a2wsgi` ããã±ãŒãžãã€ã³ã¹ããŒã«ãããŠããããšã確èªãã`a2wsgi` ãã `WSGIMiddleware` ãæ£ããã€ã³ããŒãããŠãã ããã
+
+///
+
+## ãã§ã㯠{ #check-it }
+
+ããã§ããã¹ `/v1/` é
äžãžã®ãã¹ãŠã®ãªã¯ãšã¹ã㯠Flask ã¢ããªã±ãŒã·ã§ã³ãåŠçããŸãã
+
+ãã以å€ã¯ **FastAPI** ãåŠçããŸãã
+
+å®è¡ã㊠<a href="http://localhost:8000/v1/" class="external-link" target="_blank">http://localhost:8000/v1/</a> ã«ã¢ã¯ã»ã¹ãããšãFlask ããã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸã:
+
+```txt
+Hello, World from Flask!
+```
+
+ããã« <a href="http://localhost:8000/v2" class="external-link" target="_blank">http://localhost:8000/v2</a> ã«ã¢ã¯ã»ã¹ãããšãFastAPI ããã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸã:
+
+```JSON
+{
+ "message": "Hello World"
+}
+```
-# 代æ¿ããŒã«ããåããã€ã³ã¹ãã¬ãŒã·ã§ã³ãšæ¯èŒ
+# 代æ¿ããŒã«ããåããã€ã³ã¹ãã¬ãŒã·ã§ã³ãšæ¯èŒ { #alternatives-inspiration-and-comparisons }
äœã**FastAPI**ã«ã€ã³ã¹ãã¬ãŒã·ã§ã³ãäžããã®ããä»ã®ä»£æ¿ããŒã«ãšæ¯èŒããŠã©ããããããŠããããäœãåŠãã ã®ãã«ã€ããŠã
-## ã¯ããã«
+## ã¯ããã« { #intro }
**FastAPI**ã¯ã代æ¿ããŒã«ã®ãããŸã§ã®åãããªããã°ååšããªãã£ãã§ãããã
ãããããã®æç¹ã§ã¯ããããã®æ©èœããã¹ãŠæäŸãã以åã®ããŒã«ããåªããã¢ã€ãã¢ãåãå
¥ããå¯èœãªéãæé«ã®æ¹æ³ã§ããããçµã¿åããããããŸã§å©çšã§ããªãã£ãèšèªæ©èœ (Python 3.6以éã®åãã³ã) ãå©çšãããã®ãäœã以å€ã«éžæè¢ã¯ãããŸããã§ããã
-## 以åã®ããŒã«
+## 以åã®ããŒã« { #previous-tools }
-### <a href="https://www.djangoproject.com/" class="external-link" target="_blank">Django</a>
+### <a href="https://www.djangoproject.com/" class="external-link" target="_blank">Django</a> { #django }
Pythonã®ãã¬ãŒã ã¯ãŒã¯ã®äžã§æãããã¥ã©ãŒã§ãåºãä¿¡é ŒãããŠããŸããInstagramã®ãããªã·ã¹ãã ã®æ§ç¯ã«äœ¿ãããŠããŸãã
ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ (MySQLãPostgreSQLãªã©) ãšæ¯èŒç匷åºã«çµåãããŠããã®ã§ãNoSQLããŒã¿ããŒã¹ (CouchbaseãMongoDBãCassandraãªã©) ãã¡ã€ã³ã«å©çšããããšã¯ç°¡åã§ã¯ãããŸããã
-ããã¯ãšã³ãã§HTMLãçæããããã«äœããããã®ã§ãããçŸä»£çãªããã³ããšã³ã (ReactãVue.jsãAngularãªã©) ããä»ã®ã·ã¹ãã (IoTããã€ã¹ãªã©) ãšéä¿¡ããAPIãæ§ç¯ããããã«äœããããã®ã§ã¯ãããŸããã
+ããã¯ãšã³ãã§HTMLãçæããããã«äœããããã®ã§ãããçŸä»£çãªããã³ããšã³ã (ReactãVue.jsãAngularãªã©) ããä»ã®ã·ã¹ãã (<abbr title="Internet of Things - ã¢ãã®ã€ã³ã¿ãŒããã">IoT</abbr>ããã€ã¹ãªã©) ãšéä¿¡ããAPIãæ§ç¯ããããã«äœããããã®ã§ã¯ãããŸããã
-### <a href="https://www.django-rest-framework.org/" class="external-link" target="_blank">Django REST Framework</a>
+### <a href="https://www.django-rest-framework.org/" class="external-link" target="_blank">Django REST Framework</a> { #django-rest-framework }
Django REST Frameworkã¯ãDjangoãäžæ·ãã«ããŠWeb APIãæ§ç¯ããæè»ãªããŒã«ããããšããŠãAPIã®æ©èœãåäžãããããã«äœãããŸããã
///
-### <a href="http://flask.pocoo.org/" class="external-link" target="_blank">Flask</a>
+### <a href="https://flask.palletsprojects.com" class="external-link" target="_blank">Flask</a> { #flask }
Flask ã¯ããã€ã¯ããã¬ãŒã ã¯ãŒã¯ãã§ãããããŒã¿ããŒã¹ãšã®çµ±åã®ãããªDjangoãããã©ã«ãã§æã€å€ãã®æ©èœã¯å«ãŸããŠããŸããã
///
-### <a href="http://docs.python-requests.org" class="external-link" target="_blank">Requests</a>
+### <a href="https://requests.readthedocs.io" class="external-link" target="_blank">Requests</a> { #requests }
**FastAPI**ã¯å®éã«ã¯**Requests**ã®ä»£æ¿ã§ã¯ãããŸããããããã®ã¹ã³ãŒãã¯å€§ããç°ãªããŸãã
å
¬åŒãµã€ãã§ä»¥äžã®ããã«èšãããŠããã®ã¯ããããçç±ã§ãã
-> Requestsã¯ä»ãŸã§ã§æãããŠã³ããŒããããPythonããã±ãŒãžã§ãã
+> Requestsã¯å²äžæãããŠã³ããŒããããPythonããã±ãŒãžã®ã²ãšã€ã§ã
äœ¿ãæ¹ã¯ãšãŠãç°¡åã§ããäŸãã°ã`GET`ãªã¯ãšã¹ããå®è¡ããã«ã¯ããã®ããã«æžãã°è¯ãã§ã:
response = requests.get("http://example.com/some/url")
```
-察å¿ããFastAPIã®ãã¹ãªãã¬ãŒã·ã§ã³ã¯ãã®ããã«ãªããŸã:
+察å¿ããFastAPIã®APIã®path operationã¯ãã®ããã«ãªããŸã:
```Python hl_lines="1"
@app.get("/some/url")
///
-### <a href="https://swagger.io/" class="external-link" target="_blank">Swagger</a> / <a href="https://github.com/OAI/OpenAPI-Specification/" class="external-link" target="_blank">OpenAPI</a>
+### <a href="https://swagger.io/" class="external-link" target="_blank">Swagger</a> / <a href="https://github.com/OAI/OpenAPI-Specification/" class="external-link" target="_blank">OpenAPI</a> { #swagger-openapi }
ç§ãDjango REST Frameworkã«æ±ããŠããäž»ãªæ©èœã¯ãAPIã®èªåçãªããã¥ã¡ã³ãçæã§ããã
///
-### Flask REST ãã¬ãŒã ã¯ãŒã¯
+### Flask REST ãã¬ãŒã ã¯ãŒã¯ { #flask-rest-frameworks }
ããã€ãã®Flask RESTãã¬ãŒã ã¯ãŒã¯ããããŸããããããã調æ»ããŠã¿ããšãããå€ãã®ãã®ãäžé©åãªåé¡ãæ®ã£ããŸãŸãäžæããããæŸçœ®ãããŠããããšãããããŸããã
-### <a href="https://marshmallow.readthedocs.io/en/3.0/" class="external-link" target="_blank">Marshmallow</a>
+### <a href="https://marshmallow.readthedocs.io/en/stable/" class="external-link" target="_blank">Marshmallow</a> { #marshmallow }
-APIã·ã¹ãã ã§å¿
èŠãšãããäž»ãªæ©èœã®äžã€ã«ãã³ãŒã (Python) ããããŒã¿ãåãåºããŠããããã¯ãŒã¯ãä»ããŠéãããã®ã«å€æããããŒã¿ã®ã<abbr title="marshalling, conversion">ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³</abbr>ãããããŸããäŸãã°ãããŒã¿ããŒã¹ã®ããŒã¿ãå«ããªããžã§ã¯ããJSONãªããžã§ã¯ãã«å€æãããã`datetime` ãªããžã§ã¯ããæååã«å€æãããªã©ã§ãã
+APIã·ã¹ãã ã§å¿
èŠãšãããäž»ãªæ©èœã®äžã€ã«ãã³ãŒã (Python) ããããŒã¿ãåãåºããŠããããã¯ãŒã¯ãä»ããŠéãããã®ã«å€æããããŒã¿ã®ã<dfn title="å¥å: marshallingã倿">ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³</dfn>ãããããŸããäŸãã°ãããŒã¿ããŒã¹ã®ããŒã¿ãå«ããªããžã§ã¯ããJSONãªããžã§ã¯ãã«å€æãããã`datetime` ãªããžã§ã¯ããæååã«å€æãããªã©ã§ãã
APIãå¿
èŠãšããããäžã€ã®å€§ããªæ©èœã¯ããŒã¿ã®ããªããŒã·ã§ã³ã§ãããç¹å®ã®ãã©ã¡ãŒã¿ãäžããããå Žåã«ããŒã¿ãæå¹ã§ããããšã確èªããããšã§ããäŸãã°ããããã£ãŒã«ããã©ã³ãã ãªæååã§ã¯ãªã `int` ã§ããããšãªã©ã§ããããã¯ç¹ã«åä¿¡ããããŒã¿ã«å¯ŸããŠäŸ¿å©ã§ãã
ãããã®æ©èœã¯ãMarshmallowãæäŸãããã®ã§ããMarshmallowã¯çŽ æŽãããã©ã€ãã©ãªã§ãç§ã以åã«äœåºŠã䜿ã£ãããšããããŸãã
-ããããããã¯Pythonã®åãã³ããååšããåã«äœããããã®ã§ãããã®ããããã¹ãŠã®<abbr title="ããŒã¿ãã©ã®ããã«åœ¢æãããã¹ããã®å®çŸ©">ã¹ããŒã</abbr>ãå®çŸ©ããããã«ã¯ãMarshmallowãæäŸããç¹å®ã®ãŠãŒãã£ãªãã£ãã¯ã©ã¹ã䜿çšããå¿
èŠããããŸãã
+ããããããã¯Pythonã®åãã³ããååšããåã«äœããããã®ã§ãããã®ããããã¹ãŠã®<dfn title="ããŒã¿ãã©ã®ããã«æ§æãããã¹ããã®å®çŸ©">ã¹ããŒã</dfn>ãå®çŸ©ããããã«ã¯ãMarshmallowãæäŸããç¹å®ã®ãŠãŒãã£ãªãã£ãã¯ã©ã¹ã䜿çšããå¿
èŠããããŸãã
/// check | **FastAPI**ãžäžããã€ã³ã¹ãã¬ãŒã·ã§ã³
///
-### <a href="https://webargs.readthedocs.io/en/latest/" class="external-link" target="_blank">Webargs</a>
+### <a href="https://webargs.readthedocs.io/en/latest/" class="external-link" target="_blank">Webargs</a> { #webargs }
-APIã«æ±ããããä»ã®å€§ããªæ©èœãšããŠã<abbr title="PythonããŒã¿ã®èªã¿èŸŒã¿ãšå€æ">åä¿¡ãããªã¯ãšã¹ãããŒã¿ã®ããŒã¹</abbr>ããããŸãã
+APIã«æ±ããããä»ã®å€§ããªæ©èœãšããŠã<dfn title="PythonããŒã¿ãžã®èªã¿èŸŒã¿ãšå€æ">åä¿¡ãããªã¯ãšã¹ãããŒã¿ã®ããŒã¹</dfn>ããããŸãã
Webargsã¯Flaskãã¯ãããšããããã€ãã®ãã¬ãŒã ã¯ãŒã¯ã®äžã«ãããæäŸããããã«äœãããããŒã«ã§ãã
///
-### <a href="https://apispec.readthedocs.io/en/stable/" class="external-link" target="_blank">APISpec</a>
+### <a href="https://apispec.readthedocs.io/en/stable/" class="external-link" target="_blank">APISpec</a> { #apispec }
MarshmallowãšWebargsã¯ããªããŒã·ã§ã³ãããŒã¹ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ããã©ã°ã€ã³ãšããŠæäŸããŠããŸãã
///
-### <a href="https://flask-apispec.readthedocs.io/en/latest/" class="external-link" target="_blank">Flask-apispec</a>
+### <a href="https://flask-apispec.readthedocs.io/en/latest/" class="external-link" target="_blank">Flask-apispec</a> { #flask-apispec }
WebargsãMarshmallowãAPISpecã飿ºãããFlaskãã©ã°ã€ã³ã§ãã
///
-### <a href="https://nestjs.com/" class="external-link" target="_blank">NestJS</a> (ãš<a href="https://angular.io/" class="external-link" target="_blank">Angular</a>)
+### <a href="https://nestjs.com/" class="external-link" target="_blank">NestJS</a> (ãš<a href="https://angular.io/" class="external-link" target="_blank">Angular</a>) { #nestjs-and-angular }
NestJSã¯Angularã«ã€ã³ã¹ãã€ã¢ãããJavaScript (TypeScript) NodeJSãã¬ãŒã ã¯ãŒã¯ã§ãPythonã§ãããããŸããã
///
-### <a href="https://sanic.readthedocs.io/en/latest/" class="external-link" target="_blank">Sanic</a>
+### <a href="https://sanic.readthedocs.io/en/latest/" class="external-link" target="_blank">Sanic</a> { #sanic }
`asyncio`ã«åºã¥ãããPythonã®ãã¬ãŒã ã¯ãŒã¯ã®äžã§ãéåžžã«é«éãªãã®ã®äžã€ã§ããFlaskãšéåžžã«äŒŒãäœãã«ãªã£ãŠããŸãã
/// note | æè¡è©³çް
-Pythonã®`asyncio`ã«ãŒãã®ä»£ããã«ã`uvloop`ãå©çšãããŠããŸããããã«ãããéåžžã«é«éã§ãã
+Pythonã®`asyncio`ã«ãŒãã®ä»£ããã«ã<a href="https://github.com/MagicStack/uvloop" class="external-link" target="_blank">`uvloop`</a>ãå©çšãããŠããŸããããã«ãããéåžžã«é«éã§ãã
`Uvicorn`ãš`Starlette`ã«æãããªã€ã³ã¹ãã¬ãŒã·ã§ã³ãäžããŠããããããã¯çŸåšãªãŒãã³ãªãã³ãããŒã¯ã«ãããŠSanicããé«éã§ãã
///
-### <a href="https://falconframework.org/" class="external-link" target="_blank">Falcon</a>
+### <a href="https://falconframework.org/" class="external-link" target="_blank">Falcon</a> { #falcon }
Falconã¯ããäžã€ã®é«æ§èœPythonãã¬ãŒã ã¯ãŒã¯ã§ããããã ã«èšèšãããŠãããHugã®ãããªä»ã®ãã¬ãŒã ã¯ãŒã¯ã®åºç€ãšããŠåäœããŸãã
-Pythonã®ãŠã§ããã¬ãŒã ã¯ãŒã¯æšæºèŠæ Œ (WSGI) ã䜿çšããŠããŸãããããã¯åæçã§ããããWebSocketãªã©ã®å©çšã«ã¯å¯Ÿå¿ããŠããŸããããšã¯ãããããã§ãéåžžã«é«ãæ§èœãæã£ãŠããŸãã
-
ããã¯ãããªã¯ãšã¹ãããšãã¬ã¹ãã³ã¹ãã®2ã€ã®ãã©ã¡ãŒã¿ãåãåã颿°ãæã€ããã«èšèšãããŠããŸãããããŠããªã¯ãšã¹ãããããŒã¿ããèªã¿èŸŒã¿ããã¬ã¹ãã³ã¹ã«ããŒã¿ããæžã蟌ã¿ããŸãããã®èšèšã®ãããPythonæšæºã®åãã³ãã§ãªã¯ãšã¹ãã®ãã©ã¡ãŒã¿ãããã£ã颿°ã®åŒæ°ãšããŠå®£èšããããšã¯ã§ããŸããã
ãã®ãããããŒã¿ã®ããªããŒã·ã§ã³ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãããã¥ã¡ã³ãåã¯ãèªåçã«ã§ããã³ãŒãã®äžã§è¡ããªããã°ãªããŸããããããã¯ãHugã®ããã«Falconã®äžã«ãã¬ãŒã ã¯ãŒã¯ãšããŠå®è£
ãããªããã°ãªããŸããããã®ãããªåæã¯ããã©ã¡ãŒã¿ãšããŠ1ã€ã®ãªã¯ãšã¹ããªããžã§ã¯ããš1ã€ã®ã¬ã¹ãã³ã¹ãªããžã§ã¯ããæã€ãšããFalconã®ãã¶ã€ã³ã«ã€ã³ã¹ãã¬ãŒã·ã§ã³ãåããä»ã®ãã¬ãŒã ã¯ãŒã¯ã§ãèµ·ãããŸãã
///
-### <a href="https://moltenframework.com/" class="external-link" target="_blank">Molten</a>
+### <a href="https://moltenframework.com/" class="external-link" target="_blank">Molten</a> { #molten }
**FastAPI**ãæ§ç¯ããæåã®æ®µéã§MoltenãçºèŠããŸããããããŠãããã¯éåžžã«äŒŒããããªã¢ã€ãã¢ãæã£ãŠããŸãã
///
-### <a href="http://www.hug.rest/" class="external-link" target="_blank">Hug</a>
+### <a href="https://github.com/hugapi/hug" class="external-link" target="_blank">Hug</a> { #hug }
Hugã¯ãPythonã®åãã³ããå©çšããŠAPIãã©ã¡ãŒã¿ã®å宣èšãå®è£
ããæåã®ãã¬ãŒã ã¯ãŒã¯ã®1ã€ã§ããããã¯çŽ æŽãããã¢ã€ãã¢ã§ãä»ã®ããŒã«ãåãããšããããã£ãããšãªããŸããã
///
-### <a href="https://github.com/encode/apistar" class="external-link" target="_blank">APIStar</a> (<= 0.5)
+### <a href="https://github.com/encode/apistar" class="external-link" target="_blank">APIStar</a> (<= 0.5) { #apistar-0-5 }
**FastAPI**ãæ§ç¯ããããšã決ããçŽåã«ã**APIStar**ãµãŒããŒãèŠã€ããŸãããããã¯ç§ãæ¢ããŠãããã®ãã»ãŒãã¹ãŠå«ãŸããŠãããçŽ æŽããããã¶ã€ã³ã§ããã
///
-## **FastAPI**ãå©çšããŠãããã®
+## **FastAPI**ãå©çšããŠãããã® { #used-by-fastapi }
-### <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>
+### <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> { #pydantic }
Pydanticã¯ãPythonã®åãã³ããå
ã«ããŒã¿ã®ããªããŒã·ã§ã³ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã (JSON Schemaã䜿çšãã) ããã¥ã¡ã³ããå®çŸ©ããã©ã€ãã©ãªã§ãã
///
-### <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a>
+### <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a> { #starlette }
-Starletteã¯ã軜éãª<abbr title="éåæPython webãæ§ç¯ããããã®æ°æšæº">ASGI</abbr>ãã¬ãŒã ã¯ãŒã¯/ããŒã«ãããã§ã髿§èœãªéåæãµãŒãã¹ã®æ§ç¯ã«æé©ã§ãã
+Starletteã¯ã軜éãª<dfn title="éåæPython Webã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®æ°ããæšæº">ASGI</dfn>ãã¬ãŒã ã¯ãŒã¯/ããŒã«ãããã§ã髿§èœãªéåæãµãŒãã¹ã®æ§ç¯ã«æé©ã§ãã
éåžžã«ã·ã³ãã«ã§çŽæçã§ããç°¡åã«æ¡åŒµã§ããããã«èšèšãããŠãããã¢ãžã¥ãŒã«åãããã³ã³ããŒãã³ããæã£ãŠããŸãã
* éåžžã«æåçãªæ§èœã
* WebSocketã®ãµããŒãã
-* GraphQLã®ãµããŒãã
* ã€ã³ããã»ã¹ã®ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã
* èµ·åããã³ã·ã£ããããŠã³ã€ãã³ãã
-* requestsã«åºã¥ããŠæ§ç¯ããããã¹ãã¯ã©ã€ã¢ã³ãã
+* HTTPXã«åºã¥ããŠæ§ç¯ããããã¹ãã¯ã©ã€ã¢ã³ãã
* CORSãGZipãéçãã¡ã€ã«ãã¹ããªãŒãã³ã°å¿çã
* ã»ãã·ã§ã³ãšã¯ãããŒã®ãµããŒãã
* 100%ã®ãã¹ãã«ãã¬ããžã
* 100%ã®å泚éä»ãã³ãŒãããŒã¹ã
-* ããŒããªäŸåé¢ä¿ã¯ãªãã
+* ããŒããªäŸåé¢ä¿ã¯å°ãªãã
Starletteã¯ãçŸåšãã¹ããããŠããPythonãã¬ãŒã ã¯ãŒã¯ã®äžã§æãéããã¬ãŒã ã¯ãŒã¯ã§ãããã¬ãŒã ã¯ãŒã¯ã§ã¯ãªããµãŒããŒã§ããUvicornã ããäžåã£ãŠããŸãã
///
-### <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a>
+### <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a> { #uvicorn }
Uvicornã¯éåžžã«é«éãªASGIãµãŒããŒã§ãuvloopãšhttptoolsã«ããæ§æãããŠããŸãã
**FastAPI**ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããã¡ã€ã³ã®ãŠã§ããµãŒããŒã§ããç¹ã
-Gunicornãšçµã¿åãããããšã§ãéåæã§ãã«ãããã»ã¹ãªãµãŒããŒãæã€ããšãããŸãã
+ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ `--workers` ã䜿ã£ãŠãéåæã®ãã«ãããã»ã¹ãµãŒããŒã«ã§ããŸãã
詳现ã¯[ãããã€](deployment/index.md){.internal-link target=_blank}ã®é
ç®ã§ç¢ºèªããŠãã ããã
///
-## ãã³ãããŒã¯ ãš ã¹ããŒã
+## ãã³ãããŒã¯ ãš ã¹ããŒã { #benchmarks-and-speed }
UvicornãStarletteãFastAPIã®éããçè§£ãæ¯èŒã確èªããã«ã¯ã[ãã³ãããŒã¯](benchmarks.md){.internal-link target=_blank}ã確èªããŠãã ããã
-# 䞊è¡åŠçãš async / await
+# 䞊è¡åŠçãš async / await { #concurrency-and-async-await }
-*path operation 颿°*ã®ããã® `async def` ã«é¢ãã詳现ãšéåæ (asynchronous) ã³ãŒãã䞊è¡åŠç (Concurrency)ããããŠã䞊ååŠç (Parallelism) ã®èæ¯ã«ã€ããŠã
+*path operation 颿°*ã®ããã® `async def` æ§æã«é¢ãã詳现ãšãéåæã³ãŒãã䞊è¡åŠçã䞊ååŠçã®èæ¯ã«ã€ããŠã§ãã
-## æ¥ãã§ããŸããïŒ
+## æ¥ãã§ããŸããïŒ { #in-a-hurry }
-<abbr title="too long; didn't read (é·ãããŠèªããªã人ã®ããã®èŠçŽãšããæå³ã®ã¹ã©ã³ã°)"><strong>TL;DR:</strong></abbr>
+<abbr title="too long; didn't read - é·ãããŠèªãŸãªãã£ã"><strong>TL;DR:</strong></abbr>
-ʬ¡ã\81®ã\82\88ã\81\86ã\81ªã\80\81`await` ã\82\92Àœ¿ç\94šã\81\97ã\81Šå\91Œã\81³å\87ºã\81\99ã\81¹ã\81\8dã\82µã\83Œã\83\89ã\83\91ã\83Œã\83\86ã\82£ã\83©ã\82€ã\83\96ã\83©ã\83ªã\82\92Àœ¿ç\94šã\81\97ã\81Šã\81\84ã\82\8b堎å\90\88:
+ʬ¡ã\81®ã\82\88ã\81\86ã\81« `await` ã\81§å\91Œã\81³å\87ºã\81\99ã\82\88ã\81\86Ê\8c\87瀺ã\81\95ã\82\8cã\81Šã\81\84ã\82\8bã\82µã\83Œã\83\89ã\83\91ã\83Œã\83\86ã\82£ã\83©ã\82€ã\83\96ã\83©ã\83ªã\82\92Àœ¿ã\81£ã\81Šã\81\84ã\82\8bã\81ªã\82\89:
```Python
results = await some_library()
```
-以äžã®æ§ã« `async def` ã䜿çšããŠ*path operation 颿°*ã宣èšããŸãã
+*path operation 颿°*ã¯æ¬¡ã®ããã« `async def` ã§å®£èšããŸã:
```Python hl_lines="2"
@app.get('/')
/// note | åè
-`async def` ã䜿çšããŠäœæããã颿°ã®å
éšã§ãã `await` ã¯äœ¿çšã§ããŸããã
+`await` 㯠`async def` ã§äœããã颿°ã®å
éšã§ãã䜿ããŸããã
///
---
-ã\83\87ã\83΋\82¿ã\83\99ã\83΋\82¹ã\80\81APIã\80\81ã\83\95ã\82¡ã\82ۋ\83«ã\82·ã\82¹ã\83\86ã\83 ã\81ªã\81©ã\81šé\80\9aÀ¿¡ã\81\97ã\80\81`await` ã\81®Àœ¿ç\94šã\82\92ã\82µã\83\9dã\83΋\83\88ã\81\97ã\81Šã\81\84ã\81ªã\81\84ã\82µã\83΋\83\89ã\83\91ã\83΋\83\86ã\82£ã\83©ã\82ۋ\83\96ã\83©ã\83ª (ç\8fŸå\9cšã\81®ã\81ȋ\81šã\82\93ã\81©ã\81®ã\83\87ã\83΋\82¿ã\83\99ã\83΋\82¹ã\83©ã\82ۋ\83\96ã\83©ã\83ªã\81«åœ\93ã\81Šã\81¯ã\81Ÿã\82\8aã\81Ÿã\81\99) ã\82\92Àœ¿ç\94šã\81\97ã\81Šã\81\84ã\82\8b堎å\90\88ã\80\81ʬ¡ã\81®Ê§\98ã\81«ã\80\81Ã¥\8d\98ã\81« `def` ã\82\92Àœ¿ç\94šã\81\97ã\81Šé\80\9a垞é\80\9aã\82\8a *path operation é\96¢Ê\95°* ã\82\92宣èšããŠãã ãã:
+ã\83\87ã\83΋\82¿ã\83\99ã\83΋\82¹ã\80\81APIã\80\81ã\83\95ã\82¡ã\82ۋ\83«ã\82·ã\82¹ã\83\86ã\83 ã\81ªã\81©ã\81šé\80\9aÀ¿¡ã\81\97ã\81ۋ\81€ `await` ã\81®Àœ¿ç\94šã\82\92ã\82µã\83\9dã\83΋\83\88ã\81\97ã\81Šã\81\84ã\81ªã\81\84ã\82µã\83΋\83\89ã\83\91ã\83΋\83\86ã\82£ã\83©ã\82ۋ\83\96ã\83©ã\83ª (ç\8fŸå\9cšã\81®ã\81šã\81\93ã\82\8då€\9aã\81\8fã\81®ã\83\87ã\83΋\82¿ã\83\99ã\83΋\82¹ã\83©ã\82ۋ\83\96ã\83©ã\83ªã\81\8cÚ©²åœ\93ã\81\97ã\81Ÿã\81\99) ã\82\92Àœ¿ã\81£ã\81Šã\81\84ã\82\8b堎å\90\88ã\80\81*path operation é\96¢Ê\95°*ã\81¯é\80\9a垞ã\81©ã\81\8aã\82\8a `def` ã\81§宣èšããŠãã ãã:
```Python hl_lines="2"
@app.get('/')
---
-ã¢ããªã±ãŒã·ã§ã³ã (ã©ãããããã) ä»ã®äœãšãéä¿¡ãããå¿çãåŸ
ã€å¿
èŠããªãå Žåã¯ã`async def` ã䜿çšããŠäžããã
+ã¢ããªã±ãŒã·ã§ã³ã (äœããã®çç±ã§) ã»ãã®äœãšãéä¿¡ããå¿çãåŸ
ã€å¿
èŠããªããªãã`await` ãå
éšã§äœ¿ããªããŠã `async def` ã䜿ã£ãŠãã ããã
---
-ããåãããªãå Žåã¯ãéåžžã® `def` ã䜿çšããŠäžããã
+ããåãããªãå Žåã¯ãéåžžã® `def` ã䜿ã£ãŠãã ããã
---
-**åè**: *path operation 颿°*ã«å¿
èŠãªã ã `def` ãš `async def` ãæ··åšãããããããã«æé©ãªãªãã·ã§ã³ã䜿çšããŠå®çŸ©ã§ããŸããããã«å¿ããŠFastAPIã¯æ£ããåŠçãè¡ããŸãã
+**åè**: å¿
èŠã«å¿ã㊠*path operation 颿°* ã§ã¯ `def` ãš `async def` ãæ··åšãããããããã«æé©ãªéžæè¢ã§å®çŸ©ã§ããŸããFastAPI ã¯é©åã«åŠçããŸãã
-ã\81šã\81«ã\81\8bã\81\8fã\80\81Àž\8aښ\98ã\81®ã\81\84ã\81\9aã\82\8cã\81®å Žå\90\88ã\81§ã\82\82FastAPIã\81¯é\9d\9eÃ¥\90\8cÊ\9c\9fã\81§å\8b\95Àœ\9cã\81\97ã\80\81éåžžã«é«éã§ãã
+ã\81\84ã\81\9aã\82\8cã\81®å Žå\90\88ã\81§ã\82\82ã\80\81FastAPI ã\81¯é\9d\9eÃ¥\90\8cÊ\9c\9fã\81§å\8b\95Àœ\9cã\81\97éåžžã«é«éã§ãã
-ã\81\97ã\81\8bã\81\97ã\80\81Àž\8aښ\98ã\81®ã\82¹ã\83\86ã\83\83ã\83\97ã\81«åŸ\93ã\81\86ã\81\93ã\81šã\81§ã\80\81ã\83\91ã\83\95ã\82©ã\83΋\83\9eã\83³ã\82¹ã\81®Ê\9c\80é\81©å\8c\96ã\82\92Ú¡\8cã\81\88ãŸãã
+ã\81\9fã\81 ã\81\97Àž\8aښ\98ã\81®Ê\89\8bé \86ã\81«åŸ\93ã\81\86ã\81\93ã\81šã\81§ã\80\81ã\81\95ã\82\89ã\81«ã\83\91ã\83\95ã\82©ã\83΋\83\9eã\83³ã\82¹Ê\9c\80é\81©å\8c\96ã\81\8cÃ¥\8f¯Ú\83ϋ\81«ã\81ªã\82\8aãŸãã
-## æè¡è©³çް
+## æè¡è©³çް { #technical-details }
-çŸä»£çã®Pythonã¯ã**éåæã³ãŒã**ãããã**ã³ã«ãŒãã³**ããšç§°ããããã®ãå©çšããŠãµããŒãããŠããŸãããã㯠**`async` ãš `await`** æ§æãçšããŸãã
+ã¢ãã³ãª Python 㯠**ãéåæã³ãŒãã** ã **ãã³ã«ãŒãã³ã** ãšåŒã°ããä»çµã¿ã§ãµããŒãããŠãããæ§æã¯ **`async` ãš `await`** ã§ãã
-次ã®ã»ã¯ã·ã§ã³ã§ããã¬ãŒãºå
ã®ããŒããé ã«èŠãŠãããŸããã:
+以äžã®ã»ã¯ã·ã§ã³ã§ããã®ãã¬ãŒãºãããŒãããšã«èŠãŠãããŸã:
* **éåæã³ãŒã**
* **`async` ãš `await`**
* **ã³ã«ãŒãã³**
-## éåæã³ãŒã
+## éåæã³ãŒã { #asynchronous-code }
-éåæã³ãŒããšã¯ãèšèªð¬ãã³ãŒãå
ã®ã©ããã§ãã³ã³ãã¥ãŒã¿/ããã°ã©ã ð€ã« *ä»ã®äœã* ãã©ããå¥ã®ç®æã§çµäºããã®ãåŸ
ã€ããã«äŒããææ®µãæã£ãŠããããšãæå³ããŸãã*ä»ã®äœã* ã¯ãé
ããã¡ã€ã«ðããšåŒã°ããŠãããšããŸããã.
+éåæã³ãŒããšã¯ãèšèª ð¬ ãã³ãŒãã®ã©ããã®æç¹ã§ãã³ã³ãã¥ãŒã¿/ããã°ã©ã ð€ ã«ãã©ããå¥ã®ãšããã§çµãããŸã§ãå¥ã®äœãããåŸ
ã€å¿
èŠããããšäŒããææ®µãæã£ãŠããããšããããšã§ãããã®ãå¥ã®äœããããé
ããã¡ã€ã«ãð ãšåŒã¶ããšã«ããŸãããã
-ã\81\97ã\81\9fã\81\8cã\81£ã\81Šã\80\81ã\82³ã\83³ã\83\94ã\83¥ã\83΋\82¿ã\81¯ã\80\8cé\81\85ã\81\84ã\83\95ã\82¡ã\82ۋ\83«ð\9f\93\9dã\80\8dã\81\8cçµ\82˼\86ã\81\99ã\82\8bã\81Ÿã\81§ã\80\81À»\96ã\81®å\87Šç\90\86ã\81\8cã\81§ã\81\8dãŸãã
+ã\81\9dã\81®é\96\93ã\80\81ã\82³ã\83³ã\83\94ã\83¥ã\83΋\82¿ã\81¯ã\80\8cé\81\85ã\81\84ã\83\95ã\82¡ã\82ۋ\83«ã\80\8dð\9f\93\9d ã\81\8cçµ\82ã\82\8fã\82\8bã\81Ÿã\81§ã\80\81À»\96ã\81®Àœ\9cÊ¥Âã\82\92é\80²ã\82\81ã\82\89ã\82\8cãŸãã
-ã\82³ã\83³ã\83\94ã\83¥ã\83΋\82¿/ã\83\97ã\83Âã\82°ã\83©ã\83 ð\9f€\96ã\81¯å\86\8dã\81³åŸ\85Ê©\9fã\81\99ã\82\8bÊ©\9fÀŒ\9aã\81\8cã\81\82ã\82\8bã\81šã\81\8dã\82\84ã\80\81ã\81\9dã\81®Ê\99\82ç\82¹ã\81§Ú¡\8cã\81£ã\81Šã\81\84ã\81\9fã\81\99ã\81¹ã\81Šã\81®Àœ\9cÊ¥Âã\81\8cå®\8c˼\86ã\81\99ã\82\8bã\81\9fã\81³ã\81«Ê\88ȋ\81£ã\81Šã\81\8dã\81Ÿã\81\99ã\80\82ã\81\9dã\81\97ã\81Šã\80\81å¿\85ڊ\81ã\81ªå\87Šç\90\86ã\82\92ã\81\97ã\81ªã\81\8cã\82\89ã\80\81ã\82³ã\83³ã\83\94ã\83¥ã\83΋\82¿/ã\83\97ã\83Âã\82°ã\83©ã\83 ð\9f€\96ã\81\8cåŸ\85ã\81£ã\81Šã\81\84ã\81\9fÃ¥\87Šç\90\86ã\81®ã\81©ã\82\8cã\81\8bã\81\8cçµ\82ã\82\8fã\81£ã\81Šã\81\84ã\82\8bã\81\8bã\81©ã\81\86ã\81\8b確ڪ\8dããŸãã
+ã\81\9dã\81®åŸ\8cã\80\81ã\82³ã\83³ã\83\94ã\83¥ã\83΋\82¿/ã\83\97ã\83Âã\82°ã\83©ã\83 ð\9f€\96 ã\81¯ã\80\81ã\81Ÿã\81\9fåŸ\85ã\81€Ê©\9fÀŒ\9aã\81\8cÊ\9d¥ã\81\9fã\81šã\81\8dã\82\84ã\80\81ã\81\9dã\81®Ê\99\82ç\82¹ã\81§Ê\8a±ã\81\88ã\81Šã\81\84ã\81\9fÀœ\9cÊ¥Âã\82\92ã\81\99ã\81¹ã\81Šçµ\82ã\81\88ã\81\9fã\81šã\81\8dã\81«Ê\88ȋ\81£ã\81Šã\81\8dã\81Ÿã\81\99ã\80\82ã\81\9dã\81\97ã\81Šã\80\81åŸ\85ã\81£ã\81Šã\81\84ã\81\9fã\82¿ã\82¹ã\82¯ã\81®ã\81©ã\82\8cã\81\8bã\81\8cçµ\82ã\82\8fã\81£ã\81Šã\81\84ã\81ªã\81\84ã\81\8b確ڪ\8dã\81\97ã\80\81å¿\85ڊ\81ã\81ªå\87Šç\90\86ã\82\92å®\9fÚ¡\8cããŸãã
-次ã«ãããð€ãæåã®ã¿ã¹ã¯ (èŠããã«ãå
çšã®ãé
ããã¡ã€ã«ðã)ãçµããããŠããã®ã¿ã¹ã¯ã®çµæã䜿ãå¿
èŠãããåŠçãç¶ããŸãã
+次ã«ãæåã«çµãã£ãã¿ã¹ã¯ (ããšãã°ãé
ããã¡ã€ã«ãð) ãåããç¶ãã®åŠçãè¡ããŸãã
-ãã®ãä»ã®äœããåŸ
ã€ããšã¯ãé垞以äžã®æ§ãªãã®ãåŸ
ã€ãã㪠(ããã»ããµãšRAMã¡ã¢ãªã®éåºŠã«æ¯ã¹ãŠ) çžå¯Ÿçã«ãé
ãã<abbr title="ã€ã³ããããšã¢ãŠãããã">I/O</abbr> æäœãæããŸã:
+ãã®ãå¥ã®äœããåŸ
ã€ãã¯ãéåžž <abbr title="Input and Output - å
¥åºå">I/O</abbr> æäœãæãã(ããã»ããµã RAM ã®éåºŠã«æ¯ã¹ãŠ) çžå¯Ÿçã«ãé
ããåŸ
æ©ã䌎ããŸããäŸãã°æ¬¡ã®ãããªãã®ã§ã:
-* ã\83\8dã\83\83ã\83\88ã\83¯ã\83Œã\82¯çµ\8cç\94±ã\81§ã\82¯ã\83©ã\82€ã\82¢ã\83³ã\83\88ã\81\8bã\82\89é\80\81À¿¡ã\81\95ã\82\8cã\82\8bã\83\87ã\83Œã\82¿
-* ã\83\8dã\83\83ã\83\88ã\83¯ã\83΋\82¯çµ\8cç\94±ã\81§ã\82¯ã\83©ã\82ۋ\82¢ã\83³ã\83\88ã\81\8cÃ¥\8f\97À¿¡ã\81\99ã\82\8bã\80\81ã\83\97ã\83Âã\82°ã\83©ã\83 ã\81\8bã\82\89é\80\81À¿¡ã\81\95ã\82\8cã\81\9fã\83\87ã\83΋\82¿
-* ã\82·ã\82¹ã\83\86ã\83 ã\81«ã\82\88ã\81£ã\81ŠÚªÂã\81¿å\8f\96ã\82\89ã\82\8cã\80\81ã\83\97ã\83Âã\82°ã\83©ã\83 ã\81«Êž¡ã\81\95ã\82\8cã\82\8bã\83\87ã\82£ã\82¹ã\82¯å\86\85ã\81®ã\83\95ã\82¡ã\82ۋ\83«å\86\85容
-* ã\83\97ã\83Âã\82°ã\83©ã\83 ã\81\8cã\82·ã\82¹ã\83\86ã\83 ã\81«Êž¡ã\81\97ã\81Šã\80\81ã\83\87ã\82£ã\82¹ã\82¯ã\81«Ê\9bžã\81\8dڟŒã\82\80Ã¥\86\85容
-* ãªã¢ãŒãAPIæäœ
+* ã\82¯ã\83©ã\82€ã\82¢ã\83³ã\83\88ã\81\8bã\82\89ã\83\8dã\83\83ã\83\88ã\83¯ã\83Œã\82¯çµ\8cç\94±ã\81§ã\83\87ã\83Œã\82¿ã\81\8cé\80\81ã\82\89ã\82\8cã\81Šã\81\8fã\82\8bã\81®ã\82\92åŸ\85ã\81€
+* ã\83\97ã\83Âã\82°ã\83©ã\83 ã\81\8cé\80\81À¿¡ã\81\97ã\81\9fã\83\87ã\83΋\82¿ã\82\92ã\82¯ã\83©ã\82ۋ\82¢ã\83³ã\83\88ã\81\8cã\83\8dã\83\83ã\83\88ã\83¯ã\83΋\82¯çµ\8cç\94±ã\81§å\8f\97ã\81\91Ã¥\8f\96ã\82\8bã\81®ã\82\92åŸ\85ã\81€
+* ã\83\87ã\82£ã\82¹ã\82¯Àž\8aã\81®ã\83\95ã\82¡ã\82ۋ\83«å\86\85容ã\81\8cã\82·ã\82¹ã\83\86ã\83 ã\81«ã\82\88ã\82\8aÚªÂã\81¿å\8f\96ã\82\89ã\82\8cã\80\81ã\83\97ã\83Âã\82°ã\83©ã\83 ã\81«Êž¡ã\81\95ã\82\8cã\82\8bã\81®ã\82\92åŸ\85ã\81€
+* ã\83\97ã\83Âã\82°ã\83©ã\83 ã\81\8cã\82·ã\82¹ã\83\86ã\83 ã\81«Êž¡ã\81\97ã\81\9fÃ¥\86\85容ã\81\8cã\83\87ã\82£ã\82¹ã\82¯ã\81«Ê\9bžã\81\8dڟŒã\81Ÿã\82\8cã\82\8bã\81®ã\82\92åŸ\85ã\81€
+* ãªã¢ãŒã API æäœ
* ããŒã¿ããŒã¹æäœã®å®äº
-* ã\83\87ã\83Œã\82¿ã\83\99ã\83Œã\82¹ã\82¯ã\82šã\83ªã\81\8cçµ\90Ê\9e\9cã\82\92Ú¿\94ã\81\99ã\81\93ã\81š
-* ãªã©ã
+* ã\83\87ã\83Œã\82¿ã\83\99ã\83Œã\82¹ã\82¯ã\82šã\83ªã\81\8cçµ\90Ê\9e\9cã\82\92Ú¿\94ã\81\99ã\81®ã\82\92åŸ\85ã\81€
+* ãªã©
-å®è¡æéã®ã»ãšãã©ã<abbr title="ã€ã³ããããšã¢ãŠãããã">I/O</abbr> æäœã®åŸ
ã¡æéãå ããããããã®ãããªæäœããI/O ããŠã³ããæäœãšèšããŸãã
+å®è¡æéã®å€§åã <abbr title="Input and Output - å
¥åºå">I/O</abbr> æäœã®åŸ
ã¡æéã«è²»ããããããããããã¯ãI/O ããŠã³ãããªæäœãšåŒã°ããŸãã
-ã\82³ã\83³ã\83\94ã\83¥ã\83΋\82¿/ã\83\97ã\83Âã\82°ã\83©ã\83 ã\81\8cã\81\93ã\81®ã\82\88ã\81\86ã\81ªé\81\85ã\81\84ã\82¿ã\82¹ã\82¯ã\81šã\80\8cÃ¥\90\8cÊ\9c\9f (ã\82¿ã\82¹ã\82¯ã\81®çµ\90Ê\9e\9cã\82\92Ã¥\8f\96åŸ\97ã\81\97ã\81ŠÀœ\9cÊ¥Âã\82\92ç¶\9aÚ¡\8cã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\80\81Àœ\95ã\82\82ã\81\9bã\81\9aã\81«ã\80\81ã\82¿ã\82¹ã\82¯ã\81\8cå®\8c˼\86ã\81\99ã\82\8bç\9eŽ\96\93ã\82\92Ê£確ã\81«åŸ\85ã\81€)ã\80\8dã\81\99ã\82\8bå¿\85ڊ\81ã\81\8cã\81ªã\81\84ã\81\9fã\82\81ã\80\81ã\80\8cé\9d\9eÃ¥\90\8cÊ\9c\9fã\80\8dã\81šå\91΋\81°ã\82\8cã\81Ÿã\81\99ã
+ã\80\8cé\9d\9eÃ¥\90\8cÊ\9c\9fã\80\8dã\81šå\91΋\81°ã\82\8cã\82\8bã\81®ã\81¯ã\80\81ã\82³ã\83³ã\83\94ã\83¥ã\83΋\82¿/ã\83\97ã\83Âã\82°ã\83©ã\83 ã\81\8cã\81\9dã\81®é\81\85ã\81\84ã\82¿ã\82¹ã\82¯ã\81šã\80\8cÃ¥\90\8cÊ\9c\9fã\80\8d(ã\82¿ã\82¹ã\82¯ã\81\8cã\81¡ã\82\87ã\81\86ã\81©çµ\82ã\82\8fã\82\8bç\9eŽ\96\93ã\82\92ã\80\81Àœ\95ã\82\82ã\81\9bã\81\9aã\81«åŸ\85ã\81€) ã\81\99ã\82\8bå¿\85ڊ\81ã\81\8cã\81ªã\81\84ã\81\8bã\82\89ã\81§ã\81\99ã\80\82çµ\90Ê\9e\9cã\82\92Ã¥\8f\97ã\81\91Ã¥\8f\96ã\81£ã\81Šå\87Šç\90\86ã\82\92ç¶\9aã\81\91ã\82\8bã\81\9fã\82\81ã\81«ã\80\81空åŸ\85ã\81¡ã\81\99ã\82\8bå¿\85ڊ\81ã\81\8cã\81\82ã\82\8aã\81Ÿã\81\9bã\82\93ã
-ãã®ä»£ããã«ããéåæãã·ã¹ãã ã§ããããšã«ããããã£ããçµäºãããšãã¿ã¹ã¯ã¯ãã³ã³ãã¥ãŒã¿/ããã°ã©ã ãæ¢ã«éå§ããåŠçããã¹ãŠå®äºããã®ãã»ãã®å°ã (æ°ãã€ã¯ãç§) åŸ
ã£ãŠãçµæãåãåãã«æ»ã£ãŠããŸãããããŠãåŠçãç¶ç¶ããŸãã
+代ããã«ãéåæãã·ã¹ãã ã§ã¯ãã¿ã¹ã¯ãçµãã£ãããã³ã³ãã¥ãŒã¿/ããã°ã©ã ãåãããã£ãŠããäœæ¥ãçµãããŸã§ (æ°ãã€ã¯ãç§ã»ã©) å°ãåŸ
ã¡ãçµæãåãåãã«æ»ã£ãŠåŠçãç¶ããããŸãã
-ãåæãã®å Žå (ãéåæããšã¯ç°ãªã)ããã·ãŒã±ã³ã·ã£ã«ããšããçšèªããã䜿çšãããŸããããã¯ãã³ã³ãã¥ãŒã¿/ããã°ã©ã ããã¹ãŠã®ã¹ãããã (åŸ
æ©ã䌎ãå Žåã§ãå¥ã®ã¿ã¹ã¯ã«åãæ¿ããããšãªã) é çªã«å®è¡ããããã§ãã
+ãéåæããšå¯Ÿã«ãªããåæãã¯ããã·ãŒã±ã³ã·ã£ã«ããšåŒã°ããããšããããŸããåŸ
æ©ãå«ãŸããŠããŠããå¥ã®ã¿ã¹ã¯ã«åãæ¿ããåã«ã³ã³ãã¥ãŒã¿/ããã°ã©ã ãæé ãé çªã«å®è¡ããããã§ãã
-### 䞊è¡åŠçãšãã³ããŒã¬ãŒ
+### 䞊è¡åŠçãšãã³ããŒã¬ãŒ { #concurrency-and-burgers }
-äžèšã®**éåæ**ã³ãŒãã®ã¢ã€ãã¢ã¯ã**ã䞊è¡åŠçã**ãšåŒã°ããããšããããŸãã **ã䞊ååŠçã**ãšã¯ç°ãªããŸãã
+äžã§èª¬æãã**éåæ**ã³ãŒãã®èãæ¹ã¯ã**ã䞊è¡åŠçã** ãšåŒã°ããããšããããŸãããã㯠**ã䞊ååŠçã** ãšã¯ç°ãªããŸãã
-**䞊è¡åŠç**ãš**䞊ååŠç**ã¯ã©ã¡ãããå€ããå°ãªããåæã«çºçããããŸããŸãªããšãã«é¢é£ããŠããŸãã
+**䞊è¡åŠç** ã **䞊ååŠç** ãããè€æ°ã®ããšãã ãããåæã«èµ·ãããããšã«é¢ä¿ããŸãã
-ãã ãã*䞊è¡åŠç*ãš*䞊ååŠç*ã®è©³çްã¯ãŸã£ããç°ãªããŸãã
+ãã ãã*䞊è¡åŠç* ãš *䞊ååŠç* ã®è©³çްã¯ããªãç°ãªããŸãã
-éãã確èªããã«ã¯ããã³ããŒã¬ãŒã«é¢ããæ¬¡ã®ç©èªãæ³åããŠã¿ãŠãã ãã:
+éããèŠãããã«ããã³ããŒã¬ãŒã«é¢ããæ¬¡ã®ç©èªãæ³åããŠã¿ãŠãã ããã
-### 䞊è¡ãã³ããŒã¬ãŒ
+### 䞊è¡ãã³ããŒã¬ãŒ { #concurrent-burgers }
-ã\83\95ã\82¡ã\82¹ã\83\88ã\83\95ã\83Œã\83\89ð\9f\8d\94ã\82\92é£\9fã\81¹ã\82\88ã\81\86ã\81šã\80\81奜ã\81\8dã\81ªÀººð\9f\98\8dã\81šã\83¬ã\82žã\81«ÀžŠã\82\93ã\81§ã\81\8aã\82\8aã\80\81ã\83¬ã\82žÀ¿\82ð\9f\92\81ã\81\8cã\81\82ã\81ªã\81\9fã\81®å\89\8dã\81«ã\81\84ã\82\8bÀººé\81\94ã\81®Ê³šÊ\96\87ã\82\92å\8f\97ã\81\91ã\81€ã\81\91ã\81Šã\81\84ã\81Ÿã\81\99ã\80\82
+ã\81\82ã\81ªã\81\9fã\81¯å¥œã\81\8dã\81ªÀººã\81šã\83\95ã\82¡ã\82¹ã\83\88ã\83\95ã\83Œã\83\89ã\82\92Ú²·ã\81\84ã\81«Ú¡\8cã\81\8dã\80\81å\89\8dã\81®Àººã\81\9fã\81¡ã\81®Ê³šÊ\96\87ã\82\92ã\83¬ã\82žÀ¿\82ã\81\8cå\8f\97ã\81\91ã\82\8bé\96\93ã\80\81å\88\97ã\81«ÀžŠã\81³ã\81Ÿã\81\99ã\80\82ð\9f\98\8d
-ããããããªãã®çªã«ãªãã奜ããªäººðãšèªåã®ããã«ã2ã€ã®éåžžã«è±ªè¯ãªãã³ããŒã¬ãŒðãæ³šæããŸãã
+<img src="/img/async/concurrent-burgers/concurrent-burgers-01.png" class="illustration">
-æéãæ¯æããŸãðžã
+ãããŠããªãã®çªã«ãªãã奜ããªäººãšèªåã®ããã«ããšãŠã豪è¯ãªãã³ããŒã¬ãŒã2ã€æ³šæããŸããðð
-ã¬ãžä¿ðã¯ãããã³ã®ç·ðšâð³ã«åãã£ãŠãããªãã®ãã³ããŒã¬ãŒðãæºåããªããã°ãªããªããšäŒããããã«äœãèšããŸãã (圌ã¯çŸåšãåã®ã客ããã®ååãæºåããŠããŸãã)ã
+<img src="/img/async/concurrent-burgers/concurrent-burgers-02.png" class="illustration">
-ã¬ãžä¿ðã¯ããªãã«çªå·æãæž¡ããŸãã
+ã¬ãžä¿ã¯ãããã³ã®æç人ã«ãããªãã®ãã³ããŒã¬ãŒãçšæãããã声ããããŸã (æç人ã¯ããŸåã®ã客ããã®åãäœã£ãŠããŸã)ã
-åŸ
ã£ãŠããéã奜ããªäººðãšäžç·ã«ããŒãã«ãéžãã§åº§ãã奜ããªäººðãšé·ãé話ãããŸã (泚æãããã³ããŒã¬ãŒã¯éåžžã«è±ªè¯ã§ãæºåã«å°ãæéããããã®ã§âšðâš)ã
+<img src="/img/async/concurrent-burgers/concurrent-burgers-03.png" class="illustration">
-ãã³ããŒã¬ãŒðãåŸ
ã¡ãªãã奜ããªäººðãšããŒãã«ã«åº§ã£ãŠããéãããªãã®å¥œããªäººããªããŠçŽ æŽãããããããããŠé ããããã ãšâšðâšæãæãããªããæéãè²»ããããšãã§ããŸãã
+æ¯æããããŸããðž
-奜ããªäººðãšè©±ããªããåŸ
ã£ãŠããéããšãã©ããã«ãŠã³ã¿ãŒã«è¡šç€ºãããŠããçªå·ããã§ãã¯ããŠãèªåã®çªãã©ããã確èªããŸãã
+ã¬ãžä¿ã¯ããªãã«çªå·æãæž¡ããŸãã
-ãã®åŸãã€ãã«ããªãã®çªã«ãªããŸãããã«ãŠã³ã¿ãŒã«è¡ãããã³ããŒã¬ãŒðãæã«å
¥ããŠããŒãã«ã«æ»ããŸãã
+<img src="/img/async/concurrent-burgers/concurrent-burgers-04.png" class="illustration">
-ããªããšããªãã®å¥œããªäººðã¯ãã³ããŒã¬ãŒðãé£ã¹ãŠã楜ããæéãéãããŸãâšã
+åŸ
ã£ãŠããéã奜ããªäººãšããŒãã«ã«ç§»åããŠåº§ãã(豪è¯ãªãã³ããŒã¬ãŒã¯æéããããã®ã§) ãã°ãã話ããŸãã
+
+ããŒãã«ã§åŸ
ã£ãŠããéã奜ããªäººãã©ãã ãçŽ æµã§ããããããŠãé ãè¯ãããçºããŠæéãéãããŸã âšðâšã
+
+<img src="/img/async/concurrent-burgers/concurrent-burgers-05.png" class="illustration">
+
+æã
ã«ãŠã³ã¿ãŒã®è¡šç€ºãèŠãŠãèªåã®çªå·ã«ãªã£ãŠããã確èªããŸãã
+
+ãããŠããªãã®çªã«ãªããŸããã«ãŠã³ã¿ãŒã«è¡ãããã³ããŒã¬ãŒãåãåããããŒãã«ã«æ»ããŸãã
+
+<img src="/img/async/concurrent-burgers/concurrent-burgers-06.png" class="illustration">
+
+ããªããšå¥œããªäººã¯ãã³ããŒã¬ãŒãé£ã¹ãŠã楜ããæéãéãããŸããâš
+
+<img src="/img/async/concurrent-burgers/concurrent-burgers-07.png" class="illustration">
+
+/// info | æ
å ±
+
+çŸããã€ã©ã¹ã㯠<a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a> ã«ãããã®ã§ããðš
+
+///
---
-äžèšã®ã¹ããŒãªãŒã§ãããªããã³ã³ãã¥ãŒã¿/ããã°ã©ã ð€ã ãšæ³åããŠã¿ãŠãã ããã
+ãã®ç©èªã§ãããªãèªèº«ãã³ã³ãã¥ãŒã¿/ããã°ã©ã ð€ ã ãšæ³åããŠã¿ãŠãã ããã
-Ã¥\88\97ã\81«ã\81\84ã\82\8bé\96\93ã\80\81ã\81\82ã\81ªã\81\9fã\81¯ã\82¢ã\82ۋ\83\89ã\83«ç\8a¶Ê\85\8bã\81§ã\81\99ð\9f\98Žã\80\82Àœ\95ã\82\82ã\80\8cç\94\9fç\94£ç\9a\84ã\80\8dã\81ªã\81\93ã\81šã\82\92ã\81\9bã\81\9aã\80\81ã\81\9fã\81 Ú\87ªå\88\86ã\81®ç\95ªã\82\92åŸ\85ã\81£ã\81Šã\81\84ã\81Ÿã\81\99ã\80\82ã\81\97ã\81\8bã\81\97ã\80\81ã\83‹\82žÀ¿\82ð\9f\92\81ã\81¯Ê³šÊ\96\87ã\82\92Ã¥\8f\97ã\81\91Ã¥\8f\96ã\82\8bã\81 ã\81\91ã\81ªã\81®ã\81§ (Ã¥\95\86Ã¥\93\81ã\81®Êº\96Ã¥\82\99ã\82\92ã\81\97ã\81Šã\81\84ã\82\8bã\82\8fã\81\91ã\81§ã\81¯ã\81ªã\81\84)ã\80\81Ã¥\88\97ã\81¯é«\98é\80\9fã\81§ã\81\99ã\80\82ã\81\97ã\81\9fã\81\8cã\81£ã\81Šã\80\81Àœ\95ã\82\82åé¡ãããŸããã
+Ã¥\88\97ã\81«ã\81\84ã\82\8bé\96\93ã\81¯ã\80\81Àœ\95ã\82\82ã\80\8cç\94\9fç\94£ç\9a\84ã\80\8dã\81ªã\81\93ã\81šã\82\92ã\81\9bã\81\9aã\80\81Ú\87ªå\88\86ã\81®ç\95ªã\82\92åŸ\85ã\81ۋ\81 ã\81\91ã\81®ã\82¢ã\82ۋ\83\89ã\83«ç\8a¶Ê\85\8b ð\9f\98ÂŽ ã\81§ã\81\99ã\80\82ã\81\9fã\81 ã\81\97ã\83‹\82žÀ¿\82ã\81¯Ê³šÊ\96\87ã\82\92Ã¥\8f\96ã\82\8bã\81 ã\81\91 (Àœ\9cã\82\8aã\81¯ã\81\97ã\81ªã\81\84) ã\81ªã\81®ã\81§å\88\97ã\81¯é\80\9fã\81\8fé\80²ã\81¿ã\80\81åé¡ãããŸããã
-ã\81\9dã\82\8cã\81\8bã\82\89ã\80\81ã\81\82ã\81ªã\81\9fã\81®ç\95ªã\81«ã\81ªã\81£ã\81\9fã\82\89ã\80\81å®\9fã\81«ã\80\8cç\94\9fç\94£ç\9a\84ã\81ªã\80\8dÀœ\9cÊ¥Âã\82\92Ú¡\8cã\81\84ã\81Ÿã\81\99ð\9f€\93ã\80\81ã\83¡ã\83\8bã\83¥ã\83΋\82\92確ڪ\8dã\81\97ã\80\81ʬ²ã\81\97ã\81\84ã\82\82ã\81®ã\82\92ʱºã\82\81ã\80\81奜ã\81\8dã\81ªÀººð\9f\98\8dã\81®Ê¬²ã\81\97ã\81\84ã\82\82ã\81®ã\82\92Ú\81\9eã\81\8dã\80\81Ê\96\99é\87\91ã\82\92Ê\94¯Ê\89\95ã\81\84ð\9f\92žã\80\81ç\8fŸé\87\91ã\81Ÿã\81\9fã\81¯ã\82«ã\83΋\83\89ã\82\92Ê£ã\81\97ã\81\8fʞ¡ã\81\97ã\81\9fã\81\8b確ڪ\8dã\81\97ã\80\81Ê£ã\81\97ã\81\8fʞ\85ç®\97ã\81\95ã\82\8cã\81\9fã\81\93ã\81šã\82\92確ڪ\8dã\81\97ã\80\81ʳšÊ\96\87ã\81\8cÊ£ã\81\97ã\81\8fé\80\9aã\81£ã\81Šã\81\84ã\82\8bããªã©ã確èªããŸãã
+ã\81\82ã\81ªã\81\9fã\81®ç\95ªã\81«ã\81ªã\82\8bã\81šã\80\81å®\9fé\9a\9bã\81«ã\80\8cç\94\9fç\94£ç\9a\84ã\80\8dã\81ªÀœ\9cÊ¥Âã\82\92ã\81\97ã\81Ÿã\81\99ã\80\82ã\83¡ã\83\8bã\83¥ã\83΋\82\92ڊ\8bã\81ŠÊ³šÊ\96\87ã\82\92ʱºã\82\81ã\80\81奜ã\81\8dã\81ªÀººã\81®å\88\86ã\82\82確ڪ\8dã\81\97ã\80\81Ê\94¯Ê\89\95ã\81\84ã\80\81Ê£ã\81\97ã\81\84çŽ\99å¹£/ã\82«ã\83΋\83\89ã\82\92ʞ¡ã\81\97ã\81\9fã\81\8bã\80\81Ê£ã\81\97ã\81\8fʱºÊž\88ã\81\95ã\82\8cã\81\9fã\81\8bã\80\81ʳšÊ\96\87Ã¥\86\85容ã\81\8cÊ£ã\81\97ã\81\84ããªã©ã確èªããŸãã
-ãããããã³ããŒã¬ãŒðããŸã ã§ããŠããªãã®ã§ããã³ããŒã¬ãŒã®æºåãã§ãããŸã§åŸ
æ©ðããå¿
èŠããããããã¬ãžä¿ðãšã®äœæ¥ã¯ãäžæåæ¢âžãã«ãªããŸãã
+ãããããã³ããŒã¬ãŒã¯ãŸã åºæ¥äžãã£ãŠããªãã®ã§ãã¬ãžä¿ãšã®ããåãã¯ãäžæåæ¢ãâž ã«ãªããŸãããã³ããŒã¬ãŒãã§ãããŸã§åŸ
〠ð å¿
èŠãããããã§ãã
-ã\81\97ã\81\8bã\81\97ã\80\81ã\82«ã\82Šã\83³ã\82¿ã\83΋\81\8bã\82\89é\9b¢ã\82\8cã\81Šã\80\81ç\95ªå\8f·Ê\9cÂã\82\92Ê\8c\81ã\81£ã\81Šã\83\86ã\83΋\83\96ã\83«ã\81«åº§ã\81£ã\81Šã\81\84ã\82\8bã\81šã\81\8dã\81¯ã\80\81ʳšÊ\84\8fã\82\92奜ã\81\8dã\81ªÀººð\9f\98\8dã\81«å\88\87ã\82\8aÊ\9b¿ã\81\88ã\81Šð\9f\94\80ã\80\81ã\81\9dã\81®Àž\8aã\81§ã\80\8cÀ»\95˼\8bâ\8f¯ð\9f€\93ã\80\8dã\82\92Ú¡\8cã\81ªã\81\88ã\81Ÿã\81\99ã\80\82ã\81\9dã\81®åŸ\8cã\80\81奜ã\81\8dã\81ªÀººð\9f\98\8dã\81šã\81\84ã\81¡ã\82\83ã\81ۋ\81\8fã\81\8bã\81®ã\82\88ã\81\86ã\81ªã\80\81é\9d\9e垞ã\81«ã\80\8cç\94\9fç\94£ç\9a\84ã\81ªð\9f€\93ã\80\8dã\81\93ã\81šã\82\92Ã¥\86\8dã\81³Ú¡\8cã\81\84ãŸãã
+ã\81\9fã\81 ã\81\97ã\80\81ç\95ªå\8f·Ê\9cÂã\82\92Ê\8c\81ã\81£ã\81Šã\82«ã\82Šã\83³ã\82¿ã\83΋\81\8bã\82\89é\9b¢ã\82\8cã\83\86ã\83΋\83\96ã\83«ã\81«åº§ã\82\8cã\81°ã\80\81ʳšÊ\84\8fã\82\92奜ã\81\8dã\81ªÀººã\81«å\88\87ã\82\8aÊ\9b¿ã\81\88 ð\9f\94\80ã\80\81ã\80\8cã\81\9dã\81®Àœ\9cÊ¥Âã\80\8dâ\8f¯ ð\9f€\93 ã\81«å\8f\96ã\82\8açµ\84ã\82\81ã\81Ÿã\81\99ã\80\82奜ã\81\8dã\81ªÀººã\81šã\81\84ã\81¡ã\82\83ã\81ۋ\81\8fã\81šã\81\84ã\81\86ã\80\81ã\81šã\81Šã\82\82ã\80\8cç\94\9fç\94£ç\9a\84ã\80\8dð\9f€\93 ã\81ªã\81\93ã\81šã\81\8cã\81Ÿã\81\9fã\81§ã\81\8dãŸãã
-次ã«ãã¬ãžä¿ðã¯ãããã³ããŒã¬ãŒã®æºåãã§ããŸããðããšèšã£ãŠãã«ãŠã³ã¿ãŒã®ãã£ã¹ãã¬ã€ã«çªå·ã衚瀺ããŸããã衚瀺çªå·ãããªãã®çªå·ã«å€ãã£ãŠããããã«çã£ãããã«é£ãã§è¡ããããªããšã¯ãããŸãããããªãã¯èªåã®çªå·æãæã£ãŠãã£ãŠãä»ã®äººãèªåã®çªå·æãããã®ã§ãããªãã®ãã³ããŒã¬ãŒðãçã人ãããªãããšã¯ç¥ã£ãŠããŸãã
+ã¬ãžä¿ ð ãã«ãŠã³ã¿ãŒã®è¡šç€ºã«ããªãã®çªå·ãåºããŠããã³ããŒã¬ãŒãã§ããŸããããšç¥ãããŠããããªãã¯è¡šç€ºãåãæ¿ãã£ãç¬éã«é£ã³è·³ãããããŸãããèªåã®çªå·æããããä»ã®äººã«ãããããçªå·æãããã®ã§ããã³ããŒã¬ãŒãçãããããšã¯ãªããšç¥ã£ãŠããããã§ãã
-ã\81ªã\81®ã\81§ã\80\81ã\81\82ã\81ªã\81\9fã\81¯å¥œã\81\8dã\81ªÀººð\9f\98\8dã\81\8c򩱋\81\97çµ\82ã\81\88ã\82\8bã\81®ã\82\92åŸ\85ã\81£ã\81Š (ç\8fŸå\9cšã\81®À»\95˼\8bâ\8f¯ / Ã¥\87Šç\90\86ÀžÂã\81®ã\82¿ã\82¹ã\82¯ã\82\92çµ\82˼\86ã\81\97ã\81Ÿã\81\99ð\9f€\93)ã\80\81Ã¥\84ªã\81\97ã\81\8f埮ç¬\91ã\82\93ã\81§ã\80\81ã\83\8fã\83³ã\83\90ã\83΋\82‹\83΋\82\92Ú²°ã\81£ã\81Šã\81\8fã\82\8bã\81Âã\81šÚš\80ã\81\84ã\81Ÿã\81\99âžã
+ã\81 ã\81\8bã\82\89ã\80\81奜ã\81\8dã\81ªÀººã\81®Ú©±ã\81\8cçµ\82ã\82\8fã\82\8bã\81®ã\82\92åŸ\85ã\81¡ (ç\8fŸå\9cšã\81®Àœ\9cÊ¥ â\8f¯ / Ã¥\87Šç\90\86ÀžÂã\81®ã\82¿ã\82¹ã\82¯ã\82\92å®\8c˼\86ã\81\97 ð\9f€\93)ã\80\81埮ç¬\91ã\82\93ã\81§ã\80\8cã\83\8fã\83³ã\83\90ã\83΋\82‹\83Ό\8f\96ã\81£ã\81Šã\81\8fã\82\8bã\81Âã\80\8dã\81šÚš\80ã\81\84ã\81Ÿã\81\99 âžã
-次ã«ãã«ãŠã³ã¿ãŒãžãããŸããå®äºããæåã®ã¿ã¹ã¯â¯ãžåããããã³ããŒã¬ãŒðãåãåããæè¬ã®æã衚ããŠãããŒãã«ã«æã£ãŠãããŸããããã§ãã«ãŠã³ã¿ãŒãšã®ããåãã®ã¹ããã/ã¿ã¹ã¯ãå®äºããŸããâ¹ãããã«ãããããã³ããŒã¬ãŒãé£ã¹ãðâ¯ããšããæ°ããã¿ã¹ã¯ãäœæãããŸããããããåã®ããã³ããŒã¬ãŒãååŸããããšããã¿ã¹ã¯ã¯çµäºããŸããâ¹ã
+ããããã«ãŠã³ã¿ãŒãžè¡ã ðãããŸå®äºããåæã®ã¿ã¹ã¯ â¯ ã«æ»ã£ãŠããã³ããŒã¬ãŒãåãåãã瀌ãèšã£ãŠããŒãã«ã«æã£ãŠãããŸããããã§ã«ãŠã³ã¿ãŒãšã®ããåããšããã¹ããã/ã¿ã¹ã¯ã¯å®äº â¹ ã§ãããã®çµæãšããŠããã³ããŒã¬ãŒãé£ã¹ããð ⯠ãšããæ°ããã¿ã¹ã¯ãçãŸããŸãããå
ã®ããã³ããŒã¬ãŒãåãåããã¿ã¹ã¯ã¯å®äº â¹ ããŠããŸãã
-### 䞊åãã³ããŒã¬ãŒ
+### 䞊åãã³ããŒã¬ãŒ { #parallel-burgers }
-ããããã䞊è¡ãã³ããŒã¬ãŒãã§ã¯ãªããã䞊åãã³ããŒã¬ãŒãã§ãããšããŸãããã
+ä»åºŠã¯ããããã䞊è¡ãã³ããŒã¬ãŒãã§ã¯ãªãã䞊åãã³ããŒã¬ãŒãã ãšæ³åããŸãããã
-ããªãã¯å¥œããªäººðãšäžŠåãã¡ã¹ãããŒãðãè²·ãããšããŠããŸãã
+ããªãã¯å¥œããªäººãšã䞊åããã¡ã¹ãããŒããè²·ãã«è¡ããŸãã
-åã«äžŠãã§ããŸãããäœäººãã®æç人å
Œãã¬ãžä¿ (8人ãšããŸããã) ðšâð³ðšâð³ðšâð³ðšâð³ðšâð³ðšâð³ðšâð³ðšâð³ãããªãã®åã«ãã人éã®æ³šæãåãã€ããŠããŸãã
+è€æ°ã®ã¬ãžä¿ (äŸãã° 8 人) ãåæã«æç人ã§ããããåã®äººãã¡ã®æ³šæãåããŠããŸãã
-8Àººã\81®ã\83¬ã\82žÀ¿\82ã\81\8cã\81\9dã\82\8cã\81\9eã\82\8cÚ\87ªå\88\86ã\81§Ê³šÊ\96\87ã\82\92å\8f\97ã\81\91ã\82\8bã\82\84å\90Šã\82\84ã\80\81ʬ¡ã\81®Ê³šÊ\96\87ã\82\92å\8f\97ã\81\91ã\82\8bå\89\8dã\81«ã\83\8fã\83³ã\83\90ã\83Œã\82¬ã\83Œã\82\92ʺ\96å\82\99ã\81\99ã\82\8bã\81®ã\81§ã\80\81ã\81\82ã\81ªã\81\9fã\81®å\89\8dã\81®Àººé\81\94ã\81¯ã\82«ã\82Šã\83³ã\82¿ã\83Œã\82\92é\9b¢ã\82\8cã\81\9aã\81«ã\80\81ã\83\8fã\83³ã\83\90ã\83Œã\82¬ã\83Œð\9f\8d\94ã\81\8cã\81§ã\81\8dã\82\8bã\81®ã\82\92åŸ\85ã\81£ã\81Šã\81\84ã\81Ÿã\81\99ð\9f\95\99ã\80\82
+8 Àººã\81®ã\83¬ã\82žÀ¿\82ã\81¯ã\81\9dã\82\8cã\81\9eã\82\8cã\80\81ʬ¡ã\81®Ê³šÊ\96\87ã\82\92å\8f\96ã\82\8bå\89\8dã\81«ã\81\99ã\81\90ã\81«Úª¿ç\90\86ã\81«å\8f\96ã\82\8aã\81\8bã\81\8bã\82\8bã\81\9fã\82\81ã\80\81ã\81\82ã\81ªã\81\9fã\81®å\89\8dã\81®Àººã\81\9fã\81¡ã\81¯ã\82«ã\82Šã\83³ã\82¿ã\83Œã\82\92é\9b¢ã\82\8cã\81\9aã\80\81ã\83\8fã\83³ã\83\90ã\83Œã\82¬ã\83Œã\81\8cã\81§ã\81\8dã\82\8bã\81®ã\82\92åŸ\85ã\81£ã\81Šã\81\84ã\81Ÿã\81\99ã\80\82
-ããããããããããªãã®çªã«ãªãã奜ããªäººðãšèªåã®ããã«ã2ã€ã®éåžžã«è±ªè¯ãªãã³ããŒã¬ãŒðãæ³šæããŸãã
+<img src="/img/async/parallel-burgers/parallel-burgers-01.png" class="illustration">
-æéãæ¯æããŸãðžã
+ããããããªãã®çªã«ãªãã奜ããªäººãšèªåã®ããã«è±ªè¯ãªãã³ããŒã¬ãŒã 2 ã€æ³šæããŸãã
-ã¬ãžä¿ã¯ãããã³ã«è¡ããŸãðšâð³ã
+æ¯æããããŸã ðžã
-ããªãã¯ã«ãŠã³ã¿ãŒã®åã«ç«ã£ãŠåŸ
ã¡ãŸãðãçªå·æããªãã®ã§èª°ãããªããããå
ã«ãã³ããŒã¬ãŒðãåããªãããã«ããŸãã
+<img src="/img/async/parallel-burgers/parallel-burgers-02.png" class="illustration">
-ã\81\82ã\81ªã\81\9fã\81šå¥œã\81\8dã\81ªÀººð\9f\98\8dã\81¯å¿\99ã\81\97ã\81\84ã\81®ã\81§ã\80\81Úª°ã\82\82ã\81\82ã\81ªã\81\9fã\81®å\89\8dã\81«Ê\9d¥ã\81\95ã\81\9bã\81Ÿã\81\9bã\82\93ã\81\97ã\80\81ã\81\82ã\81ªã\81\9fã\81®ã\83\8fã\83³ã\83\90ã\83΋\82‹\83΋\81\8cÃ¥\88°ç\9d\80ã\81\97ã\81\9fã\81šã\81\8dð\9f\95\99ã\81«Úª°ã\81«ã\82\82Ã¥\8f\96ã\82\8bã\81\93ã\81šã\82\92ښ±ã\81\97ã\81Ÿã\81\9bã\82\93ã\80\82ã\81\82ã\81ªã\81\9fã\81¯å¥œã\81\8dã\81ªÀººã\81«Ê³šÊ\84\8fã\82\92Ê\89\95ã\81\88ã\81Ÿã\81\9bã\82\93ð\9f\98\9eã
+ã\83‹\82žÀ¿\82ã\81¯ã\82Âã\83\83ã\83\81ã\83³ã\81«å\90\91ã\81\8bã\81\84ã\81Ÿã\81\99ã
-ããã¯ãåæãäœæ¥ã§ãããã¬ãžä¿/æç人ðšâð³ãšãåæãããŸããã¬ãžä¿/æç人ðšâð³ããã³ããŒã¬ãŒðã宿ãããŠããªãã«æž¡ããŸã§åŸ
ã€ðå¿
èŠããããã¡ããã©ãã®å®æã®ç¬éã«ããã«ããå¿
èŠããããŸããããã§ãªããã°ãä»ã®èª°ãã«åããããããããŸããã
+çªå·æããªããããä»ã®èª°ãã«å
ã«åãããªããããã«ãŠã³ã¿ãŒã®åã§ç«ã£ãŠåŸ
ã¡ãŸã ðã
-ãã®åŸãã«ãŠã³ã¿ãŒã®åã§é·ãæéåŸ
ã£ãŠããðãã€ãã«ã¬ãžä¿/æç人ðšâð³ããã³ããŒã¬ãŒðãæž¡ãã«æ»ã£ãŠããŸãã
+<img src="/img/async/parallel-burgers/parallel-burgers-03.png" class="illustration">
-ã\83\8fã\83³ã\83\90ã\83Œã\82¬ã\83Œð\9f\8d\94ã\82\92å\8f\96ã\82\8aã\80\81奜ã\81\8dã\81ªÀººð\9f\98\8dã\81šã\83\86ã\83Œã\83\96ã\83«ã\81«Ú¡\8cã\81\8dã\81Ÿã\81\99ã\80\82
+ã\81\82ã\81ªã\81\9fã\81šå¥œã\81\8dã\81ªÀººã\81¯ã\80\81Úª°ã\81«ã\82\82å\89²ã\82\8aڟŒã\81Ÿã\82\8cã\81\9aã\83\8fã\83³ã\83\90ã\83Œã\82¬ã\83Œã\81\8cÊ\9d¥ã\81\9fã\82\89ã\81\99ã\81\90å\8f\97ã\81\91å\8f\96ã\82\8cã\82\8bã\82\88ã\81\86ڊ\8b匵ã\81£ã\81Šã\81\84ã\82\8bã\81®ã\81§ã\80\81奜ã\81\8dã\81ªÀººã\81«Ê³šÊ\84\8fã\82\92å\90\91ã\81\91ã\82\89ã\82\8cã\81Ÿã\81\9bã\82\93ã\80\82ð\9f\98\9e
-ã\81\9fã\81 é£\9fã\81¹ã\82\8bã\81 ã\81\91ã\80\81ã\81\9dã\82\8cã\81§ã\81\8aã\81\97ã\81Ÿã\81\84ã\81§ã\81\99ã\80\82ð\9f\8d\94â\8f¹ã
+ã\81\93ã\82\8cã\81¯ã\80\8cÃ¥\90\8cÊ\9c\9fã\80\8dç\9a\84ã\81ªÀœ\9cÊ¥Âã\81§ã\81\99ã\80\82ã\83‹\82žÀ¿\82/Ê\96\99ç\90\86Àºº ð\9f\91šâ\80\8dð\9f\8d³ ã\81šã\80\8cÃ¥\90\8cÊ\9c\9fã\80\8dã\81\97ã\81Šã\81\84ã\81Ÿã\81\99ã\80\82ã\83‹\82žÀ¿\82/Ê\96\99ç\90\86Àºº ð\9f\91šâ\80\8dð\9f\8d³ ã\81\8cã\83\8fã\83³ã\83\90ã\83΋\82‹\83΋\82\92Àœ\9cã\82\8açµ\82ã\81\88ã\81ŠÊ\89\8bʞ¡ã\81\99ã\81\9dã\81®ç\9eŽ\96\93ã\81«ã\80\81åŸ\85ã\81£ã\81Š ð\9f\95\99 ã\81\9dã\81®å Žã\81«ã\81\84ã\81ªã\81\91ã\82\8cã\81°ã\81ªã\82\8aã\81Ÿã\81\9bã\82\93ã\80\82ã\81\9dã\81\86ã\81§ã\81ªã\81\84ã\81šÀ»\96ã\81®Úª°ã\81\8bã\81«å\8f\96ã\82\89ã\82\8cã\82\8bã\81\8bã\82\82ã\81\97ã\82\8cã\81Ÿã\81\9bã\82\93ã
-ã»ãšãã©ã®æéãã«ãŠã³ã¿ãŒã®åã§åŸ
ã€ã®ã«è²»ããããŠããã®ã§ðãããŸã話ããããã¡ãã€ãããšã¯ãããŸããã§ããðã
+<img src="/img/async/parallel-burgers/parallel-burgers-04.png" class="illustration">
----
+é·ãæé ð ã«ãŠã³ã¿ãŒåã§åŸ
ã£ãåŸãããããã¬ãžä¿/æç人 ðšâð³ ããã³ããŒã¬ãŒãæã£ãŠæ»ã£ãŠããŸãã
+
+<img src="/img/async/parallel-burgers/parallel-burgers-05.png" class="illustration">
+
+ãã³ããŒã¬ãŒãåãåãã奜ããªäººãšããŒãã«ã«è¡ããŸãã
+
+é£ã¹ãŠããããŸãã§ããâ¹
-ãã®äžŠåãã³ããŒã¬ãŒã®ã·ããªãªã§ã¯ãããªãã¯2ã€ã®ããã»ããµãåããã³ã³ãã¥ãŒã¿/ããã°ã©ã ð€ (ããªããšããªãã®å¥œããªäººð) ã§ãããäž¡æ¹ãšãåŸ
æ©ðããŠããŠã圌ãã¯ãã«ãŠã³ã¿ãŒã§åŸ
æ©ðãããããšã«å°å¿µããŠããŸãâ¯ã
+<img src="/img/async/parallel-burgers/parallel-burgers-06.png" class="illustration">
-ã\83\95ã\82¡ã\82¹ã\83\88ã\83\95ã\83΋\83\89åº\97ã\81«ã\81¯8ã\81ۋ\81®ã\83\97ã\83Âã\82ȋ\83\83ã\82µ (ã\83‹\82žÀ¿\82/Ê\96\99ç\90\86Àºº) ð\9f\91šâ\80\8dð\9f\8d³ð\9f\91šâ\80\8dð\9f\8d³ð\9f\91šâ\80\8dð\9f\8d³ð\9f\91šâ\80\8dð\9f\8d³ð\9f\91šâ\80\8dð\9f\8d³ð\9f\91šâ\80\8dð\9f\8d³ð\9f\91šâ\80\8dð\9f\8d³ð\9f\91šâ\80\8dð\9f\8d³ã\81\8cã\81\82ã\82\8aã\81Ÿã\81\99ã\80\82Àž\80Ê\96¹ã\80\81ÀžŠÚ¡\8cã\83\8fã\83³ã\83\90ã\83΋\82‹\83Œåº\97ã\81«ã\81¯2Àºº (ã\83‹\82žÀ¿\82ã\81šÊ\96\99ç\90\86Àºº) ð\9f\92\81ð\9f\91šâ\80\8dð\9f\8d³ã\81\97ã\81\8bã\81\84ã\81ªã\81\8bã\81£ã\81\9fã\81\8bã\82\82ã\81\97ã\82\8cã\81Ÿã\81\9bã\82\93ã\80\82
+ã\81»ã\81šã\82\93ã\81©ã\81®Ê\99\82é\96\93ã\82\92ã\82«ã\82Šã\83³ã\82¿ã\83Œå\89\8dã\81§åŸ\85ã\81€ ð\9f\95\99 ã\81®ã\81«Ú²»ã\82\84ã\81\97ã\81\9fã\81\9fã\82\81ã\80\81ã\81\82ã\81Ÿã\82\8aÚ©±ã\81\97ã\81\9fã\82\8aã\80\81ã\81\84ã\81¡ã\82\83ã\81€ã\81\84ã\81\9fã\82\8aã\81§ã\81\8dã\81Ÿã\81\9bã\82\93ã\81§ã\81\97ã\81\9fã\80\82ð\9f\98\9e
-ããããããã§ããæçµçãªäœéšã¯æé«ã§ã¯ãããŸããðã
+/// info | æ
å ±
+
+çŸããã€ã©ã¹ã㯠<a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a> ã«ãããã®ã§ããðš
+
+///
---
-ã\81\93ã\82\8cã\81¯ã\80\81ã\83\8fã\83³ã\83\90ã\83΋\82‹\83Œð\9f\8d\94ã\81®Ú©±ã\81šå\90\8cçÂ\89ã\81ªÚ©±ã\81«ã\81ªã\82\8aãŸãã
+ã\81\93ã\81®ã\80\8cÀžŠå\88\97ã\83\8fã\83³ã\83\90ã\83΋\82‹\83΋\80\8dã\81®ã\82·ã\83\8aã\83ªã\82ªã\81§ã\81¯ã\80\81ã\81\82ã\81ªã\81\9fã\81¯ 2 ã\81ۋ\81®ã\83\97ã\83Âã\82ȋ\83\83ã\82µ (ã\81\82ã\81ªã\81\9fã\81šå¥œã\81\8dã\81ªÀºº) ã\82\92Ê\8c\81ã\81ۋ\82³ã\83³ã\83\94ã\83¥ã\83΋\82¿/ã\83\97ã\83Âã\82°ã\83©ã\83 ð\9f€\96 ã\81§ã\80\81ã\81©ã\81¡ã\82\89ã\82\82é\95·ã\81\84é\96\93 ð\9f\95\99ã\80\8cã\82«ã\82Šã\83³ã\82¿ã\83΋\81§ã\81®åŸ\85Ê©\9fã\80\8dã\81«Ê³šÊ\84\8f â\8f¯ ã\82\92å°\82念ã\81\97ã\81Šã\81\84ãŸãã
-ãããçŸå®çãªãäŸãšããŠãéè¡ãæ³åããŠã¿ãŠãã ããã
+ãã¡ã¹ãããŒãåºã«ã¯ 8 åã®ããã»ããµ (ã¬ãžä¿/æç人) ããããŸããäžæ¹ã䞊è¡ãã³ããŒã¬ãŒã®åºã«ã¯ (ã¬ãžä¿ 1ã人ãæç人 1 人ã®) 2 åãããªãã£ããããããŸããã
+
+ããã§ããæçµçãªäœéšã¯æè¯ãšã¯èšããŸãããð
+
+---
-æè¿ãŸã§ãã»ãšãã©ã®éè¡ã¯è€æ°ã®çªå£ðšâðŒðšâðŒðšâðŒðšâðŒã«ãè¡åððððððððãã§ããŠããŸããã
+ããã¯ãã³ããŒã¬ãŒã«ããã䞊åçã®ç©èªã§ããð
-ã\81\99ã\81¹ã\81Šã\81®çª\93Ã¥\8f£ã\81§ã\80\81ʬ¡ã\80\85ã\81šã\80\81Àž\80Àººã\81®å®¢ã\81šã\81\99ã\81¹ã\81Šã\81®Àœ\9cÊ¥Âã\82\92Ú¡\8cã\81\84ã\81Ÿã\81\99ð\9f\91šâ\80\8dð\9f\92Ή\8f¯.
+ã\82\88ã\82\8aã\80\8cç\8fŸå®\9fç\9a\84ã\81ªã\80\8dÀŸ\8bã\81šã\81\97ã\81Šã\80\81é\8a\80Ú¡\8cã\82\92Ê\83³å\83\8fã\81\97ã\81Šã\81¿ã\81Šã\81\8fã\81 ã\81\95ã\81\84ã\80\82
-ã\81\9dã\81®Àž\8aã\80\81é\95·Ê\99\82é\96\93ã\80\81Ã¥\88\97ã\81«ÀžŠã\81°ã\81ªã\81\91ã\82\8cã\81°ã\81\84ã\81\91ã\81Ÿã\81\9bã\82\93ð\9f\95\99ã\80\82ã\81\9dã\81\86ã\81\97ã\81ªã\81\84ã\81šã\80\81é \86ç\95ªã\81\8cÃ¥\9b\9eã\81£ã\81Šã\81\8dã\81Ÿã\81\9bã\82\93ã
+ã\81ۋ\81\84Ê\9c\80Ú¿\91ã\81Ÿã\81§ã\80\81ã\81ȋ\81šã\82\93ã\81©ã\81®é\8a\80Ú¡\8cã\81«ã\81¯Ú€\87Ê\95°ã\81®çª\93Ã¥\8f£À¿\82 ð\9f\91šâ\80\8dð\9f\92Œð\9f\91šâ\80\8dð\9f\92Œð\9f\91šâ\80\8dð\9f\92Œð\9f\91šâ\80\8dð\9f\92ÂŒ ã\81šé\95·ã\81\84Ú¡\8cÃ¥\88\97 ð\9f\95\99ð\9f\95\99ð\9f\95\99ð\9f\95\99ð\9f\95\99ð\9f\95\99ð\9f\95\99ð\9f\95\99 ã\81\8cã\81\82ã\82\8aã\81Ÿã\81\97ã\81\9fã
-éè¡ðŠã§ã®çšäºã«ããªãã®å¥œããªäººðãé£ããŠè¡ãããã¯ãªãã§ãããã
+åçªå£ä¿ããäžäººãã€ããã¹ãŠã®äœæ¥ãé çªã«è¡ããŸã ðšâðŒâ¯ã
-### ãã³ããŒã¬ãŒã®ãŸãšã
+ãããŠãé·æé ð è¡åã§åŸ
ããªããã°é çªã倱ããŸãã
-ãã®ã奜ããªäººãšã®ãã¡ã¹ãããŒããã³ããŒã¬ãŒãã®ã·ããªãªã§ã¯ãåŸ
æ©ðãå€ãããã䞊è¡ã·ã¹ãã âžðâ¯ã䜿çšããæ¹ãã¯ããã«çã«ããªã£ãŠããŸãã
+éè¡ã®çšäº ðŠ ã«ã奜ããªäºº ð ãé£ããŠè¡ããããšã¯æããªãã§ãããã
-ããã¯ãã»ãšãã©ã®Webã¢ããªã±ãŒã·ã§ã³ã«åœãŠã¯ãŸããŸãã
+### ãã³ããŒã¬ãŒã®ãŸãšã { #burger-conclusion }
-å€ãã®ãŠãŒã¶ãŒãããŸããããµãŒããŒã¯ãããŸã匷ããªãåç·ã§ã®ãªã¯ãšã¹ãã®éä¿¡ãåŸ
æ©ðããŠããŸãã
+ãã®ã奜ããªäººãšãã¡ã¹ãããŒããã®ã·ããªãªã§ã¯ãåŸ
ã¡æé ð ãå€ãããã䞊è¡ã·ã¹ãã âžð⯠ãäœ¿ãæ¹ãã¯ããã«çã«ããªã£ãŠããŸãã
-ã\81\9dã\81\97ã\81Šã\80\81ã\83‹\82¹ã\83\9dã\83³ã\82¹ã\81\8cÚ¿\94ã\81£ã\81Šã\81\8fã\82\8bã\81®ã\82\92ã\82\82ã\81\86Àž\80床åŸ\85Ê©\9fð\9f\95\99ã\81\97ãŸãã
+ã\81\93ã\82\8cã\81¯ã\80\81ã\81ȋ\81šã\82\93ã\81©ã\81® Web ã\82¢ã\83\97ã\83ªã\82±ã\83΋\82·ã\83§ã\83³ã\81«ã\82\82åœ\93ã\81Šã\81¯ã\81Ÿã\82\8aãŸãã
-ã\81\93ã\81®ã\80\8cåŸ\85Ê©\9fð\9f\95\99ã\80\8dã\81¯ã\83\9eã\82ۋ\82¯ã\83Âç§\92Ã¥\8d\98Àœ\8dã\81§ã\81\99ã\81\8cã\80\81ã\81\9dã\82\8cã\81§ã\82\82ã\80\81ã\81\99ã\81¹ã\81Šå\90\88ç®\97ã\81\99ã\82\8bã\81šã\80\81Ê\9c\80çµ\82ç\9a\84ã\81«ã\81¯ã\81\8bã\81ªã\82\8aåŸ\85Ê©\9fã\81\99ã\82\8bã\81\93ã\81šã\81«ã\81ªã\82\8aã\81Ÿã\81\99ã\80\82
+ã\81šã\81Šã\82\82å€\9aã\81\8fã\81®ã\83Šã\83Œã\82¶ã\83Œã\81\8cã\81\84ã\81Ÿã\81\99ã\81\8cã\80\81ã\82µã\83Œã\83\90ã\81¯åœŒã\82\89ã\81®ã\81\82ã\81Ÿã\82\8aé\80\9fã\81\8fã\81ªã\81\84å\9b\9eç·\9aã\81\8bã\82\89ã\83ªã\82¯ã\82šã\82¹ã\83\88ã\81\8cå±\8aã\81\8fã\81®ã\82\92åŸ\85ã\81¡ ð\9f\95\99ã\80\81
-ã\81\93ã\82\8cã\81\8cã\80\81Web APIã\81žã\81®é\9d\9eå\90\8cÊ\9c\9fâ\8fžð\9f\94\80â\8f¯ã\82³ã\83Œã\83\89ã\81®å\88©ç\94šã\81\8cç\90\86ã\81«ã\81\8bã\81ªã\81£ã\81Šã\81\84ã\82\8bç\90\86ç\94±ã\81§ã\81\99ã\80\82
+ã\81\9dã\81®åŸ\8cã\80\81ã\83¬ã\82¹ã\83\9dã\83³ã\82¹ã\81\8cÊ\88»ã\81£ã\81Šã\81\8fã\82\8bã\81®ã\82\92ã\81Ÿã\81\9fåŸ\85ã\81¡ã\81Ÿã\81\99 ð\9f\95\99ã\80\82
-ã\81ȋ\81šã\82\93ã\81©ã\81®Ê\97¢åÂ\98ã\81®ÀººÊ°\97ã\81®ã\81\82ã\82\8bPythonã\83\95ã\83‹\83΋\83 ã\83¯ã\83΋\82¯ (Flaskã\82\84Djangoã\82\92Ã¥\90«ã\82\80) ã\81¯ã\80\81Pythonã\81®Ê\96°ã\81\97ã\81\84é\9d\9eÃ¥\90\8cÊ\9c\9fÊ©\9fÚ\83ϋ\81\8cã\81§ã\81\8dã\82\8bÃ¥\89\8dã\81«Àœ\9cÊ\88\90ã\81\95ã\82\8cã\81Ÿã\81\97ã\81\9fã\80\82ã\81\97ã\81\9fã\81\8cã\81£ã\81Šã\80\81ã\81\9dã\82\8cã\82\89ã\82\92ã\83\87ã\83\97ã\83Âã\82ۋ\81\99ã\82\8bÊ\96¹Ê³\95ã\81¯ã\80\81ÀžŠå\88\97å®\9fÚ¡\8cã\81šã\80\81Ê\96°Ê©\9fÚ\83ϋ\81ȋ\81©åŒ·å\8a\9bã\81§ã\81¯ã\81ªã\81\84Ã¥\8fۋ\81\84圢åŒ\8fã\81®é\9d\9eÃ¥\90\8cÊ\9c\9få®\9fÚ¡\8cã\82\92ã\82µã\83\9dã\83΋\83\88ã\81\97ãŸãã
+ã\81\93ã\81®ã\80\8cåŸ\85ã\81¡ã\80\8dð\9f\95\99 ã\81¯ã\83\9eã\82ۋ\82¯ã\83Âç§\92Ã¥\8d\98Àœ\8dã\81§Êž¬ã\82\89ã\82\8cã\81Ÿã\81\99ã\81\8cã\80\81ã\81\99ã\81¹ã\81Šã\82\92Ã¥\90\88ښ\88ã\81\99ã\82\8bã\81šã\80\81çµ\90å±\80ã\81\8bã\81ªã\82\8aã\81®åŸ\85ã\81¡ã\81«ã\81ªã\82\8aãŸãã
-ã\81\97ã\81\8bã\81\97ã\80\81WebSocketã\81®ã\82µã\83\9dã\83΋\83\88ã\82\92Ú¿œå\8a ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\80\81é\9d\9eÃ¥\90\8cÊ\9c\9fWeb Python (ASGI) ã\81®Àž»ã\81ªÀ»\95ʧ\98ã\81¯Djangoã\81§é\96\8bç\99ºã\81\95ã\82\8cã\81Ÿã\81\97ã\81\9fã
+ã\81 ã\81\8bã\82\89ã\81\93ã\81\9dã\80\81Web API ã\81«ã\81¯é\9d\9eÃ¥\90\8cÊ\9c\9f â\8fžð\9f\94\80â\8f¯ ã\82³ã\83΋\83\89ã\82\92Àœ¿ã\81\86ã\81®ã\81\8cç\90\86ã\81«ã\81\8bã\81ªã\81£ã\81Šã\81\84ã\81Ÿã\81\99ã
-ã\81\9dã\81®ã\82\88ã\81\86ã\81ªé\9d\9eÃ¥\90\8cÊ\9c\9fÊ\80§ã\81\8cNodeJSã\82\92ÀººÊ°\97ã\81«ã\81\97ã\81\9fç\90\86ç\94±ã\81§ã\81\99 (NodeJSã\81¯ÀžŠå\88\97ã\81§ã\81¯ã\81\82ã\82\8aã\81Ÿã\81\9bã\82\93ã\81\8c)ã\80\82ã\81\9dã\81\97ã\81Šã\80\81ã\83\97ã\83Âã\82°ã\83©ã\83\9fã\83³ã\82°Úš\80Úª\9eã\81šã\81\97ã\81Šã\81®Goã®åŒ·ã¿ã§ããããŸãã
+ã\81\93ã\82\8cã\81\8cã\80\81NodeJS ã\82\92ÀººÊ°\97ã\81«ã\81\97ã\81\9fڊ\81Ã¥\9b (NodeJS Ú\87ªÀœ\93ã\81¯ÀžŠå\88\97ã\81§ã\81¯ã\81\82ã\82\8aã\81Ÿã\81\9bã\82\93) ã\81§ã\81\82ã\82\8aã\80\81ã\83\97ã\83Âã\82°ã\83©ã\83\9fã\83³ã\82°Úš\80Úª\9eã\81šã\81\97ã\81Šã\81® Go ã®åŒ·ã¿ã§ããããŸãã
-ã\81\9dã\81\97ã\81Šã\80\81ã\81\9dã\82\8cã\81¯**FastAPI**ã\81§åŸ\97ã\82\89ã\82\8cã\82\8bã\83\91ã\83\95ã\82©ã\83΋\83\9eã\83³ã\82¹ã\81šå\90\8cã\81\98ã\83‹\83\99ã\83«ã§ãã
+ã\81\9dã\81\97ã\81Šã\80\81ã\81\9dã\82\8cã\81\8c **FastAPI** ã\81§åŸ\97ã\82\89ã\82\8cã\82\8bã\83\91ã\83\95ã\82©ã\83΋\83\9eã\83³ã\82¹ã\81®Ê°ŽÊº\96ã§ãã
-ã\81Ÿã\81\9fã\80\81ÀžŠå\88\97Ã¥\87Šç\90\86ã\81šé\9d\9eÃ¥\90\8cÊ\9c\9fÃ¥\87Šç\90\86ã\82\92Ã¥\90\8cÊ\99\82ã\81«å®\9fÚ¡\8cã\81§ã\81\8dã\82\8bã\81\9fã\82\81ã\80\81ã\83\86ã\82¹ã\83\88ʞ\88ã\81¿ã\81®ã\81ȋ\81šã\82\93ã\81©ã\81®NodeJSã\83\95ã\83‹\83΋\83 ã\83¯ã\83΋\82¯ã\82\88ã\82\8aã\82\82é«\98ã\81\8fã\80\81Goã\81šå\90\8cçÂ\89ã\81®ã\83\91ã\83\95ã\82©ã\83΋\83\9eã\83³ã\82¹ã\81\8cåŸ\97ã\82\89ã\82\8cã\81Ÿã\81\99ã\80\82Goã\81¯ã\80\81Cã\81«Ú¿\91ã\81\84ã\82³ã\83³ã\83\91ã\82ۋ\83«Úš\80Úª\9eã\81§ã\81\99 <a href="https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1" class="external-link" target="_blank">(Starletteã\81«Ê\84\9fÚ¬\9dã\81\97ã\81Ÿã)</a>ã
+ã\81\95ã\82\89ã\81«ã\80\81ÀžŠå\88\97Ê\80§ã\81šé\9d\9eÃ¥\90\8cÊ\9c\9fÊ\80§ã\82\92Ã¥\90\8cÊ\99\82ã\81«ÊŽ»ç\94šã\81§ã\81\8dã\82\8bã\81\9fã\82\81ã\80\81ã\83\86ã\82¹ã\83\88ã\81\95ã\82\8cã\81\9få€\9aã\81\8fã\81® NodeJS ã\83\95ã\83‹\83΋\83 ã\83¯ã\83΋\82¯ã\82\88ã\82\8aé«\98ã\81\84Ê\80§Ú\83ϋ\82\92ç\99ºÊ\8f®ã\81\97ã\80\81C ã\81«Ú¿\91ã\81\84ã\82³ã\83³ã\83\91ã\82ۋ\83«Úš\80Úª\9eã\81§ã\81\82ã\82\8b Go ã\81šå\90\8cçÂ\89ã\81®Ê\80§Ú\83ϋ\81«ã\81ªã\82\8aã\81Ÿã\81\99 <a href="https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1" class="external-link" target="_blank">(ã\81\99ã\81¹ã\81Š Starlette ã\81®ã\81\8aã\81\8bã\81\92ã\81§ã)</a>ã
-### 䞊è¡ã¯äžŠåãããåªããŠããŸããïŒ
+### 䞊è¡åŠçã¯äžŠååŠçããåªããŠããïŒ { #is-concurrency-better-than-parallelism }
-ã\81\84ã\82\84ïŒ\81ã\81\9dã\82\8cã\81¯ãã®è©±ã®æèšã§ã¯ãããŸããã
+ã\81\84ã\81\84ã\81\88ïŒ\81ã\81\9dã\82\8cã\81\8cãã®è©±ã®æèšã§ã¯ãããŸããã
-䞊è¡åŠçã¯äžŠååŠçãšã¯ç°ãªããŸããå€ãã®åŸ
æ©ã䌎ã**ç¹å®ã®**ã·ããªãªã«é©ããŠããŸãããã®ãããäžè¬ã«ãWebã¢ããªã±ãŒã·ã§ã³éçºã§ã¯äžŠååŠçãããã¯ããã«åªããŠããŸãããããããã¹ãŠã«å¯ŸããŠããè¯ããšããããã§ã¯ãããŸããã
+䞊è¡åŠçã¯äžŠååŠçãšã¯ç°ãªããŸãããããŠå€ãã®åŸ
ã¡æéã䌎ã**ç¹å®ã®**ã·ããªãªã§ã¯åªããŠããŸãããã®ãããäžè¬ã« Web ã¢ããªéçºã§ã¯äžŠååŠçããã¯ããã«é©ããŠããŸãããããããã¹ãŠã«å¯ŸããŠæè¯ãšããããã§ã¯ãããŸããã
-ã\81ªã\81®ã\81§ã\80\81ã\83\90ã\83©ã\83³ã\82¹ã\82\92ã\81šã\82\8bã\81\9fã\82\81ã\81«ã\80\81ʬ¡ã\81®ç\89©Úª\9eã\82\92Ê\83³å\83\8fã\81\97ã\81ŠÀž\8bã\81\95ã\81\84:
+ã\83\90ã\83©ã\83³ã\82¹ã\82\92Ã¥\8f\96ã\82\8bã\81\9fã\82\81ã\81«ã\80\81ʬ¡ã\81®ç\9fÂã\81\84ç\89©Úª\9eã\82\92Ê\83³å\83\8fã\81\97ã\81Šã\81\8fã\81 ã\81\95ã\81\84ã\80\82
-> ããªãã¯å€§ãããŠæ±ããå®¶ãæé€ããå¿
èŠããããŸãã
+> 倧ãããŠæ±ããå®¶ãæé€ããªããã°ãªããªãã
-*ã¯ãã以äžã§ã*ã
+*ã¯ããããã§ç©èªã¯å
šéšã§ã*ã
---
-åŸ
æ©ðãããå®¶ã®äžã®è€æ°ã®å Žæã§ããããã®ä»äºãããã ãã§ãã
+ã©ãã«ãåŸ
ã¡ ð ã¯ãªããå®¶ã®è€æ°ç®æã§å€§éã®äœæ¥ãããã ãã§ãã
-ã\81\82ã\81ªã\81\9fã\81¯ã\83\8fã\83³ã\83\90ã\83΋\82‹\83΋\81®ÀŸ\8bã\81®ã\82\88ã\81\86ã\81«ã\80\81Ê\9c\80Ã¥\88\9dã\81¯ã\83ªã\83\93ã\83³ã\82°ã\83«ã\83΋\83 ã\80\81ʬ¡ã\81«ã\82Âã\83\83ã\83\81ã\83³ã\81®ã\82\88ã\81\86ã\81«é \86ç\95ªã\81«ã\82\84ã\81£ã\81Šã\81\84ã\81\8fã\81\93ã\81šã\81\8cã\81§ã\81\8dã\81Ÿã\81\99ã\81\8cã\80\81Àœ\95ã\81\8bã\82\92åŸ\85Ê©\9fð\9f\95\99ã\81\97ã\81Šã\81\84ã\82\8bã\82\8fã\81\91ã\81§ã\81¯ã\81ªã\81\8fã\80\81ã\81\9fã\81 ã\81²ã\81\9fã\81\99ã\82\89ã\81«Ê\8e\83é\99ۋ\82\92ã\81\99ã\82\8bã\81 ã\81\91ã\81§ã\80\81é \86ç\95ªã\81¯Àœ\95ã\81«ã圱é¿ããŸããã
+ã\83\8fã\83³ã\83\90ã\83΋\82‹\83΋\81®ÀŸ\8bã\81®ã\82\88ã\81\86ã\81«é \86ç\95ªã\82\92ʱºã\82\81ã\81Šã\80\81ã\81Ÿã\81\9aã\83ªã\83\93ã\83³ã\82°ã\80\81ʬ¡ã\81«ã\82Âã\83\83ã\83\81ã\83³ã\80\81ã\81šé\80²ã\82\81ã\81Šã\82\82ã\82\88ã\81\84ã\81®ã\81§ã\81\99ã\81\8cã\80\81Àœ\95ã\81\8bã\82\92åŸ\85ã\81€ ð\9f\95\99 ã\82\8fã\81\91ã\81§ã\81¯ã\81ªã\81\8fã\80\81ã\81²ã\81\9fã\81\99ã\82\89Ê\8e\83é\99ۋ\81\99ã\82\8bã\81 ã\81\91ã\81ªã\81®ã\81§ã\80\81é \86ç\95ªã\81¯Àœ\95ã圱é¿ããŸããã
-é çªã®æç¡ã«é¢ä¿ãªã (䞊è¡ã«) åãæéãããããåãéã®äœæ¥ãè¡ãããããšã«ãªãã§ãããã
+é çªã®æç¡ (äžŠè¡æ§ã®æç¡) ã«é¢ä¿ãªããçµäºãŸã§ã«åãæéãããããåãäœæ¥éãããªãããšã«ãªããŸãã
-ã\81\97ã\81\8bã\81\97ã\80\81ã\81\93ã\81®å Žå\90\88ã\80\818Àººã\81®å\85\83ã\83‹\82žÀ¿\82/Ê\96\99ç\90\86Àºº/ç\8fŸåœ¹Êž\85Ê\8e\83Ã¥\93¡ð\9f\91šâ\80\8dð\9f\8d³ð\9f\91šâ\80\8dð\9f\8d³ð\9f\91šâ\80\8dð\9f\8d³ð\9f\91šâ\80\8dð\9f\8d³ð\9f\91šâ\80\8dð\9f\8d³ð\9f\91šâ\80\8dð\9f\8d³ð\9f\91šâ\80\8dð\9f\8d³ð\9f\91šâ\80\8dð\9f\8d³ã\82\92Ê\89\8bé\85\8dã\81§ã\81\8dã\81Šã\80\81ã\81\9dã\82\8cã\81\9eã\82\8c (ã\81\95ã\82\89ã\81«ã\81\82ã\81ªã\81\9fã\82\82) ã\81\8cå®¶ã\81®å\88¥ã\80\85ã\81®å ŽÊ\89\80ã\82\92Ê\8e\83é\99ۋ\81§ã\81\8dã\82\8cã\81°ã\80\81Ú¿œå\8a ã\81®å\8a©ã\81\91ã\82\92Ã¥\80\9fã\82\8aã\81Šã\80\81ã\81\99ã\81¹ã\81Šã\81®Àœ\9cÊ¥Âã\82\92**ÀžŠå\88\97**ã\81«Ú¡\8cã\81\84ã\80\81ã\81¯ã\82\8bã\81\8bã\81«Ê\97©ã\81\8fçµ\82˼\86ã\81§ã\81\8dã\82\8bã\81§ã\81\97ã\82\87ã\81\86ã
+ã\81\97ã\81\8bã\81\97ã\81\93ã\81®å Žå\90\88ã\80\818 Àººã\81®å\85\83ã\83‹\82žÀ¿\82/Ê\96\99ç\90\86Àºº/ç\8fŸÊž\85Ê\8e\83Ã¥\93¡ã\82\92é\80£ã\82\8cã\81Šã\81\8dã\81Šã\80\81ã\81\9dã\82\8cã\81\9eã\82\8c (ã\81\82ã\81ªã\81\9fã\82\82Ã¥\8a ã\81\88ã\81Š) å®¶ã\81®å\88¥ã\80\85ã\81®ã\82šã\83ªã\82¢ã\82\92Ê\8e\83é\99ۋ\81§ã\81\8dã\82\8cã\81°ã\80\81**ÀžŠå\88\97** ã\81«Àœ\9cÊ¥Âã\81§ã\81\8dã\80\81ã\82\88ã\82\8aÊ\97©ã\81\8fçµ\82ã\81\88ã\82\89ã\82\8cã\81Ÿã\81\99ã
-ãã®ã·ããªãªã§ã¯ãæž
æå¡ (ããªããå«ã) ã®ãããããããã»ããµãšãªããããããã®åœ¹å²ãæãããŸãã
+ãã®ã·ããªãªã§ã¯ãåæž
æå¡ (ããªããå«ã) ãããã»ããµã§ããããããããèªåã®åœ¹å²ãæãããŸãã
-ã\81Ÿã\81\9fã\80\81å®\9fÚ¡\8cÊ\99\82é\96\93ã\81®ã\81ȋ\81šã\82\93ã\81©ã\81¯ (åŸ\85Ê©\9fã\81§ã\81¯ã\81ªã\81\8f) å®\9fé\9a\9bã\81®Àœ\9cÊ¥Âã\81«Ú²»ã\82\84ã\81\95ã\82\8cã\80\81ã\82³ã\83³ã\83\94ã\83¥ã\83΋\82¿ã\81§ã\81®Àœ\9cÊ¥Âã\81¯<abbr title="Central Processing Unit">CPU</abbr>ã\81«ã\82\88ã\81£ã\81ŠÚ¡\8cã\82\8fã\82\8cã\81Ÿã\81\99ã\80\82ã\81\93ã\82\8cã\82\89ã\81®å\95\8fé¡\8cã\81¯ã\80\8cCPUã\83\90ã\82Šã\83³ã\83\89ã\80\8dã\81šÚš\80ã\81\84ãŸãã
+ã\81\9dã\81\97ã\81Šå®\9fÚ¡\8cÊ\99\82é\96\93ã\81®å€§å\8d\8aã\81¯ (åŸ\85ã\81¡ã\81§ã\81¯ã\81ªã\81\8f) å®\9fÀœ\9cÊ¥Âã\81\8cÃ¥\8d ã\82\81ã\80\81ã\82³ã\83³ã\83\94ã\83¥ã\83΋\82¿ã\81§ã\81®Àœ\9cÊ¥Âã\81¯ <abbr title="Central Processing Unit - ÀžÂ倮å\87Šç\90\86Ú£\85眮">CPU</abbr> ã\81«ã\82\88ã\81£ã\81ŠÚ¡\8cã\82\8fã\82\8cã\81Ÿã\81\99ã\80\82ã\81\93ã\82\8cã\82\89ã\81®å\95\8fé¡\8cã\81¯ã\80\8cCPU ã\83\90ã\82Šã\83³ã\83\89ã\80\8dã\81šå\91΋\81°ã\82\8cãŸãã
---
-CPUããŠã³ãæäœã®äžè¬çãªäŸã¯ãè€éãªæ°åŠåŠçãå¿
èŠãªãã®ã§ãã
+CPU ããŠã³ããªæäœã®äžè¬çãªäŸã¯ãè€éãªæ°å€åŠçãå¿
èŠãªãã®ã§ãã
äŸãã°:
* **ãªãŒãã£ãª** ã **ç»ååŠç**ã
-* **ã³ã³ãã¥ãŒã¿ããžã§ã³**: ç»åã¯æ°çŸäžã®ãã¯ã»ã«ã§æ§æãããåãã¯ã»ã«ã«ã¯3ã€ã®å€/è²ããããéåžžããããã®ãã¯ã»ã«ã§äœããåæã«èšç®ããå¿
èŠãããåŠçã
-* **æ©æ¢°åŠç¿**: éåžžãå€ãã®ãè¡åããšããã¯ãã«ãã®ä¹ç®ãå¿
èŠã§ãã巚倧ãªã¹ãã¬ããã·ãŒãã«æ°åãå
¥ããŠããããåæã«å
šéšæãåãããããšãèããŠã¿ãŠãã ããã
-* **ãã£ãŒãã©ãŒãã³ã°**: ããã¯æ©æ¢°åŠç¿ã®ãµããã£ãŒã«ãã§ãããããåãããšãåœãŠã¯ãŸããŸããä¹ç®ããæ°åãããåäžã®ã¹ãã¬ããã·ãŒãã§ã¯ãªãããããã®èšå€§ãªéåã§ãå€ãã®å Žåããããã®ã¢ãã«ãæ§ç¯ããã³/ãŸãã¯äœ¿çšããããã«ç¹å¥ãªããã»ããµã䜿çšããŸãã
+* **ã³ã³ãã¥ãŒã¿ããžã§ã³**: ç»åã¯æ°çŸäžã®ãã¯ã»ã«ã§æ§æãããåãã¯ã»ã«ã«ã¯ 3 ã€ã®å€/è²ããããéåžžããããã®ãã¯ã»ã«äžã§åæã«äœããèšç®ããå¿
èŠããããŸãã
+* **æ©æ¢°åŠç¿**: å€ãã®ãè¡åããããã¯ãã«ãã®ä¹ç®ãå¿
èŠã«ãªããŸãã巚倧ãªã¹ãã¬ããã·ãŒãã«æ°åãå
¥ã£ãŠããŠãããããåæã«ãã¹ãŠæãåãããããšãæ³åããŠãã ããã
+* **ãã£ãŒãã©ãŒãã³ã°**: æ©æ¢°åŠç¿ã®ãµããã£ãŒã«ããªã®ã§åæ§ã§ããæãåãããæ°åã 1 ã€ã®ã¹ãã¬ããã·ãŒãã§ã¯ãªãèšå€§ãªéåã§ãããå€ãã®å Žåããããã®ã¢ãã«ãæ§ç¯/å©çšããããã®ç¹å¥ãªããã»ããµã䜿ããŸãã
-### 䞊è¡åŠç + 䞊ååŠç: Web + æ©æ¢°åŠç¿
+### 䞊è¡åŠç + 䞊ååŠç: Web + æ©æ¢°åŠç¿ { #concurrency-parallelism-web-machine-learning }
-**FastAPI**ã䜿çšãããšãWebéçºã§éåžžã«äžè¬çãªäžŠè¡åŠç (NodeJSã®äž»ãªé
åãšåããã®) ãå©çšã§ããŸãã
+**FastAPI** ã§ã¯ãWeb éçºã§éåžžã«äžè¬çãªäžŠè¡åŠç (NodeJS ã®äž»ãªé
åãšåã) ãæŽ»çšã§ããŸãã
-ãã ããæ©æ¢°åŠç¿ã·ã¹ãã ã®ãã㪠**CPUããŠã³ã** ã¯ãŒã¯ããŒãã«å¯ŸããŠã䞊ååŠçãšãã«ãããã»ãã·ã³ã° (è€æ°ã®ããã»ã¹ã䞊åã§å®è¡ããã) ã®å©ç¹ã掻çšããããšãã§ããŸãã
+åæã«ãæ©æ¢°åŠç¿ã·ã¹ãã ã®ãã㪠**CPU ããŠã³ã** ãªã¯ãŒã¯ããŒãã«å¯ŸããŠã䞊ååŠçããã«ãããã»ãã·ã³ã° (è€æ°ããã»ã¹ã®äžŠåå®è¡) ã®å©ç¹ã掻çšã§ããŸãã
-ããã«ãPythonã**ããŒã¿ãµã€ãšã³ã¹**ãæ©æ¢°åŠç¿ãç¹ã«ãã£ãŒãã©ãŒãã³ã°ã®äž»èŠèšèªã§ãããšããåçŽãªäºå®ã«ãããFastAPIã¯ããŒã¿ãµã€ãšã³ã¹/æ©æ¢°åŠç¿ã®Web APIããã³ã¢ããªã±ãŒã·ã§ã³ (ä»ã®å€ãã®ã¢ããªã±ãŒã·ã§ã³ãšã®) ã«éåžžã«ããé©åããŠããŸãã
+ããã«ãPython ã **ããŒã¿ãµã€ãšã³ã¹**ãæ©æ¢°åŠç¿ãç¹ã«ãã£ãŒãã©ãŒãã³ã°ã®äž»èŠèšèªã§ãããšããäºå®ãçžãŸã£ãŠãFastAPI ã¯ããŒã¿ãµã€ãšã³ã¹/æ©æ¢°åŠç¿ã® Web API ãã¢ããªã±ãŒã·ã§ã³ (ã»ã倿°) ã«éåžžã«é©ããŠããŸãã
-æ¬çªç°å¢ã§ãã®äžŠååŠçãå®çŸããæ¹æ³ã«ã€ããŠã¯ã[ãããã€](deployment/index.md){.internal-link target=_blank}ã«é¢ããã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã
+æ¬çªç°å¢ã§ãã®äžŠåæ§ãå®çŸããæ¹æ³ã¯ã[ãããã€](deployment/index.md){.internal-link target=_blank} ã®ã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã
-## `async` ãš `await`
+## `async` ãš `await` { #async-and-await }
-çŸä»£çãªããŒãžã§ã³ã®Pythonã«ã¯ãéåæã³ãŒããå®çŸ©ããéåžžã«çŽæçãªæ¹æ³ããããŸããããã«ãããéåžžã®ãã·ãŒã±ã³ã·ã£ã«ãã³ãŒãã®ããã«èŠããé©åãªã¿ã€ãã³ã°ã§ãåŸ
æ©ãããŸãã
+ã¢ãã³ãª Python ã«ã¯ãéåæã³ãŒãããšãŠãçŽæçã«å®çŸ©ããæ¹æ³ããããŸããããã«ãããéåžžã®ãã·ãŒã±ã³ã·ã£ã«ããªã³ãŒãã®ããã«æžããŠãé©åãªã¿ã€ãã³ã°ã§ãåŸ
ã¡ããè¡ã£ãŠãããŸãã
-çµæãè¿ãåã«åŸ
æ©ããå¿
èŠãããããããã®æ°ããPythonæ©èœããµããŒãããæäœãããå Žåã¯ã次ã®ããã«ã³ãŒãã£ã³ã°ã§ããŸãã
+çµæãè¿ãåã«åŸ
ã¡ãå¿
èŠã§ããããã®æ°ãã Python æ©èœããµããŒãããŠããæäœãããå Žåãæ¬¡ã®ããã«æžããŸãã
```Python
burgers = await get_burgers(2)
```
-ã\82«ã\82®ã\81¯ `await` ã\81§ã\81\99ã\80\82çµ\90Ê\9e\9cã\82\92 `burgers`ã\81«À¿\9dÃ¥Â\98ã\81\99ã\82\8bÃ¥\89\8dã\81«ã\80\81`get_burgers(2)`ã\81®å\87Šç\90\86ð\9f\95\99ã\81®å®\8c˼\86ã\82\92åŸ\85ã\81ۉ\8fžå¿\85ڊ\81ã\81\8cã\81\82ã\82\8bã\81\93ã\81šã\82\92Pythonã\81«ÀŒ\9dã\81\88ã\81Ÿã\81\99ã\80\82ã\81\93ã\82\8cã\81§Pythonã\81¯ã\80\81ã\81\9dã\81®é\96\93ã\81« (Ã¥\88¥ã\81®ã\83ªã\82¯ã\82šã\82¹ã\83\88ã\82\92Ã¥\8f\97À¿¡ã\81\99ã\82\8bã\81ªã\81©) Àœ\95ã\81\8bÀ»\96ã\81®ã\81\93ã\81šã\81\8cã\81§ã\81\8dã\82\8bð\9f\94\80â\8f¯ã\81\93ã\81šã\82\92ç\9fÂ¥ããŸãã
+ã\81\93ã\81\93ã\81§ã\81®é\8dµã\81¯ `await` ã\81§ã\81\99ã\80\82`burgers` ã\81«çµ\90Ê\9e\9cã\82\92À¿\9dÃ¥Â\98ã\81\99ã\82\8bÃ¥\89\8dã\81«ã\80\81`get_burgers(2)` ã\81\8cã\82\84ã\82\8bã\81¹ã\81\8dã\81\93ã\81šã\82\92çµ\82ã\81\88ã\82\8bã\81®ã\82\92 â\8fž åŸ\85ã\81€ ð\9f\95\99 ã\82\88ã\81\86ã\81« Python ã\81«ÀŒ\9dã\81\88ã\81Ÿã\81\99ã\80\82ã\81\93ã\82\8cã\81«ã\82\88ã\82\8a Python ã\81¯ã\80\81ã\81\9dã\81®é\96\93ã\81« (Ã¥\88¥ã\81®ã\83ªã\82¯ã\82šã\82¹ã\83\88ã\82\92Ã¥\8f\97ã\81\91Ã¥\8f\96ã\82\8bã\81ªã\81©) ã\81ȋ\81\8bã\81®ã\81\93ã\81šã\82\92 ð\9f\94\80 â\8f¯ ã\81§ã\81\8dã\82\8bã\81šå\88\86ã\81\8bããŸãã
-`await` ã\81\8cÊ©\9fÚ\83ϋ\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\81¯ã\80\81é\9d\9eÃ¥\90\8cÊ\9c\9fÃ¥\87Šç\90\86ã\82\92ã\82µã\83\9dã\83΋\83\88ã\81\99ã\82\8bé\96¢Ê\95°å\86\85ã\81«ã\81\82ã\82\8bå¿\85ڊ\81ã\81\8cã\81\82ã\82\8aã\81Ÿã\81\99ã\80\82ã\81\93ã\82\8cã\81¯ã\80\81`async def` ã\81§é\96¢Ê\95°ã\82\92宣ښ\80ã\81\99ã\82\8bã\81 ã\81\91ã\81§ã\82\88ã\81\84ã\81§ã:
+`await` ã\81\8cÊ©\9fÚ\83ϋ\81\99ã\82\8bã\81«ã\81¯ã\80\81ã\81\93ã\81®é\9d\9eÃ¥\90\8cÊ\9c\9fÊ\80§ã\82\92ã\82µã\83\9dã\83΋\83\88ã\81\99ã\82\8bé\96¢Ê\95°ã\81®å\86\85é\83šã\81§ã\81ªã\81\91ã\82\8cã\81°ã\81ªã\82\8aã\81Ÿã\81\9bã\82\93ã\80\82ã\81\9dã\81®ã\81\9fã\82\81ã\81«ã\81¯ `async def` ã\81§å®£Úš\80ã\81\97ã\81Ÿã:
```Python hl_lines="1"
async def get_burgers(number: int):
- # ãã³ããŒã¬ãŒãäœæããããã«éåæåŠçãå®è¡
+ # ãã³ããŒã¬ãŒãäœãããã«éåæã®åŠçãè¡ã
return burgers
```
-...`def` ã®ãããã«:
+...`def` ã®ä»£ããã«:
```Python hl_lines="2"
-# éåæã§ã¯ãªã
+# ããã¯éåæã§ã¯ãªã
def get_sequential_burgers(number: int):
- # ãã³ããŒã¬ãŒãäœæããããã«ã·ãŒã±ã³ã·ã£ã«ãªåŠçãå®è¡
+ # ãã³ããŒã¬ãŒãäœãããã«ã·ãŒã±ã³ã·ã£ã«ãªåŠçãè¡ã
return burgers
```
-`async def` ã䜿çšãããšãPythonã«ãã®é¢æ°å
ã§ `await` åŒ (ãã®é¢æ°ã®å®è¡ããäžæåæ¢âžãããçµæãæ»ããŸã§ä»ã®äœããå®è¡ðãã) ãèªèããªããã°ãªããªããšäŒããããšãã§ããŸãã
-`async def` 颿°ãåŒã³åºããšãã¯ããawaitãããªããã°ãªããŸããããããã£ãŠãããã¯æ©èœããŸãã:
+`async def` ã䜿ããšãPython ã¯ãã®é¢æ°å
ã§ `await` åŒã«æ³šæãã颿°ã®å®è¡ããäžæåæ¢ãâž ããŠã»ãã®ããšããã«è¡ã ðãæ»ã£ãŠããããšãã§ãããšåãããŸãã
+
+`async def` ãªé¢æ°ãåŒã¶ãšãã¯ãawaitãããªããã°ãªããŸããããããã£ãŠã次ã¯åããŸãã:
```Python
-# get_burgersã¯async defã§å®çŸ©ãããŠããã®ã§åäœããªã
+# åããŸãããget_burgers 㯠async def ã§å®çŸ©ãããŠããŸã
burgers = get_burgers(2)
```
---
-ã\81\97ã\81\9fã\81\8cã\81£ã\81Šã\80\81 `await` ã\81§å\91Œã\81³å\87ºã\81\99ã\81\93ã\81šã\81\8cã\81§ã\81\8dã\82\8bã\83©ã\82€ã\83\96ã\83©ã\83ªã\82\92Àœ¿ç\94šã\81\97ã\81Šã\81\84ã\82\8b堎å\90\88ã\81¯ã\80\81ʬ¡ã\81®ã\82\88ã\81\86ã\81« `async def` ã\82\92Àœ¿ç\94šã\81\97ã\81Šã\80\81ã\81\9dã\82\8cã\82\92Àœ¿ç\94šã\81\99ã\82\8b*path operation é\96¢Ê\95°*ã\82\92Àœ\9cÊ\88\90ã\81\99ã\82\8bå¿\85ڊ\81ã\81\8cã\81\82ã\82\8aã\81Ÿã\81\99:
+ã\81\9dã\81®ã\81\9fã\82\81ã\80\81`await` ã\81§å\91Œã\81¹ã\82\8bã\81šÚ¬³ã\81£ã\81Šã\81\84ã\82\8bã\83©ã\82€ã\83\96ã\83©ã\83ªã\82\92Àœ¿ã\81£ã\81Šã\81\84ã\82\8b堎å\90\88ã\81¯ã\80\81ã\81\9dã\82\8cã\82\92Àœ¿ã\81\86 *path operation é\96¢Ê\95°* ã\82\92 `async def` ã\81§Àœ\9cã\82\8bå¿\85ڊ\81ã\81\8cã\81\82ã\82\8aã\81Ÿã\81\99ã\80\82ÀŸ\8bã\81\88ã\81°:
```Python hl_lines="2-3"
@app.get('/burgers')
return burgers
```
-### ããçºå±çãªæè¡è©³çް
+### ããçºå±çãªæè¡è©³çް { #more-technical-details }
+
+`await` 㯠`async def` ã§å®çŸ©ããã颿°ã®å
éšã§ãã䜿ããªãããšã«æ°ã¥ãããããããŸããã
+
+åæã«ã`async def` ã§å®çŸ©ããã颿°ã¯ãawaitããããå¿
èŠããããŸããã€ãŸãã`async def` ãæã€é¢æ°ã¯ããã¯ã `async def` ã§å®çŸ©ããã颿°ã®å
éšããããåŒã¹ãŸããã
+
+ã§ã¯ããã¯ããªãšåµã®è©±ã®ããã«ãæåã® `async` 颿°ã¯ã©ãåŒã¶ã®ã§ããããïŒ
+
+**FastAPI** ã䜿ã£ãŠããå Žåã¯å¿é
ãããŸããããã®ãæåã®ã颿°ã¯ *path operation 颿°* ã§ãFastAPI ãé©åã«å®è¡ããŠãããŸãã
+
+ããããFastAPI ã䜿ããã« `async` / `await` ã䜿ãããå ŽåããããŸãã
-`await` 㯠`async def` ã§å®çŸ©ããã颿°å
ã§ã®ã¿äœ¿çšã§ããããšãããã£ãããšæããŸãã
+### èªåã§ async ã³ãŒããæžã { #write-your-own-async-code }
-ãããåæã«ã`async def` ã§å®çŸ©ããã颿°ã¯ãawaitããããå¿
èŠããããŸãããªã®ã§ã`async def` ãæã€é¢æ°ã¯ã`async def` ã§å®çŸ©ããã颿°å
ã§ã®ã¿åŒã³åºããŸãã
+Starlette (**FastAPI** ã) 㯠<a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a> ã®äžã«æ§ç¯ãããŠãããæšæºã©ã€ãã©ãªã® <a href="https://docs.python.org/3/library/asyncio-task.html" class="external-link" target="_blank">asyncio</a> ãš <a href="https://trio.readthedocs.io/en/stable/" class="external-link" target="_blank">Trio</a> ã®äž¡æ¹ã«å¯Ÿå¿ããŠããŸãã
-ã§ã¯ããã®ãã¯ããªãšåµã®åé¡ã«ã€ããŠãæåã® `async` 颿°ãã©ã®ããã«åŒã³åºãã®ã§ããããïŒ
+ç¹ã«ãããªãèªèº«ã®ã³ãŒãå
ã§ãããé«åºŠãªãã¿ãŒã³ãå¿
èŠãšããçºå±çãªäžŠè¡åŠçã®ãŠãŒã¹ã±ãŒã¹ã«å¯ŸããŠã<a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a> ãçŽæ¥äœ¿ããŸãã
-**FastAPI**ã䜿çšããŠããå Žåããã®ãæåã®ã颿°ã*path operation 颿°*ã§ãããFastAPIãæ£ããå®è¡ããæ¹æ³ãç¥ã£ãŠããã®ã§ãå¿é
ããå¿
èŠã¯ãããŸããã
+仮㫠FastAPI ã䜿ã£ãŠããªããŠãã<a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a> ã§ç¬èªã® async ã¢ããªã±ãŒã·ã§ã³ãæžãã°ãé«ãäºææ§ãšå©ç¹ (äŸ: æ§é åäžŠè¡æ§) ãåŸãããŸãã
-ããããFastAPI以å€ã§ `async` / `await` ã䜿çšãããå Žåã¯ã<a href="https://docs.python.org/3/library/asyncio-task.html#coroutine" class="external-link" target="_blank">å
¬åŒPythonããã¥ã¡ã³ããåç
§ããŠäžãã</a>ã
+ç§ã¯ AnyIO ã®äžã«èãå±€ãšããŠãåæ³šéãå°ãæ¹åããããè¯ã**è£å®**ã**ã€ã³ã©ã€ã³ãšã©ãŒ**ãªã©ãåŸãããã®å¥ã©ã€ãã©ãªãäœããŸããããŸãã**çè§£**ããŠ**èªåã§ async ã³ãŒããæžã**ã®ã«åœ¹ç«ã€ãã¬ã³ããªãŒãªã€ã³ãã/ãã¥ãŒããªã¢ã«ããããŸã: <a href="https://asyncer.tiangolo.com/" class="external-link" target="_blank">Asyncer</a>ãç¹ã«ã**async ã³ãŒããšéåžžã®** (ããããã³ã°/åæ) **ã³ãŒããçµã¿åããã**å¿
èŠãããå Žåã«æçšã§ãã
-### éåæã³ãŒãã®ä»ã®åœ¢åŒ
+### éåæã³ãŒãã®ä»ã®åœ¢åŒ { #other-forms-of-asynchronous-code }
-`async` ãš `await` ã䜿çšããã¹ã¿ã€ã«ã¯ããã®èšèªã§ã¯æ¯èŒçæ°ãããã®ã§ãã
+`async` ãš `await` ã䜿ããã®ã¹ã¿ã€ã«ã¯ãèšèªãšããŠã¯æ¯èŒçæ°ãããã®ã§ãã
-éåæã³ãŒãã®æäœãã¯ããã«ç°¡åã«ãªããŸãã
+ããããããã«ããéåæã³ãŒãã®åãæ±ãã¯å€§å¹
ã«ç°¡åã«ãªããŸãã
-ç䟡㪠(ãŸãã¯ã»ãšãã©åäžã®) æ§æããæè¿ã®ããŒãžã§ã³ã®JavaScript (ãã©ãŠã¶ããã³NodeJS) ã«ãæè¿çµã¿èŸŒãŸããŸããã
+åç (ã»ãŒåäž) ã®æ§æãæè¿ã® JavaScript (ãã©ãŠã¶ãš NodeJS) ã«ãå°å
¥ãããŸããã
-ã\81\97ã\81\8bã\81\97ã\80\81ã\81\9dã\81®å\89\8dã\81¯ã\80\81é\9d\9eÃ¥\90\8cÊ\9c\9fã\82³ã\83΋\83\89ã\81®å\87Šç\90\86ã¯ããªãè€éã§é£è§£ã§ããã
+ã\81\9dã\82\8cÀ»¥å\89\8dã\81¯ã\80\81é\9d\9eÃ¥\90\8cÊ\9c\9fã\82³ã\83΋\83\89ã\81®Ê\89±ã\81\84ã¯ããªãè€éã§é£è§£ã§ããã
-以åã®ããŒãžã§ã³ã®Pythonã§ã¯ãã¹ã¬ããã<a href="https://www.gevent.org/" class="external-link" target="_blank">Gevent</a>ãå©çšã§ããŸãããããããã³ãŒãã¯çè§£ããããã¯ããããŠãèå¯ãã¯ããã«è€éã§ãã
+以åã® Python ã§ã¯ã¹ã¬ããã <a href="https://www.gevent.org/" class="external-link" target="_blank">Gevent</a> ã䜿ããŸããããã³ãŒãã®çè§£ã»ãããã°ã»æèãã¯ããã«é£ãããªããŸãã
-以åã®ããŒãžã§ã³ã®NodeJS / ãã©ãŠã¶JavaScriptã§ã¯ããã³ãŒã«ããã¯ãã䜿çšããŠããŸãããããã¯ããã³ãŒã«ããã¯å°çãã«ã€ãªãããŸãã
+以åã® NodeJS / ãã©ãŠã¶ JavaScript ã§ã¯ãã³ãŒã«ããã¯ãã䜿ã£ãŠããããã³ãŒã«ããã¯å°çããæããŸããã
-## ã³ã«ãŒãã³
+## ã³ã«ãŒãã³ { #coroutines }
-**ã\82³ã\83«ã\83΋\83\81ã\83³**ã\81¯ã\80\81`async def` é\96¢Ê\95°ã\81«ã\82\88ã\81£ã\81ŠÚ¿\94ã\81\95ã\82\8cã\82\8bã\82\82ã\81®ã\82\92Ê\8c\87ã\81\99é\9d\9e垞ã\81«ÊŽ\92Ú\90ϋ\81\9fç\94šÚª\9eã\81§ã\81\99ã\80\82ã\81\93ã\82\8cã\81¯ã\80\81é\96\8bå§\8bã\81§ã\81\8dã\81Šã\80\81ã\81\84ã\81ۋ\81\8bçµ\82˼\86ã\81\99ã\82\8bé\96¢Ê\95°ã\81®ã\82\88ã\81\86ã\81ªã\82\82ã\81®ã\81§ã\81\82ã\82\8bã\81\8cã\80\81Ã¥\86\85é\83šã\81« `await` ã\81\8cã\81\82ã\82\8bã\81šã\81\8dã\81¯å\86\85é\83šç\9a\84ã\81«Àž\80Ê\99\82Ã¥\81\9cÊ¢â\8fžã\81\95ã\82\8cã\82\8bã\81\93ã\81šã\82\82ã\81\82ã\82\8bã\82\82ã\81®ã\81 ã\81šPythonã\81¯Úª\8dÚÂ\98ã\81\97ã\81Šã\81\84ãŸãã
+**ã\82³ã\83«ã\83΋\83\81ã\83³**ã\81¯ã\80\81`async def` é\96¢Ê\95°ã\81\8cÚ¿\94ã\81\99ã\82\82ã\81®ã\82\92Ê\8c\87ã\81\99ã\80\81ã\81¡ã\82\87ã\81£ã\81šÊŽ\92Ú\90ϋ\81\9fç\94šÚª\9eã\81§ã\81\99ã\80\82Python ã\81¯ã\81\9dã\82\8cã\82\92ã\80\81é\96\8bå§\8bã\81§ã\81\8dã\81Šã\81\84ã\81ۋ\81\8bçµ\82˼\86ã\81\99ã\82\8bé\96¢Ê\95°ã\81®ã\82\88ã\81\86ã\81ªã\82\82ã\81®ã\81šã\81\97ã\81ŠÊ\89±ã\81\84ã\81Ÿã\81\99ã\81\8cã\80\81Ã¥\86\85é\83šã\81« `await` ã\81\8cã\81\82ã\82\8bã\81\9fã\81³ã\81«å\86\85é\83šç\9a\84ã\81«Àž\80Ê\99\82Ã¥\81\9cÊ¢ â\8fž ã\81\99ã\82\8bã\81\8bã\82\82ã\81\97ã\82\8cã\81ªã\81\84ã\82\82ã\81®ã\81šã\81\97ã\81ŠÚª\8dÚÂ\98ã\81\97ãŸãã
-`async` ã\81š `await` ã\82\92ç\94šã\81\84ã\81\9fé\9d\9eÃ¥\90\8cÊ\9c\9fã\82³ã\83΋\83\89ã\82\92Àœ¿ç\94šã\81\99ã\82\8bã\81\99ã\81¹ã\81Šã\81®Ê©\9fÚ\83ϋ\81¯ã\80\81ã\80\8cã\82³ã\83«ã\83΋\83\81ã\83³ã\80\8dã\82\92Àœ¿ç\94šã\81\99ã\82\8bã\82\82ã\81®ã\81šã\81\97ã\81ŠÀœ\95床ã\82\82ã\81Ÿã\81šã\82\81ã\82\89ã\82\8cã\81Šã\81\84ã\81Ÿã\81\99ã\80\82Goã\81®Àž»ÚŠ\81Ê©\9fÚ\83ϋ\81§ã\81\82ã\82\8bã\80\8cã\82Žã\83«ã\83΋\83\81ã\83³ãã«çžåœããŸãã
+`async` ã\81š `await` ã\82\92ç\94šã\81\84ã\81\9fé\9d\9eÃ¥\90\8cÊ\9c\9fã\82³ã\83΋\83\89ã\81®Ê©\9fÚ\83ό\85šÀœ\93ã\81¯ã\80\81ã\81\97ã\81°ã\81\97ã\81°ã\80\8cã\82³ã\83«ã\83΋\83\81ã\83³ã\82\92Àœ¿ã\81\86ã\80\8dã\81šÚŠ\81çŽ\84ã\81\95ã\82\8cã\81Ÿã\81\99ã\80\82ã\81\93ã\82\8cã\81¯ Go ã\81®Àž»ÚŠ\81Ê©\9fÚ\83ϋ\80\8cGoroutinesãã«çžåœããŸãã
-## ãŸãšã
+## ãŸãšã { #conclusion }
-äžè¿°ãããã¬ãŒãºãèŠãŠã¿ãŸããã:
+äžã®ãã¬ãŒãºãããäžåºŠèŠãŠã¿ãŸããã:
-> çŸä»£çã®Pythonã¯ã**éåæã³ãŒã**ãããã**ã³ã«ãŒãã³**ããšç§°ããããã®ãå©çšããŠãµããŒãããŠããŸãããã㯠**`async` ãš `await`** æ§æãçšããŸãã
+> ã¢ãã³ãª Python 㯠**ãéåæã³ãŒãã** ã **ãã³ã«ãŒãã³ã** ãšåŒã°ããä»çµã¿ã§ãµããŒãããŠãããæ§æã¯ **`async` ãš `await`** ã§ãã
-À»\8aã\81§ã\81¯ã\80\81ã\81\93ã\81®Ê\84\8fÃ¥\91³ã\81\8cã\82\88ã\82\8aç\90\86򤣋\81§ã\81\8dãã¯ãã§ããâš
+À»\8aã\81ªã\82\89ã\80\81ã\82\88ã\82\8aÊ\84\8fÃ¥\91³ã\81\8cÃ¥\88\86ã\81\8bãã¯ãã§ããâš
-(Starletteãä»ããŠ) FastAPIã«åãäžããŠãå°è±¡çãªããã©ãŒãã³ã¹ãå®çŸããŠãããã®ã¯ããããã¹ãŠã§ãã
+ããããã¹ãŠã (Starlette ãéããŠ) FastAPI ãæ¯ããå°è±¡çãªããã©ãŒãã³ã¹ãå®çŸããŠããŸãã
-## éåžžã«çºå±çãªæè¡ç詳现
+## éåžžã«çºå±çãªæè¡ç詳现 { #very-technical-details }
/// warning | 泚æ
-æããã¹ãããããŠãè¯ãã§ãããã
+ããããèªã¿é£ã°ããŠã倧äžå€«ã§ãã
-ã\81\93ã\81®é\83šå\88\86ã\81¯**FastAPI**ã\81®À»\95çµ\84ã\81¿ã\81«é\96¢ã\81\99ã\82\8bé\9d\9e垞ã\81«æè¡çãªè©³çްã§ãã
+ã\81\93ã\82\8cã\81¯ **FastAPI** ã\81®å\86\85é\83šå\8b\95Àœ\9cã\81«é\96¢ã\81\99ã\82\8bã\80\81ã\81šã\81Šã\82\82æè¡çãªè©³çްã§ãã
-ããªãã®æè¡ç¥è (ã³ã«ãŒãã³ãã¹ã¬ãããããããã³ã°ãªã©) ããããFastAPIã `async def` ãšéåžžã® `def` ãã©ã®ããã«åŠçãããç¥ãããå Žåã¯ãå
ã«é²ãã§ãã ããã
+(ã³ã«ãŒãã³ãã¹ã¬ãããããããã³ã°çã®) æè¡ç¥èããããFastAPI ã `async def` ãšéåžžã® `def` ãã©ãæ±ããã«èå³ãããå Žåã¯ãèªã¿é²ããŠãã ããã
///
-### Path operation 颿°
+### Path operation 颿° { #path-operation-functions }
-*path operation 颿°*ã `async def` ã®ä»£ããã«éåžžã® `def` ã§å®£èšãããšã(ãµãŒããŒããããã¯ããã®ã§) çŽæ¥åŒã³åºã代ããã«å€éšã¹ã¬ããããŒã« (awaitããã) ã§å®è¡ãããŸãã
+*path operation 颿°* ã `async def` ã§ã¯ãªãéåžžã® `def` ã§å®£èšããå Žåã(ãµãŒãããããã¯ããŠããŸããã) çŽæ¥åŒã³åºãããã®ã§ã¯ãªããå€éšã®ã¹ã¬ããããŒã«ã§å®è¡ããããããåŸ
æ©ããŸãã
-Àž\8aښ\98ã\81®Ê\96¹Ê³\95ã\81šé\81\95ã\81£ã\81\9fÊ\96¹Ê³\95ã\81®å\88¥ã\81®é\9d\9eÃ¥\90\8cÊ\9c\9fã\83\95ã\83‹\83΋\83 ã\83¯ã\83΋\82¯ã\81\8bã\82\89Ê\9d¥ã\81Šã\81\8aã\82\8aã\80\81å°\8fã\81\95ã\81ªã\83\91ã\83\95ã\82©ã\83΋\83\9eã\83³ã\82¹å\90\91Àž\8a (çŽ\84100ã\83\8aã\83\8eç§\92) ã\81®ã\81\9fã\82\81ã\81«é\80\9a垞ã\81® `def` ã\82\92Àœ¿ç\94šã\81\97ã\81ŠÀº\9b现ã\81ªÊŒ\94ç®\97ã\81®ã\81¿Ú¡\8cã\81\86 *path operation é\96¢Ê\95°* ã\82\92å®\9a矩ã\81\99ã\82\8bã\81®ã\81«Ê\85£ã\82\8cã\81Šã\81\84ã\82\8b堎å\90\88ã\81¯ã\80\81**FastAPI**ã\81§ã\81¯ã\81Ÿã\81£ã\81\9fã\81\8fé\80\86ã\81®å\8a¹Ê\9e\9cã\81«ã\81ªã\82\8bã\81\93ã\81šã\81«Ê³šÊ\84\8fã\81\97ã\81Šã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\81\93ã\81®ã\82\88ã\81\86ã\81ªå Žå\90\88ã\80\81*path operation é\96¢Ê\95°* ã\81\8cã\83\96ã\83Âã\83\83ã\82Âã\83³ã\82°<abbr title="Ã¥\85¥å\8a\9b/Ã¥\87ºå\8a\9b: ã\83\87ã\82£ã\82¹ã\82¯ã\81®ÚªÂã\81¿å\8f\96ã\82\8aã\81Ÿã\81\9fã\81¯Ê\9bžã\81\8dڟŒã\81¿ã\80\81ã\83\8dã\83\83ã\83\88ã\83¯ã\83΋\82¯é\80\9aÀ¿¡ã\80\82">I/O</abbr>ã\82\92å®\9fÚ¡\8cã\81\97ã\81ªã\81\84ã\81®ã\81§ã\81\82ã\82\8cã\81°ã\80\81`async def` ã\81®Àœ¿ç\94šã\82\92ã\81\8aÃ¥\8b§ã\82\81ã\81\97ã\81Ÿãã
+Àž\8aښ\98ã\81šã\81¯ç\95°ã\81ªã\82\8bÃ¥\8b\95Àœ\9cã\81®å\88¥ã\81®é\9d\9eÃ¥\90\8cÊ\9c\9fã\83\95ã\83‹\83΋\83 ã\83¯ã\83΋\82¯ã\81\8bã\82\89Ê\9d¥ã\81Šã\81\8aã\82\8aã\80\81ã\81ȋ\82\93ã\81®ã\82\8fã\81\9aã\81\8bã\81ªã\83\91ã\83\95ã\82©ã\83΋\83\9eã\83³ã\82¹å\90\91Àž\8a (çŽ\84 100 ã\83\8aã\83\8eç§\92) ã\82\92ç\8b\99ã\81£ã\81Šã\80\81ښ\88ç®\97ã\81®ã\81¿ã\81®Àº\9b现ã\81ª *path operation é\96¢Ê\95°* ã\82\92玠ã\81® `def` ã\81§å®\9a矩ã\81\99ã\82\8bã\81\93ã\81šã\81«Ê\85£ã\82\8cã\81Šã\81\84ã\82\8b堎å\90\88ã\80\81**FastAPI** ã\81§ã\81¯å\8a¹Ê\9e\9cã\81\8cã\81Ÿã\81£ã\81\9fã\81\8fé\80\86ã\81«ã\81ªã\82\8bç\82¹ã\81«Ê³šÊ\84\8fã\81\97ã\81Šã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\81\93ã\82\8cã\82\89ã\81®å Žå\90\88ã\80\81*path operation é\96¢Ê\95°* ã\81\8cã\83\96ã\83Âã\83\83ã\82Âã\83³ã\82°ã\81ª <abbr title="Input/Output - Ã¥\85¥å\87ºå\8a\9b: ã\83\87ã\82£ã\82¹ã\82¯ã\81®ÚªÂã\81¿å\8f\96ã\82\8aã\81Ÿã\81\9fã\81¯Ê\9bžã\81\8dڟŒã\81¿ã\80\81ã\83\8dã\83\83ã\83\88ã\83¯ã\83΋\82¯é\80\9aÀ¿¡ã\80\82">I/O</abbr> ã\82\92Ú¡\8cã\81\86ã\82³ã\83΋\83\89ã\82\92Àœ¿ã\81£ã\81Šã\81\84ã\81ªã\81\84é\99\90ã\82\8aã\80\81`async def` ã\82\92Àœ¿ã\81£ã\81\9fÊ\96¹ã\81\8cÚ\89¯ã\81\84ã\81§ãã
-ããã§ããã©ã¡ãã®ç¶æ³ã§ãã**FastAPI**ãéå»ã®ãã¬ãŒã ã¯ãŒã¯ããã (ãŸãã¯ããã«å¹æµããã»ã©) [é«éã«ãªã](index.md#_10){.internal-link target=_blank}å¯èœæ§ããããŸãã
+ããã§ããã©ã¡ãã®ç¶æ³ã§ãã**FastAPI** ã¯ããªãã以å䜿ã£ãŠãããã¬ãŒã ã¯ãŒã¯ããã (å°ãªããšãåçã«) [é«éã§ãã](index.md#performance){.internal-link target=_blank} å¯èœæ§ãé«ãã§ãã
-### äŸåé¢ä¿
+### äŸåé¢ä¿ { #dependencies }
-äŸåé¢ä¿ã«ã€ããŠãåæ§ã§ããäŸåé¢ä¿ã `async def` ã§ã¯ãªãæšæºã® `def` 颿°ã§ããå Žåãå€éšã¹ã¬ããããŒã«ã§å®è¡ãããŸãã
+[äŸåé¢ä¿](tutorial/dependencies/index.md){.internal-link target=_blank} ã«ã€ããŠãåæ§ã§ããäŸåé¢ä¿ã `async def` ã§ã¯ãªãæšæºã® `def` 颿°ã§ããå Žåãå€éšã®ã¹ã¬ããããŒã«ã§å®è¡ãããŸãã
-### ãµãäŸåé¢ä¿
+### ãµãäŸåé¢ä¿ { #sub-dependencies }
-(颿°å®çŸ©ã®ãã©ã¡ãŒã¿ãŒãšããŠ) çžäºã«å¿
èŠãªè€æ°ã®äŸåé¢ä¿ãšãµãäŸåé¢ä¿ãèšå®ã§ããŸããäžéšã¯ `async def` ã§äœæãããä»ã®äžéšã¯éåžžã® `def` ã§äœæãããŸããããã§ãåäœããéåžžã® `def`ã§äœæããããã®ã¯ããawaitãããã代ããã« (ã¹ã¬ããããŒã«ãã) å€éšã¹ã¬ããã§åŒã³åºãããŸãã
+è€æ°ã®äŸåé¢ä¿ã [ãµãäŸåé¢ä¿](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} ã (颿°å®çŸ©ã®ãã©ã¡ãŒã¿ãšããŠ) çžäºã«èŠæ±ãããããŸãããã®äžéšã¯ `async def`ãä»ã¯éåžžã® `def` ã§äœãããŠããŠãåäœããŸããéåžžã® `def` ã§äœããããã®ã¯ãawaitãããã代ããã«ãå€éšã¹ã¬ããããŒã«ããã¹ã¬ããäžã§åŒã³åºãããŸãã
-### ãã®ä»ã®ãŠãŒãã£ãªãã£é¢æ°
+### ãã®ä»ã®ãŠãŒãã£ãªãã£é¢æ° { #other-utility-functions }
-ããªããçŽæ¥åŒã³åºããŠãŒãã£ãªãã£é¢æ°ã¯éåžžã® `def` ãŸã㯠`async def` ã§äœæã§ããFastAPIã¯åŒã³åºãæ¹æ³ã«åœ±é¿ãäžããŸããã
+ããªããçŽæ¥åŒã³åºããŠãŒãã£ãªãã£é¢æ°ã¯ãéåžžã® `def` ã§ã `async def` ã§ãæ§ããŸãããFastAPI ã¯ãã®åŒã³åºãæ¹ã«åœ±é¿ãäžããŸããã
-ããã¯ãFastAPIãåŒã³åºã颿°ãšå¯Ÿç
§çã§ã: *path operation 颿°*ãšäŸåé¢ä¿ã
+ããã¯ãFastAPI ãããªãã®ä»£ããã«åŒã³åºã颿° (ããªãã¡ *path operation 颿°* ãšäŸåé¢ä¿) ãšã¯å¯Ÿç
§çã§ãã
-ã\83Šã\83΋\83\86ã\82£ã\83ªã\83\86ã\82£é\96¢Ê\95°ã\81\8c `def` ã\82\92Àœ¿ç\94šã\81\97ã\81\9fé\80\9a垞ã\81®é\96¢Ê\95°ã\81§ã\81\82ã\82\8b堎å\90\88ã\80\81ã\82¹ã\83‹\83\83ã\83\89ã\83\97ã\83΋\83«ã\81§ã\81¯ã\81ªã\81\8fç\9bŽÊ\8eÂ¥ (ã\82³ã\83΋\83\89ã\81§Úš\98Ú¿°ã\81\97ã\81\9fã\81šã\81\8aã\82\8aã\81«) Ã¥\91΋\81³å\87ºã\81\95ã\82\8cã\81Ÿã\81\99ã\80\82é\96¢Ê\95°ã\81\8c `async def` ã\82\92Àœ¿ç\94šã\81\97ã\81ŠÀœ\9cÊ\88\90ã\81\95ã\82\8cã\81Šã\81\84ã\82\8b堎å\90\88ã\81¯ã\80\81Ã¥\91΋\81³å\87ºã\81\99é\9a\9bã\81« `await` ã\81\99ã\82\8bå¿\85ڊ\81ã\81\8cã\81\82ã\82\8aã\81Ÿãã
+ã\83Šã\83΋\83\86ã\82£ã\83ªã\83\86ã\82£é\96¢Ê\95°ã\81\8c `def` ã\81®é\80\9a垞é\96¢Ê\95°ã\81§ã\81\82ã\82\8cã\81°ã\80\81(ã\81\82ã\81ªã\81\9fã\81®ã\82³ã\83΋\83\89ã\81«Ê\9bžã\81\84ã\81\9fã\81šã\81\8aã\82\8aã\81«) ç\9bŽÊ\8e¥å\91΋\81³å\87ºã\81\95ã\82\8cã\80\81ã\82¹ã\83‹\83\83ã\83\89ã\83\97ã\83΋\83«ã\81§ã\81¯å®\9fÚ¡\8cã\81\95ã\82\8cã\81Ÿã\81\9bã\82\93ã\80\82é\96¢Ê\95°ã\81\8c `async def` ã\81§Àœ\9cã\82\89ã\82\8cã\81Šã\81\84ã\82\8b堎å\90\88ã\81¯ã\80\81ã\81\9dã\81®é\96¢Ê\95°ã\82\92Ã¥\91΋\81¶ã\81šã\81\8dã\81« `await` ã\81\99ã\81¹ã\81\8dã\81§ãã
---
-ç¹°ã\82\8aÚ¿\94ã\81\97ã\81«ã\81ªã\82\8aã\81Ÿã\81\99ã\81\8cã\80\81ã\81\93ã\82\8cã\82\89ã\81¯é\9d\9e垞ã\81«Ê\8a\80Ú¡\93ç\9a\84ã\81ªÚ©³çްã\81§ã\81\82ã\82\8aã\80\81ʀ\9c玢ã\81\97ã\81ŠÚŸ¿ã\82\8aç\9d\80ã\81\84ã\81\9f堎å\90\88ã¯åœ¹ç«ã€ã§ãããã
+ç¹°ã\82\8aÚ¿\94ã\81\97ã\81«ã\81ªã\82\8aã\81Ÿã\81\99ã\81\8cã\80\81ã\81\93ã\82\8cã\82\89ã\81¯é\9d\9e垞ã\81«Ê\8a\80Ú¡\93ç\9a\84ã\81ªÚ©³çްã\81§ã\80\81Ú©²åœ\93˼\8bé \85ã\82\92ʀ\9c玢ã\81\97ã\81Šã\81\93ã\81\93ã\81«ã\81\9fã\81©ã\82\8aç\9d\80ã\81\84ã\81\9f堎å\90\88ã\81«ã¯åœ¹ç«ã€ã§ãããã
-ãã以å€ã®å Žåã¯ãäžèšã®ã»ã¯ã·ã§ã³ã®ã¬ã€ãã©ã€ã³ã§åé¡ãªãã¯ãã§ã: <a href="#_1">æ¥ãã§ããŸããïŒ</a>ã
+ãã以å€ã®å Žåã¯ãäžã®ã»ã¯ã·ã§ã³ã®ã¬ã€ãã©ã€ã³ã«åŸãã°ååã§ã: <a href="#in-a-hurry">æ¥ãã§ããŸããïŒ</a>ã
--- /dev/null
+# ã¯ã©ãŠããããã€ããžã® FastAPI ããã〠{ #deploy-fastapi-on-cloud-providers }
+
+FastAPI ã¢ããªã±ãŒã·ã§ã³ã¯ãå®è³ªçã«ã©ã®ãããªã¯ã©ãŠããããã€ãã§ããããã€ã§ããŸãã
+
+å€ãã®å Žåãäž»èŠãªã¯ã©ãŠããããã€ã㯠FastAPI ããããã€ããããã®ã¬ã€ããæäŸããŠããŸãã
+
+## FastAPI Cloud { #fastapi-cloud }
+
+**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** ã¯ã**FastAPI** ã®äœè
ãšåãããŒã ã«ãã£ãŠäœãããŠããŸãã
+
+API ã®**æ§ç¯**ã**ãããã€**ã**ã¢ã¯ã»ã¹**ãŸã§ã®ããã»ã¹ããæå°éã®æéã§å¹çåããŸãã
+
+FastAPI ã§ã¢ããªãéçºãããšããšåã**éçºè
äœéš**ããã¯ã©ãŠããžã®**ãããã€**ã«ããããããŸããð
+
+FastAPI Cloud ã¯ã*FastAPI and friends* ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®äž»èŠãªã¹ãã³ãµãŒãã€è³éæäŸå
ã§ããâš
+
+## ã¯ã©ãŠããããã€ã - ã¹ãã³ãµãŒ { #cloud-providers-sponsors }
+
+ä»ã«ãããã€ãã®ã¯ã©ãŠããããã€ãã âš [**FastAPI ãã¹ãã³ãµãŒããŠããŸã**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} âšãð
+
+ãããã®ã¬ã€ããåèã«ãããµãŒãã¹ã詊ããŠã¿ãã®ãããã§ããã:
+
+* <a href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" class="external-link" target="_blank">Render</a>
+* <a href="https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi" class="external-link" target="_blank">Railway</a>
## ã»ãã¥ãªã㣠- HTTPS { #security-https }
-<!-- NOTE: https.md written in Japanese does not exist, so it redirects to English one -->
[åãã£ãã¿ãŒã®HTTPSã«ã€ããŠ](https.md){.internal-link target=_blank}ã§ã¯ãHTTPSãã©ã®ããã«APIãæå·åããã®ãã«ã€ããŠåŠã³ãŸããã
éåžžãã¢ããªã±ãŒã·ã§ã³ãµãŒãã«ãšã£ãŠ**å€éšã®**ã³ã³ããŒãã³ãã§ãã**TLS Termination Proxy**ã«ãã£ãŠæäŸãããããšãäžè¬çã§ãããã®ãããã·ã¯éä¿¡ã®æå·åãæ
åœããŸãã
åãAPIããã°ã©ã ã®**è€æ°ã®ããã»ã¹**ãå®è¡ããå Žåããããã¯äžè¬çã«**WorkerïŒã¯ãŒã«ãŒ**ãšåŒã°ããŸãã
### ã¯ãŒã«ãŒã»ããã»ã¹ ãš ããŒã { #worker-processes-and-ports }
-<!-- NOTE: https.md written in Japanese does not exist, so it redirects to English one -->
[HTTPSã«ã€ããŠ](https.md){.internal-link target=_blank}ã®ããã¥ã¡ã³ãã§ã1ã€ã®ãµãŒããŒã§1ã€ã®ããŒããšIPã¢ãã¬ã¹ã®çµã¿åããã§ãªãã¹ã³ã§ããã®ã¯1ã€ã®ããã»ã¹ã ãã§ããããšãèŠããŠããŸãã§ããããïŒ
<summary>Dockerfile Preview ð</summary>
```Dockerfile
-FROM python:3.9
+FROM python:3.14
WORKDIR /code
```{ .dockerfile .annotate }
# (1)!
-FROM python:3.9
+FROM python:3.14
# (2)!
WORKDIR /code
ããããã°ã`Dockerfile`ã®äžã«ãã¡ã€ã«ãã³ããŒããããã«ã察å¿ãããã¹ã倿Žããã ãã§ããã§ãïŒ
```{ .dockerfile .annotate hl_lines="10 13" }
-FROM python:3.9
+FROM python:3.14
WORKDIR /code
## ã¬ããªã±ãŒã·ã§ã³ - ããã»ã¹æ° { #replication-number-of-processes }
-**Kubernetes** ã Docker Swarm ã¢ãŒããNomadããããã¯è€æ°ã®ãã·ã³äžã§åæ£ã³ã³ããã管çããããã®åæ§ã®è€éãªã·ã¹ãã ã䜿ã£ãŠãã·ã³ã®<abbr title="A group of machines that are configured to be connected and work together in some way. - ããæ¹æ³ã§æ¥ç¶ããã飿ºããŠåäœããããã«æ§æããããã·ã³ã®éãŸã">cluster</abbr>ãæ§æããŠããå Žåã åã³ã³ããã§ïŒWorkerãæã€Uvicornã®ãããªïŒ**ããã»ã¹ãããŒãžã£**ã䜿çšãã代ããã«ã**ã¯ã©ã¹ã¿ãŒã»ã¬ãã«**ã§**ã¬ããªã±ãŒã·ã§ã³**ãåŠçããããšæãã§ãããã
+**Kubernetes** ã Docker Swarm ã¢ãŒããNomadããããã¯è€æ°ã®ãã·ã³äžã§åæ£ã³ã³ããã管çããããã®åæ§ã®è€éãªã·ã¹ãã ã䜿ã£ãŠãã·ã³ã®<dfn title="ããæ¹æ³ã§æ¥ç¶ããã飿ºããŠåäœããããã«æ§æããããã·ã³ã®éãŸã">ã¯ã©ã¹ã¿</dfn>ãæ§æããŠããå Žåã åã³ã³ããã§ïŒWorkerãæã€Uvicornã®ãããªïŒ**ããã»ã¹ãããŒãžã£**ã䜿çšãã代ããã«ã**ã¯ã©ã¹ã¿ãŒã»ã¬ãã«**ã§**ã¬ããªã±ãŒã·ã§ã³**ãåŠçããããšæãã§ãããã
Kubernetesã®ãããªåæ£ã³ã³ãã管çã·ã¹ãã ã®1ã€ã¯éåžžãå
¥ã£ãŠãããªã¯ãšã¹ãã®**ããŒããã©ã³ã·ã³ã°**ããµããŒãããªããã**ã³ã³ããã®ã¬ããªã±ãŒã·ã§ã³**ãåŠçããçµ±åãããæ¹æ³ãæã£ãŠããŸãããã®ããšã¯ãã¹ãŠ**ã¯ã©ã¹ã¿ã¬ãã«**ã«ãŠã§ãã
ãã®ãããªå Žåã`--workers` ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ã䜿ã£ãŠãå®è¡ãããã¯ãŒã«ãŒæ°ãèšå®ã§ããŸãïŒ
```{ .dockerfile .annotate }
-FROM python:3.9
+FROM python:3.14
WORKDIR /code
--- /dev/null
+# FastAPI Cloud { #fastapi-cloud }
+
+<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a> ã« **ã³ãã³ã1ã€** ã§ãããã€ã§ããŸãããŸã ãªããŠã§ã€ãã£ã³ã°ãªã¹ãã«ãç»é²ãã ãããð
+
+## ãã°ã€ã³ { #login }
+
+ãã§ã« **FastAPI Cloud** ã¢ã«ãŠã³ãããæã¡ã§ããããšã確èªããŠãã ããïŒãŠã§ã€ãã£ã³ã°ãªã¹ããããæåŸ
ããŠããŸã ðïŒã
+
+次ã«ãã°ã€ã³ããŸã:
+
+<div class="termy">
+
+```console
+$ fastapi login
+
+You are logged in to FastAPI Cloud ð
+```
+
+</div>
+
+## ããã〠{ #deploy }
+
+ã§ã¯ã**ã³ãã³ã1ã€** ã§ã¢ããªããããã€ããŸã:
+
+<div class="termy">
+
+```console
+$ fastapi deploy
+
+Deploying to FastAPI Cloud...
+
+â
Deployment successful!
+
+ð Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev
+```
+
+</div>
+
+以äžã§ãïŒãã® URL ããã¢ããªã«ã¢ã¯ã»ã¹ã§ããŸããâš
+
+## FastAPI Cloud ã«ã€ã㊠{ #about-fastapi-cloud }
+
+**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** ã¯ã**FastAPI** ã®äœè
ãšããŒã ã«ãã£ãŠéçºãããŠããŸãã
+
+æå°éã®æéã§ API ã**æ§ç¯**ã»**ãããã€**ã»**å©çš**ã§ããããã«å·¥çšãç°¡çŽ åããŸãã
+
+FastAPI ã§ã®éçºãšåã**éçºè
äœéš**ããã¯ã©ãŠããžã®**ãããã€**ã«ããããããŸããð
+
+ããã«ãã¢ããªã®ãããã€æã«å¿
èŠãšãªãå€ãã®äºé
ãä»»ããããŸããäŸãã°:
+
+* HTTPS
+* ã¬ããªã±ãŒã·ã§ã³ïŒãªã¯ãšã¹ãã«åºã¥ããªãŒãã¹ã±ãŒãªã³ã°ä»ãïŒ
+* ãªã©
+
+FastAPI Cloud ã¯ã*FastAPI and friends* ã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã«å¯Ÿããäž»èŠã¹ãã³ãµãŒãã€è³éæäŸå
ã§ããâš
+
+## ä»ã®ã¯ã©ãŠããããã€ããŒãžã®ããã〠{ #deploy-to-other-cloud-providers }
+
+FastAPI ã¯ãªãŒãã³ãœãŒã¹ã§æšæºã«åºã¥ããŠããŸããã奜ã¿ã®ä»»æã®ã¯ã©ãŠããããã€ããŒã« FastAPI ã¢ããªããããã€ã§ããŸãã
+
+åã¯ã©ãŠããããã€ããŒã®ã¬ã€ãã«åŸã£ãŠ FastAPI ã¢ããªããããã€ããŠãã ãããð€
+
+## èªåã®ãµãŒããŒãžã®ããã〠{ #deploy-your-own-server }
+
+ãã®**ãããã€**ã¬ã€ãã®åŸåã§ã¯è©³çްã解説ããŸããäœãèµ·ããŠããã®ããäœãå¿
èŠãªã®ãããããŠèªåã®ãµãŒããŒãå«ã㊠FastAPI ã¢ããªãèªåã§ãããã€ããæ¹æ³ãåããããã«ãªããŸããð€
* **ããã©ã«ãã§ã¯**ã**IPã¢ãã¬ã¹ããšã«1ã€ã®HTTPSèšŒææž**ããæãŠãªãããšã«ãªããŸãã
* ããã¯ããµãŒããŒã®èŠæš¡ãã¢ããªã±ãŒã·ã§ã³ã®èŠæš¡ã«å¯ããŸããã
* ããããããã«ã¯**解決ç**ããããŸãã
-* **TLS**ãããã³ã«(HTTPã®åã«ãTCPã¬ãã«ã§æå·åãåŠçãããã®)ã«ã¯ã**<a href="https://en.wikipedia.org/wiki/Server_Name_Indication" class="external-link" target="_blank"><abbr title="Server Name Indication">SNI</abbr></a>**ãšåŒã°ãã**æ¡åŒµ**ããããŸãã
+* **TLS**ãããã³ã«(HTTPã®åã«ãTCPã¬ãã«ã§æå·åãåŠçãããã®)ã«ã¯ã**<a href="https://en.wikipedia.org/wiki/Server_Name_Indication" class="external-link" target="_blank"><abbr title="Server Name Indication - ãµãŒããŒå衚瀺">SNI</abbr></a>**ãšåŒã°ãã**æ¡åŒµ**ããããŸãã
* ãã®SNIæ¡åŒµæ©èœã«ããã1ã€ã®ãµãŒããŒïŒ**åäžã®IPã¢ãã¬ã¹**ãæã€ïŒã**è€æ°ã®HTTPSèšŒææž**ãæã¡ã**è€æ°ã®HTTPSãã¡ã€ã³/ã¢ããªã±ãŒã·ã§ã³**ã«ãµãŒãã¹ãæäŸã§ããããã«ãªããŸãã
* ãããæ©èœããããã«ã¯ã**ãããªãã¯IPã¢ãã¬ã¹**ã§ãªãã¹ã³ããŠããããµãŒããŒäžã§åäœããŠãã**åäžã®**ã³ã³ããŒãã³ã(ããã°ã©ã )ãããµãŒããŒå
ã®**ãã¹ãŠã®HTTPSèšŒææž**ãæã£ãŠããå¿
èŠããããŸãã
* ã»ãã¥ã¢ãªæ¥ç¶ãååŸãã**åŸ**ã§ããéä¿¡ãããã³ã«ã¯**HTTPã®ãŸãŸ**ã§ãã
ã¹ãããã®åãã¯ã**ãã¡ã€ã³å**ã**ååŸããããš**ããå§ãŸãã§ãããããã®åŸãDNSãµãŒããŒïŒããããåãã¯ã©ãŠããããã€ããŒïŒã«èšå®ããŸãã
-ããããã¯ã©ãŠããµãŒããŒïŒä»®æ³ãã·ã³ïŒãããã«é¡ãããã®ãæã«å
¥ãã<abbr title="That doesn't change â å€ãããªã">fixed</abbr> **ãããªãã¯IPã¢ãã¬ã¹**ãæã€ããšã«ãªãã§ãããã
+ããããã¯ã©ãŠããµãŒããŒïŒä»®æ³ãã·ã³ïŒãããã«é¡ãããã®ãæã«å
¥ãã<dfn title="æéãšãšãã«å€åããªããåçã§ã¯ãªãã">åºå®ã®</dfn> **ãããªãã¯IPã¢ãã¬ã¹**ãæã€ããšã«ãªãã§ãããã
DNSãµãŒããŒã§ã¯ã**ååŸãããã¡ã€ã³**ãããªãã®ãµãŒããŒã®ãããªãã¯**IPã¢ãã¬ã¹**ã«åããã¬ã³ãŒãïŒã`A record`ãïŒãèšå®ããŸãã
-# æåãããã€
+# ãµãŒããŒãæåã§å®è¡ãã { #run-a-server-manually }
-**FastAPI** ãæåã§ãããã€ããããšãã§ããŸãã
+## fastapi run ã³ãã³ãã䜿ã { #use-the-fastapi-run-command }
-以äžã®æ§ãªASGI察å¿ã®ãµãŒããã€ã³ã¹ããŒã«ããå¿
èŠããããŸã:
-
-//// tab | Uvicorn
-
-* <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a>, uvloopãšhttptoolsãåºã«ããé«éãªASGIãµãŒãã
+çµè«ãšããŠãFastAPI ã¢ããªã±ãŒã·ã§ã³ãæäŸããã«ã¯ `fastapi run` ã䜿ããŸã:
<div class="termy">
```console
-$ pip install "uvicorn[standard]"
+$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid">main.py</u>
----> 100%
+ <span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting production server ð
+
+ Searching for package file structure from directories
+ with <font color="#3465A4">__init__.py</font> files
+ Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
+
+ <span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> ð main.py
+
+ <span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with
+ the following code:
+
+ <u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
+
+ <span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font>
+
+ <span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font>
+ <span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000/docs</u></font>
+
+ Logs:
+
+ <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>2306215</b></font><b>]</b>
+ <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
+ <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
+ <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font> <b>(</b>Press CTRL+C
+ to quit<b>)</b>
```
</div>
-////
+ããã§ã»ãšãã©ã®ã±ãŒã¹ã¯åäœããŸããð
-/// tip | è±ç¥è
+ãã®ã³ãã³ãã¯ãããšãã°ã³ã³ããããµãŒããŒå
ã§ **FastAPI** ã¢ããªãèµ·åããã®ã«äœ¿ããŸãã
-`standard` ãå ããããšã§ãUvicornãã€ã³ã¹ããŒã«ãããããã€ãã®æšå¥šãããäŸåé¢ä¿ãå©çšããããã«ãªããŸãã
+## ASGIãµãŒã㌠{ #asgi-servers }
-ããã«ã¯ã`asyncio` ã®é«æ§èœãªå®å
šäºæåã§ãã `uvloop` ãå«ãŸãã䞊è¡åŠçã®ããã©ãŒãã³ã¹ã倧å¹
ã«åäžããŸãã
+å°ã詳ããèŠãŠãããŸãã
-///
+FastAPI ã¯ãPython ã® Web ãã¬ãŒã ã¯ãŒã¯ãšãµãŒããŒã®ããã®æšæºã§ãã <abbr title="Asynchronous Server Gateway Interface - éåæãµãŒããŒã²ãŒããŠã§ã€ã€ã³ã¿ãŒãã§ãŒã¹">ASGI</abbr> ã䜿ããŸããFastAPI 㯠ASGI Web ãã¬ãŒã ã¯ãŒã¯ã§ãã
+
+ãªã¢ãŒãã®ãµãŒããŒãã·ã³ã§ **FastAPI** ã¢ããªã±ãŒã·ã§ã³ïŒãä»ã® ASGI ã¢ããªã±ãŒã·ã§ã³ïŒãå®è¡ããã®ã«äž»ã«å¿
èŠãªã®ã¯ **Uvicorn** ã®ãã㪠ASGI ãµãŒããŒããã°ã©ã ã§ãããã㯠`fastapi` ã³ãã³ãã«ããã©ã«ãã§å«ãŸããŠããŸãã
+
+ä»ã«ãããã€ãã®éžæè¢ããããŸã:
+
+* <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a>: 髿§èœãª ASGI ãµãŒããŒã
+* <a href="https://hypercorn.readthedocs.io/" class="external-link" target="_blank">Hypercorn</a>: HTTP/2 ã Trio ã«å¯Ÿå¿ãã ASGI ãµãŒããŒãªã©ã
+* <a href="https://github.com/django/daphne" class="external-link" target="_blank">Daphne</a>: Django Channels ã®ããã«äœããã ASGI ãµãŒããŒã
+* <a href="https://github.com/emmett-framework/granian" class="external-link" target="_blank">Granian</a>: Python ã¢ããªã±ãŒã·ã§ã³åãã® Rust 補 HTTP ãµãŒããŒã
+* <a href="https://unit.nginx.org/howto/fastapi/" class="external-link" target="_blank">NGINX Unit</a>: 軜éã§å€çšé㪠Web ã¢ããªã±ãŒã·ã§ã³ã©ã³ã¿ã€ã ã
+
+## ãµãŒããŒãã·ã³ãšãµãŒããŒããã°ã©ã { #server-machine-and-server-program }
+
+åç§°ã«é¢ããå°ããªæ³šæç¹ããããŸããð¡
+
+ããµãŒããŒããšããèšèã¯ããªã¢ãŒã/ã¯ã©ãŠãäžã®ã³ã³ãã¥ãŒã¿ïŒç©ç/ä»®æ³ãã·ã³ïŒãšããã®ãã·ã³äžã§åäœããŠããããã°ã©ã ïŒäŸ: UvicornïŒã®äž¡æ¹ãæãã®ã«äžè¬çã«äœ¿ãããŸãã
+
+äžè¬ã«ããµãŒããŒããšæžãããŠãããšãã¯ããã®ã©ã¡ãããæããŠããå¯èœæ§ãããããšãèŠããŠãããŠãã ããã
+
+ãªã¢ãŒããã·ã³ãæãå ŽåãããµãŒããŒãã®ã»ãããã·ã³ããVMïŒä»®æ³ãã·ã³ïŒããããŒãããªã©ãšãåŒã°ããŸããããããéåžž Linux ãå®è¡ããããã§ããã°ã©ã ãåãããªã¢ãŒããã·ã³ãæããŸãã
-//// tab | Hypercorn
+## ãµãŒããŒããã°ã©ã ãã€ã³ã¹ããŒã« { #install-the-server-program }
-* <a href="https://github.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>, HTTP/2ã«ã察å¿ããŠããASGIãµãŒãã
+FastAPI ãã€ã³ã¹ããŒã«ãããšãæ¬çªãµãŒããŒã® Uvicorn ã忢±ãããŠããã`fastapi run` ã³ãã³ãã§èµ·åã§ããŸãã
+
+ãã ããASGI ãµãŒããŒãæåã§ã€ã³ã¹ããŒã«ããããšãã§ããŸãã
+
+[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank}ãäœæããŠæå¹åãããµãŒããŒã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããŠãã ããã
+
+äŸãšããŠãUvicorn ãã€ã³ã¹ããŒã«ããã«ã¯:
<div class="termy">
```console
-$ pip install hypercorn
+$ pip install "uvicorn[standard]"
---> 100%
```
</div>
-...ãŸãã¯ãããã以å€ã®ASGIãµãŒãã
+ä»ã® ASGI ãµãŒããŒããã°ã©ã ã§ãåæ§ã®æé ã§ãã
+
+/// tip | è±ç¥è
-////
+`standard` ãä»ãããšãUvicorn ã¯æšå¥šã®è¿œå äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŠäœ¿çšããŸãã
-ã\81\9dã\81\97ã\81Šã\80\81ã\83\81ã\83¥ã\83Œã\83\88ã\83ªã\82¢ã\83«ã\81šå\90\8cʧ\98ã\81ªÊ\96¹Ê³\95ã\81§ã\82¢ã\83\97ã\83ªã\82±ã\83Œã\82·ã\83§ã\83³ã\82\92Úµ·å\8b\95ã\81\97ã\81ŠÀž\8bã\81\95ã\81\84ã\80\82ã\81\9fã\81 ã\81\97ã\80\81À»¥Àž\8bã\81®Ê§\98ã\81«`--reload` ã\82ªã\83\97ã\82·ã\83§ã\83³ã\81¯Àœ¿ç\94šã\81\97ã\81ªã\81\84ã\81§Àž\8bã\81\95ã\81\84:
+ã\81\9dã\81®ÀžÂã\81«ã\81¯ã\80\81`asyncio` ã\81®é«\98Ê\80§Ú\83ϋ\81ªã\83\89ã\83Âã\83\83ã\83\97ã\82ۋ\83³À»£Ê\9b¿ã\81§ã\81\82ã\82\8aã\80\81倧ã\81\8dã\81ªÀžŠÚ¡\8cå®\9fÚ¡\8cÊ\80§Ú\83ϋ\81®å\90\91Àž\8aã\82\92ã\82\82ã\81\9fã\82\89ã\81\99 `uvloop` ã\82\82Ã¥\90«ã\81Ÿã\82\8cã\81Ÿã\81\99ã\80\82
-//// tab | Uvicorn
+`pip install "fastapi[standard]"` ã®ããã« FastAPI ãã€ã³ã¹ããŒã«ããå Žåã¯ããã§ã« `uvicorn[standard]` ãå«ãŸããŸãã
+
+///
+
+## ãµãŒããŒããã°ã©ã ãèµ·å { #run-the-server-program }
+
+ASGI ãµãŒããŒãæåã§ã€ã³ã¹ããŒã«ããå Žåãé垞㯠FastAPI ã¢ããªã±ãŒã·ã§ã³ãã€ã³ããŒããããããã«ãç¹å¥ãªåœ¢åŒã®ã€ã³ããŒãæååãæž¡ãå¿
èŠããããŸã:
<div class="termy">
</div>
-////
+/// note | åè
-//// tab | Hypercorn
+`uvicorn main:app` ãšããã³ãã³ãã¯æ¬¡ãæããŸã:
-<div class="termy">
+* `main`: ãã¡ã€ã« `main.py`ïŒPython ã®ãã¢ãžã¥ãŒã«ãïŒã
+* `app`: `main.py` å
ã§ `app = FastAPI()` ã«ããäœæããããªããžã§ã¯ãã
-```console
-$ hypercorn main:app --bind 0.0.0.0:80
+ããã¯æ¬¡ãšç䟡ã§ã:
-Running on 0.0.0.0:8080 over http (CTRL + C to quit)
+```Python
+from main import app
```
-</div>
+///
+
+ä»ã® ASGI ãµãŒããŒããã°ã©ã ã§ãåæ§ã®ã³ãã³ããããã詳现ã¯ããããã®ããã¥ã¡ã³ããåç
§ããŠãã ããã
+
+/// warning | 泚æ
+
+Uvicorn ãªã©ã®ãµãŒããŒã¯ãéçºæã«äŸ¿å©ãª `--reload` ãªãã·ã§ã³ããµããŒãããŠããŸãã
+
+ããã `--reload` ã¯å€ãã®ãªãœãŒã¹ãæ¶è²»ããäžå®å®ã«ãªããªã©ã®æ§è³ªããããŸãã
+
+éçºäžã«ã¯éåžžã«åœ¹ç«ã¡ãŸããã æ¬çªç°å¢ã§ã¯äœ¿çšãã¹ãã§ã¯ãããŸããã
+
+///
-////
+## ãããã€ã®æŠå¿µ { #deployment-concepts }
-忢ããå Žåã«èªåçã«åèµ·åãããããŒã«ãèšå®ããããããããŸããã
+ãããã®äŸã¯ããµãŒããŒããã°ã©ã ïŒäŸ: UvicornïŒãå®è¡ããäºåã«æ±ºããããŒãïŒäŸ: `80`ïŒã§ããã¹ãŠã® IPïŒ`0.0.0.0`ïŒããªãã¹ã³ãããåäžããã»ã¹ããèµ·åããŸãã
-ã\81\95ã\82\89ã\81«ã\80\81<a href="https://gunicorn.org/" class="external-link" target="_blank">Gunicorn</a>ã\82\92ã\82€ã\83³ã\82¹ã\83\88ã\83Œã\83«ã\81\97ã\81Š<a href="https://www.uvicorn.dev/#running-with-gunicorn" class="external-link" target="_blank">Uvicornã\81®ã\83\9eã\83\8dã\83Œã\82žã\83£ã\83Œã\81šã\81\97ã\81ŠÀœ¿ç\94šã\81\97ã\81\9fã\82\8a</a>ã\80\81ڀ\87Ê\95°ã\81®ã\83¯ã\83Œã\82«ã\83Œã\81§Hypercornã\82\92Àœ¿ç\94šã\81\97ã\81\9fã\81\84ã\81\8bã\82\82ã\81\97ã\82\8cã\81Ÿã\81\9bã\82\93ã\80\82
+ã\81\93ã\82\8cã\81\8cå\9fºÊ\9c¬ç\9a\84ã\81ªÚ\80\83ã\81\88Ê\96¹ã\81§ã\81\99ã\80\82ã\81\9fã\81 ã\81\97ã\80\81ʬ¡ã\81®ã\82\88ã\81\86ã\81ªÚ¿œå\8a Àº\8bé \85ã\81«ã\82\82察å¿\9cã\81\97ã\81\9fã\81\8fã\81ªã\82\8bã\81§ã\81\97ã\82\87ã\81\86:
-ã¯ãŒã«ãŒæ°ãªã©ã®åŸ®èª¿æŽãè¡ããããããããŸããã
+* ã»ãã¥ãªã㣠- HTTPS
+* èµ·åæã«å®è¡
+* åèµ·å
+* ã¬ããªã±ãŒã·ã§ã³ïŒå®è¡ããã»ã¹æ°ïŒ
+* ã¡ã¢ãª
+* èµ·ååã®äºåã¹ããã
-ã\81\97ã\81\8bã\81\97ã\81\93ã\82\8cã\82\89å\85šã\81Šã\82\92ã\82\84ã\82\8dã\81\86ã\81šã\81\99ã\82\8bã\81šã\80\81Ú\87ªå\8b\95ç\9a\84ã\81«ã\81\93ã\82\8cã\82\89ã\82\92Ú¡\8cã\81\86Dockerã\82€ã\83¡ã\83Œã\82žã\82\92Àœ¿ã\81\86Ê\96¹ã\81\8cÊ¥œã\81\8bã\82\82ã\81\97ã\82\8cã\81Ÿã\81\9bã\82\93ã\80\82
+ã\81\93ã\82\8cã\82\89ã\81®å\90\84ʊ\82念ã\81«ã\81€ã\81\84ã\81Šã\81®Ú\80\83ã\81\88Ê\96¹ã\82\84ã\80\81察å\87Šã\81\99ã\82\8bã\81\9fã\82\81ã\81®å\85·Àœ\93ÀŸ\8bã\83»Ê\88Šç\95¥ã\82\92ʬ¡ã\81®ç« ã\81§Úª¬Ê\98\8eã\81\97ã\81Ÿã\81\99ã\80\82ð\9f\9a\80
/// tip | è±ç¥è
-詳ãã㯠<a href="https://12factor.net/config" class="external-link" target="_blank">The Twelve-Factor App: Config</a> ãåç
§ããŠãã ããã
+詳ãã㯠<a href="https://12factor.net/config" class="external-link" target="_blank">The Twelve-Factor App: èšå®</a> ãåç
§ããŠãã ããã
///
ããã§ã**ç°å¢å€æ°**ãšã¯äœããPythonã§ã©ã®ããã«äœ¿çšãããã«ã€ããŠãåºæ¬çãªçè§£ãåŸãããã¯ãã§ãã
-ç°å¢å€æ°ã«ã€ããŠã®è©³çްã¯ã<a href="https://en.wikipedia.org/wiki/Environment_variable" class="external-link" target="_blank">Wikipedia for Environment Variable</a> ãåç
§ããŠãã ããã
+ç°å¢å€æ°ã«ã€ããŠã®è©³çްã¯ã<a href="https://en.wikipedia.org/wiki/Environment_variable" class="external-link" target="_blank">Wikipedia ã®ç°å¢å€æ°</a> ãåç
§ããŠãã ããã
å€ãã®å Žåãç°å¢å€æ°ãã©ã®ããã«åœ¹ç«ã¡ãããã«é©çšã§ããã®ãã¯ããŸãæç¢ºã§ã¯ãããŸãããããããéçºäžã®ããŸããŸãªã·ããªãªã§äœåºŠãç»å Žãããããç¥ã£ãŠãããšããã§ãããã
--- /dev/null
+# FastAPI CLI { #fastapi-cli }
+
+**FastAPI CLI** ã¯ãFastAPI ã¢ããªã®æäŸãFastAPI ãããžã§ã¯ãã®ç®¡çãªã©ã«äœ¿çšã§ããã³ãã³ãã©ã€ã³ããã°ã©ã ã§ãã
+
+FastAPI ãã€ã³ã¹ããŒã«ãããšïŒäŸ: `pip install "fastapi[standard]"`ïŒã`fastapi-cli` ãšããããã±ãŒãžãå«ãŸããŸãããã®ããã±ãŒãžãã¿ãŒããã«ã§äœ¿çšãã `fastapi` ã³ãã³ããæäŸããŸãã
+
+éçºçšã« FastAPI ã¢ããªãèµ·åããã«ã¯ã`fastapi dev` ã³ãã³ãã䜿çšã§ããŸã:
+
+<div class="termy">
+
+```console
+$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u>
+
+ <span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server ð
+
+ Searching for package file structure from directories with
+ <font color="#3465A4">__init__.py</font> files
+ Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
+
+ <span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> ð main.py
+
+ <span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with the
+ following code:
+
+ <u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
+
+ <span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font>
+
+ <span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font>
+ <span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000/docs</u></font>
+
+ <span style="background-color:#007166"><font color="#D3D7CF"> tip </font></span> Running in development mode, for production use:
+ <b>fastapi run</b>
+
+ Logs:
+
+ <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Will watch for changes in these directories:
+ <b>[</b><font color="#4E9A06">'/home/user/code/awesomeapp'</font><b>]</b>
+ <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font> <b>(</b>Press CTRL+C to
+ quit<b>)</b>
+ <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started reloader process <b>[</b><font color="#34E2E2"><b>383138</b></font><b>]</b> using WatchFiles
+ <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>383153</b></font><b>]</b>
+ <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
+ <span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
+```
+
+</div>
+
+`fastapi` ãšããã³ãã³ãã©ã€ã³ããã°ã©ã ã **FastAPI CLI** ã§ãã
+
+FastAPI CLI ã¯ãPython ããã°ã©ã ãžã®ãã¹ïŒäŸ: `main.py`ïŒãåãåãã`FastAPI` ã€ã³ã¹ã¿ã³ã¹ïŒé垞㯠`app`ïŒãèªåæ€åºããé©å㪠import æ¹æ³ã倿ããŠæäŸããŸãã
+
+æ¬çªç°å¢ã§ã¯ä»£ããã« `fastapi run` ã䜿çšããŸããð
+
+å
éšçã«ã¯ã**FastAPI CLI** 㯠<a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a>ïŒé«æ§èœã§æ¬çªéçšåãã® ASGI ãµãŒããŒïŒã䜿çšããŸããð
+
+## `fastapi dev` { #fastapi-dev }
+
+`fastapi dev` ãå®è¡ãããšãéçºã¢ãŒããæå¹ã«ãªããŸãã
+
+ããã©ã«ãã§ã¯ã**auto-reload** ãæå¹ã§ããã³ãŒãã倿ŽãããšãµãŒããŒãèªåã§åèªã¿èŸŒã¿ãããŸããããã¯ãªãœãŒã¹ãå€ãæ¶è²»ããç¡å¹æããå®å®æ§ãäœããªãå¯èœæ§ããããŸããéçºæã®ã¿ã«äœ¿çšããŠãã ããããŸããIP ã¢ãã¬ã¹ `127.0.0.1`ïŒãã·ã³èªèº«ã®ã¿ãšéä¿¡ããããã® IPã`localhost`ïŒã§åŸ
ã¡åããŸãã
+
+## `fastapi run` { #fastapi-run }
+
+`fastapi run` ãå®è¡ãããšãããã©ã«ãã§æ¬çªã¢ãŒãã§èµ·åããŸãã
+
+ããã©ã«ãã§ã¯ã**auto-reload** ã¯ç¡å¹ã§ãããŸããIP ã¢ãã¬ã¹ `0.0.0.0`ïŒå©çšå¯èœãªãã¹ãŠã® IP ã¢ãã¬ã¹ãæå³ããŸãïŒã§åŸ
ã¡åããããããã®ãã·ã³ãšéä¿¡ã§ããä»»æã®ã¯ã©ã€ã¢ã³ãããå
¬éã¢ã¯ã»ã¹ãå¯èœã«ãªããŸããããã¯ãããšãã°ã³ã³ããå
ãªã©ãæ¬çªç°å¢ã§äžè¬çãªå®è¡æ¹æ³ã§ãã
+
+å€ãã®å ŽåïŒãããŠæšå¥šãããã®ã¯ïŒãäžäœã« HTTPS ãçµç«¯ãããtermination proxyãã眮ããŸããããã¯ã¢ããªã®ãããã€æ¹æ³ã«äŸåãããããã€ãã代è¡ããå Žåãããã°ãèªåã§èšå®ããå¿
èŠãããå ŽåããããŸãã
+
+/// tip | è±ç¥è
+
+詳ããã¯ã[ãããã€ã®ããã¥ã¡ã³ã](deployment/index.md){.internal-link target=_blank}ãåç
§ããŠãã ããã
+
+///
-# æ©èœ
+# æ©èœ { #features }
-## FastAPIã®æ©èœ
+## FastAPIã®æ©èœ { #fastapi-features }
-**FastAPI** ã¯ä»¥äžã®æ©èœããã¡ãŸã:
+**FastAPI** ã¯æ¬¡ã®ãã®ãæäŸããŸã:
-### ãªãŒãã³ã¹ã¿ã³ããŒãæºæ
+### ãªãŒãã³ã¹ã¿ã³ããŒãæºæ { #based-on-open-standards }
-* APIäœæã®ããã®<a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a>ãããã¯ã<abbr title="also known as: endpoints, routes">path</abbr> <abbr title="also known as HTTP methods, as POST, GET, PUT, DELETE">operations</abbr>ã®å®£èšããã©ã¡ãŒã¿ãããã£ãªã¯ãšã¹ããã»ãã¥ãªãã£ãªã©ãå«ãã§ããŸãã
-* <a href="http://json-schema.org/" class="external-link" target="_blank"><strong>JSONã¹ããŒã</strong></a>ã䜿çšããããŒã¿ã¢ãã«ã®ããã¥ã¡ã³ãèªåçæïŒOpenAPIã¯JSONã¹ããŒãã«åºã¥ããŠããïŒã
-* ç¶¿å¯ãªèª¿æ»ã®çµæãäžå±€ã«åŸä»ãããã®ã§ã¯ãªãããããã®åºæºã«åºã¥ããŠèšèšãããŸããã
+* API äœæã®ããã® <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a>ã<dfn title="å¥å: ãšã³ããã€ã³ããã«ãŒã">path</dfn> <dfn title="å¥å: HTTP ã¡ãœããïŒPOSTãGETãPUTãDELETE ãªã©ïŒ">operations</dfn>ããã©ã¡ãŒã¿ããªã¯ãšã¹ãããã£ãã»ãã¥ãªãã£ãªã©ã®å®£èšãå«ã¿ãŸãã
+* <a href="https://json-schema.org/" class="external-link" target="_blank"><strong>JSON Schema</strong></a> ã«ããããŒã¿ã¢ãã«ã®èªåããã¥ã¡ã³ãåïŒOpenAPI èªäœã JSON Schema ã«åºã¥ããŠããŸãïŒã
+* å
¥å¿µãªèª¿æ»ã®ããããããã®æšæºãäžå¿ã«èšèšãããŠããŸããåŸä»ãã®ã¬ã€ã€ãŒã§ã¯ãããŸããã
* ããã«ãããå€ãã®èšèªã§èªå **ã¯ã©ã€ã¢ã³ãã³ãŒãçæ** ãå¯èœã§ãã
-### èªåããã¥ã¡ã³ãçæ
-察話çãªAPIããã¥ã¡ã³ããšæ¢çŽ¢çãªwebãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãããã¬ãŒã ã¯ãŒã¯ã¯OpenAPIãåºã«ããŠãããããããã€ãã®ãªãã·ã§ã³ããããããã©ã«ãã§2ã€å«ãŸããŠããŸãã
+### èªåããã¥ã¡ã³ã { #automatic-docs }
-* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank"><strong>Swagger UI</strong></a>ã§ãã€ã³ã¿ã©ã¯ãã£ããªæ¢çŽ¢ãããªããããã©ãŠã¶ããçŽæ¥APIãåŒã³åºããŠãã¹ããè¡ããŸãã
+察話ç㪠API ããã¥ã¡ã³ããšæ¢çŽ¢ç㪠Web ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ããã¬ãŒã ã¯ãŒã¯ã¯ OpenAPI ã«åºã¥ããŠãããããè€æ°ã®ãªãã·ã§ã³ããããããã©ã«ãã§ 2 ã€å«ãŸããŸãã
+
+* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank"><strong>Swagger UI</strong></a>ãã€ã³ã¿ã©ã¯ãã£ãã«æ¢çŽ¢ãã€ã€ããã©ãŠã¶ããçŽæ¥ API ãåŒã³åºããŠãã¹ãã§ããŸãã

-* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank"><strong>ReDoc</strong></a>ã䜿çšããããäžã€ã®APIããã¥ã¡ã³ãçæã
+* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank"><strong>ReDoc</strong></a> ã«ãã代æ¿ã® API ããã¥ã¡ã³ãã

-### çŸä»£çãªPython
+### çŸä»£çãªPythonã®ã¿ { #just-modern-python }
-FastAPIã®æ©èœã¯ãã¹ãŠãæšæºã®Python 3.8å宣èšã«åºã¥ããŠããŸãïŒPydanticã®å瞟ïŒãæ°ããæ§æã¯ãããŸããããã ã®çŸä»£çãªæšæºã®Pythonã§ãã
+ãã¹ãŠæšæºã® **Python ã®å** 宣èšïŒPydantic ã«æè¬ïŒã«åºã¥ããŠããŸããæ°ããæ§æãåŠã¶å¿
èŠã¯ãããŸãããæšæºçã§ã¢ãã³ãª Python ã ãã§ãã
-ïŒFastAPIã䜿çšããªãå Žåã§ãïŒPythonã®åã®äœ¿ç𿹿³ã«ã€ããŠç°¡åãªåŸ©ç¿ãå¿
èŠãªå Žåã¯ãçããã¥ãŒããªã¢ã«ïŒ[Python Types](python-types.md){.internal-link target=_blank}ïŒãåç
§ããŠãã ããã
+ïŒFastAPI ã䜿ããªãå Žåã§ãïŒPython ã®åã®äœ¿ãæ¹ã 2 åã§åŸ©ç¿ãããå Žåã¯ãçããã¥ãŒããªã¢ã« [Python Types](python-types.md){.internal-link target=_blank} ãåç
§ããŠãã ããã
-åã䜿çšããæšæºçãªPythonãèšè¿°ããŸã:
+åã䜿ã£ãæšæºç㪠Python ãèšè¿°ããŸã:
```Python
from datetime import date
from pydantic import BaseModel
-# Declare a variable as a str
-# and get editor support inside the function
+# 倿°ã str ãšããŠå®£èš
+# ãããŠé¢æ°å
ã§ãšãã£ã¿æ¯æŽãåãã
def main(user_id: str):
return user_id
-# A Pydantic model
+# Pydantic ã¢ãã«
class User(BaseModel):
id: int
name: str
joined: date
```
-ããã¯ä»¥äžã®ããã«çšããããŸã:
+ããã¯æ¬¡ã®ããã«äœ¿ããŸã:
```Python
my_user: User = User(id=3, name="John Doe", joined="2018-07-19")
my_second_user: User = User(**second_user_data)
```
-/// info | æ
å ±
+/// info
-`**second_user_data` ã¯ä»¥äžãæå³ããŸãïŒ
+`**second_user_data` ã¯æ¬¡ã®æå³ã§ã:
-`second_user_data`èŸæžã®ããŒãšå€ãçŽæ¥ãããŒãšå€ã®åŒæ°ãšããŠæž¡ããŸããããã¯ã`User(id=4, name="Mary", joined="2018-11-30")`ãšåçã§ãã
+`second_user_data` èŸæžã®ããŒãšå€ãããã®ãŸãŸããŒããªã¥ãŒåŒæ°ãšããŠæž¡ããŸãããã㯠`User(id=4, name="Mary", joined="2018-11-30")` ãšåçã§ãã
///
-### ãšãã£ã¿ã®ãµããŒã
+### ãšãã£ã¿ã®ãµããŒã { #editor-support }
-ã\81\99ã\81¹ã\81Šã\81®ã\83\95ã\83‹\83΋\83 ã\83¯ã\83΋\82¯ã\81¯Àœ¿ã\81\84ã\82\84ã\81\99ã\81\8fç\9bŽÊ\84\9fç\9a\84ã\81«Àœ¿ç\94šã\81§ã\81\8dã\82\8bã\82\88ã\81\86ã\81«ÚšÂښ\88ã\81\95ã\82\8cã\81Šã\81\8aã\82\8aã\80\81ã\81\99ã\81¹ã\81Šã\81®Ê±ºå®\9aã\81¯é\96\8bç\99ºã\82\92é\96\8bå§\8bã\81\99ã\82\8bÃ¥\89\8dã\81§ã\82\82ڀ\87Ê\95°ã\81®ã\82šã\83\87ã\82£ã\82¿ã\83΋\81§ã\83\86ã\82¹ã\83\88ã\81\95ã\82\8cã\80\81Ê\9c\80é«\98ã\81®é\96\8bç\99ºÀœ\93éš\93ã\81\8cÀ¿\9dښŒã\81\95ã\82\8cãŸãã
+ã\83\95ã\83‹\83΋\83 ã\83¯ã\83΋\82¯å\85šÀœ\93ã\81\8cÀœ¿ã\81\84ã\82\84ã\81\99ã\81\8fç\9bŽÊ\84\9fç\9a\84ã\81«ã\81ªã\82\8bã\82\88ã\81\86ښÂښ\88ã\81\95ã\82\8cã\81Šã\81\8aã\82\8aã\80\81Ê\9c\80é«\98ã\81®é\96\8bç\99ºÀœ\93éš\93ã\82\92確À¿\9dã\81\99ã\82\8bã\81\9fã\82\81ã\80\81é\96\8bç\99ºé\96\8bå§\8bÃ¥\89\8dã\81\8bã\82\89ڀ\87Ê\95°ã\81®ã\82šã\83\87ã\82£ã\82¿ã\81§ã\81\82ã\82\89ã\82\86ã\82\8bÃ¥\88€Ê\96Âã\81\8cʀ\9cښŒã\81\95ã\82\8cã\81Šã\81\84ãŸãã
-ååã®Pythonéçºè
調æ»ã§ã¯ã<a href="https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features" class="external-link" target="_blank">æã䜿çšãããŠããæ©èœãããªãŒãã³ã³ããªãŒããã§ããããšãæããã«ãªããŸããã</a>
+Python éçºè
調æ»ã§ã¯ã<a href="https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features" class="external-link" target="_blank">æããã䜿ãããæ©èœã® 1 ã€ãããªãŒãã³ã³ããªãŒããã§ããããšãæããã§ã</a>ã
-**FastAPI** ã\83\95ã\83‹\83΋\83 ã\83¯ã\83΋\82¯ã\81¯ã\80\81ã\81\93ã\81®ÚŠ\81ʱ\82ã\82\92ʺ\80ã\81\9fã\81\99ã\81\93ã\81šã\82\92Ã¥\9fºÊ\9c‹\81šããŠããŸãããªãŒãã³ã³ããªãŒãã¯ã©ãã§ãæ©èœããŸãã
+**FastAPI** ã\81¯ã\81\9dã\81®ÚŠ\81ʱ\82ã\82\92ʺ\80ã\81\9fã\81\99ã\81\93ã\81šã\82\92Ã¥\9fºç\9bۋ\81«ããŠããŸãããªãŒãã³ã³ããªãŒãã¯ã©ãã§ãæ©èœããŸãã
ããã¥ã¡ã³ãã«æ»ãå¿
èŠã¯ã»ãšãã©ãããŸããã
-ã\82šã\83\87ã\82£ã\82¿ã\83΋\81\8cã\81©ã\81®ã\82\88ã\81\86ã\81«åœ¹ç«\8bã\81ۋ\81\8bã\82\92À»¥Àž\8bã\81«ç€ºã\81\97ã\81Ÿã:
+ã\82šã\83\87ã\82£ã\82¿ã\81\8cã\81©ã\81®ã\82\88ã\81\86ã\81«åœ¹ç«\8bã\81ۋ\81\8bã\81®ÀŸ\8bã\81§ã:
-* <a href="https://code.visualstudio.com/" class="external-link" target="_blank">Visual Studio Code</a>ã®å Žå:
+* <a href="https://code.visualstudio.com/" class="external-link" target="_blank">Visual Studio Code</a> ã®å Žå:

-* <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>ã®å Žå:
+* <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a> ã®å Žå:

-以åã¯äžå¯èœã ãšèããŠããã³ãŒãã§ããè£å®ãããŸããäŸãã°ããªã¯ãšã¹ãããã®JSONããã£ïŒãã¹ããããŠããå¯èœæ§ãããïŒå
ã® `price`ããŒã§ãã
-
-ééã£ãããŒåãå
¥åããããããã¥ã¡ã³ãéãè¡ãæ¥ããããäžäžã«ã¹ã¯ããŒã«ããŠ`username`ãš`user_name`ã®ã©ã¡ãã䜿çšããã調ã¹ããããå¿
èŠã¯ãããããŸããã
-
-### ç°¡æœ
+以åã¯äžå¯èœã ãšæã£ãŠããã³ãŒãã§ãè£å®ãåŸãããŸããäŸãã°ããªã¯ãšã¹ãããå±ãïŒãã¹ããããŠããå¯èœæ§ã®ããïŒJSON ããã£å
ã® `price` ããŒãªã©ã§ãã
-ã\81\99ã\81¹ã\81Šã\81«é\81©å\88\87ã\81ª**ã\83\87ã\83\95ã\82©ã\83«ã\83\88**ã\81\8cã\81\82ã\82\8aã\80\81ã\82ªã\83\97ã\82·ã\83§ã\83³ã\81®Ê§\8bÊ\88\90ã\81\8cã\81§ã\81\8dã\81Ÿã\81\99ã\80\82å¿\85ڊ\81ã\81ªã\81\93ã\81šã\82\92å®\9fÚ¡\8cã\81\97ã\80\81å¿\85ڊ\81ã\81ªAPIã\82\92å®\9a矩ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\81\99ã\81¹ã\81Šã\81®ã\83\91ã\83©ã\83¡ã\83΋\82¿ã\83΋\82\92Úª¿Ê\95Žã\81§ã\81\8dã\81Ÿã\81\99ã
+ã\82\82ã\81\86é\96\93é\81\95ã\81£ã\81\9fã\82Âã\83Ό\90\8dã\82\92Ã¥\85¥å\8a\9bã\81\97ã\81\9fã\82\8aã\80\81ã\83\89ã\82Âã\83¥ã\83¡ã\83³ã\83\88ã\82\92Ú¡\8cã\81\8dÊ\9d¥ã\81\97ã\81\9fã\82\8aã\80\81Àž\8aÀž\8bã\81«ã\82¹ã\82¯ã\83Âã\83΋\83«ã\81\97ã\81ŠÊ\9c\80çµ\82ç\9a\84ã\81« `username` ã\81š `user_name` ã\81®ã\81©ã\81¡ã\82\89ã\82\92Àœ¿ã\81£ã\81\9fã\81®ã\81\8bÊ\8e¢ã\81\99å¿\85ڊ\81ã\81¯ã\81\82ã\82\8aã\81Ÿã\81\9bã\82\93ã
-ãã ããããã©ã«ãã§ããã¹ãŠ **ããŸããããŸã**ã
+### ç°¡æœ { #short }
-### æ€èšŒ
+ãã¹ãŠã«åŠ¥åœãª **ããã©ã«ã** ããããã©ãã§ããªãã·ã§ã³ã§æ§æã§ããŸããå¿
èŠã«å¿ããŠãã¹ãŠã®ãã©ã¡ãŒã¿ã埮調æŽããŠãæ±ãã API ãå®çŸ©ã§ããŸãã
-* 以äžã®æ§ãªãã»ãšãã©ã®ïŒãã¹ãŠã®ïŒïŒPython **ããŒã¿å**ã®æ€èšŒ:
- * JSONãªããžã§ã¯ãïŒ`dict`ïŒ
- * é
ç®ã®åãå®çŸ©ããJSONé
åïŒ`list`ïŒ
- * æå°é·ãšæå€§é·ã®ããæååïŒ`str`ïŒãã£ãŒã«ã
- * æå°å€ãšæå€§å€ã®ããæ°å€ïŒ`int`ã` float`ïŒ
+ãããããã©ã«ãã®ãŸãŸã§ãããã¹ãŠ **ããŸãåããŸã**ã
-* ãããšããŸããã¯ãªåã®æ€èšŒïŒ
- * URL
- * Eã¡ãŒã«
- * UUID
- * ...ãã®ä»
+### æ€èšŒ { #validation }
-ãã¹ãŠã®æ€èšŒã¯ã確ç«ãããå
ç¢ãª **Pydantic** ã«ãã£ãŠåŠçãããŸãã
+* ã»ãšãã©ïŒãããã¯ãã¹ãŠïŒïŒã® Python ã® **ããŒã¿å** ã«å¯Ÿããæ€èšŒ:
+ * JSON ãªããžã§ã¯ãïŒ`dict`ïŒã
+ * é
ç®ã®åãå®çŸ©ãã JSON é
åïŒ`list`ïŒã
+ * æååïŒ`str`ïŒãã£ãŒã«ãã®æå°/æå€§é·ã
+ * æ°å€ïŒ`int`ã`float`ïŒã®æå°/æå€§å€ããªã©ã
-### ã»ãã¥ãªãã£ãšèªèšŒ
+* ãããšããŸããã¯ãªåã®æ€èšŒ:
+ * URLã
+ * Emailã
+ * UUIDã
+ * ...ãã®ä»ã
-ã\82ȋ\82Âã\83¥ã\83ªã\83\86ã\82£ã\81šÚª\8dښŒã\81\8cçµ±å\90\88ã\81\95ã\82\8cã\81Šã\81\84ã\81Ÿã\81\99ã\80\82 ã\83\87ã\83΋\82¿ã\83\99ã\83΋\82¹ã\81Ÿã\81\9fã\81¯ã\83\87ã\83΋\82¿ã\83¢ã\83\87ã\83«ã\81«ã\81ۋ\81\84ã\81Šã\82\82劥å\8d\94ã\81\97ã\81Šã\81\84ã\81Ÿã\81\9bã\82\93ã
+ã\81\99ã\81¹ã\81Šã\81®Ê€\9cښŒã\81¯ã\80\81確ç«\8bã\81\95ã\82\8cå \85ç\89¢ã\81ª **Pydantic** ã\81«ã\82\88ã\81£ã\81Šå\87Šç\90\86ã\81\95ã\82\8cã\81Ÿã\81\99ã
-以äžã®OpenAPIã§å®çŸ©ãããŠãããã¹ãŠã®ã»ãã¥ãªãã£ã¹ããŒã ãå«ã:
+### ã»ãã¥ãªãã£ãšèªèšŒ { #security-and-authentication }
-* HTTPããŒã·ãã¯
-* **OAuth2**ïŒ**JWTããŒã¯ã³**ã䜿çšïŒã JWTã䜿çšããOAuth2ã®ãã¥ãŒããªã¢ã«ïŒ[OAuth2 with JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}ïŒã確èªããŠãã ããã
-* APIããŒïŒ
- * ããããŒ
- * ã¯ãšãªãã©ã¡ãŒã¿
- * ã¯ãããŒãç
+ã»ãã¥ãªãã£ãšèªèšŒãçµ±åãããŠããŸããããŒã¿ããŒã¹ãããŒã¿ã¢ãã«ãšã®åŠ¥åã¯ãããŸããã
-ããã«ãStarletteã®ãã¹ãŠã®ã»ãã¥ãªãã£æ©èœãå«ã¿ãŸãïŒ**ã»ãã·ã§ã³Cookie**ãå«ãïŒã
+OpenAPI ã§å®çŸ©ããããã¹ãŠã®ã»ãã¥ãªãã£ã¹ããŒã ããµããŒãããŸã:
-ãããã¯ãã·ã¹ãã ãããŒã¿ã¹ãã¢ããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ãNoSQLããŒã¿ããŒã¹ãªã©ãšç°¡åã«çµ±åã§ããåå©çšå¯èœãªããŒã«ãšã³ã³ããŒãã³ããšããŠæ§ç¯ãããŠããŸãã
+* HTTP Basicã
+* **OAuth2**ïŒ**JWT ããŒã¯ã³** ãå¯ïŒããã¥ãŒããªã¢ã« [JWT ãçšãã OAuth2](tutorial/security/oauth2-jwt.md){.internal-link target=_blank} ã確èªããŠãã ããã
+* API ããŒïŒä»¥äžã®å ŽæïŒ:
+ * ããããŒã
+ * ã¯ãšãªãã©ã¡ãŒã¿ã
+ * ã¯ãããŒããªã©ã
-### äŸåæ§ã®æ³šå
¥ïŒDependency InjectionïŒ
+ããã«ãStarlette ã®ãã¹ãŠã®ã»ãã¥ãªãã£æ©èœïŒ**ã»ãã·ã§ã³ Cookie** ãå«ãïŒãå©çšã§ããŸãã
-FastAPIã«ã¯éåžžã«äœ¿ãããããéåžžã«åŒ·åãª<abbr title='also known as "components", "resources", "services", "providers"'><strong>äŸåæ§ã®æ³šå
¥</strong></abbr>ã·ã¹ãã ãåããŠããŸãã
+ãããã¯ãã¹ãŠåå©çšå¯èœãªããŒã«ãã³ã³ããŒãã³ããšããŠæ§ç¯ãããŠãããã·ã¹ãã ãããŒã¿ã¹ãã¢ããªã¬ãŒã·ã§ãã«/NoSQL ããŒã¿ããŒã¹çãšå®¹æã«çµ±åã§ããŸãã
-* äŸåé¢ä¿ã§ãããäŸåé¢ä¿ãæã€ããšãã§ããéå±€ãŸã㯠**äŸåé¢ä¿ã®"ã°ã©ã"** ãäœæããããšãã§ããŸãã
+### äŸåæ§ã®æ³šå
¥ { #dependency-injection }
-* ãã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠãã¹ãŠ**èªåçã«åŠç**ãããŸãã
-* ãã¹ãŠã®äŸåé¢ä¿ã¯ãªã¯ãšã¹ãããã®ããŒã¿ãèŠè«ã§ããŠã**path operationsã®å¶çŽãšèªåããã¥ã¡ã³ããŒã·ã§ã³ãæ¡åŒµã§ããŸã**ã
-* äŸåé¢ä¿ã§å®çŸ©ããã *path operation* ãã©ã¡ãŒã¿ã**èªåæ€èšŒ**ãå¯èœã§ãã
-* è€éãªãŠãŒã¶ãŒèªèšŒã·ã¹ãã ã**ããŒã¿ããŒã¹æ¥ç¶**ãªã©ã®ãµããŒã
-* **ããŒã¿ããŒã¹ãããã³ããšã³ããªã©ã«å¯Ÿãã劥åã¯ãããŸãã**ãããããã¹ãŠãšç°¡åã«çµ±åã§ããŸãã
+FastAPI ã«ã¯ãéåžžã«äœ¿ããããããã€éåžžã«åŒ·å㪠<dfn title='å¥å: ã³ã³ããŒãã³ãããªãœãŒã¹ããµãŒãã¹ããããã€ããŒ'><strong>äŸåæ§ã®æ³šå
¥</strong></dfn> ã·ã¹ãã ããããŸãã
-### ç¡å¶éã®ããã©ã°ã€ã³ã
+* äŸåé¢ä¿ã¯äŸåé¢ä¿ãæã€ããšãã§ããéå±€ãŸã㯠**äŸåé¢ä¿ã®ãã°ã©ãã** ãäœæã§ããŸãã
+* ãã¹ãŠãã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠ**èªåçã«åŠç**ãããŸãã
+* ãã¹ãŠã®äŸåé¢ä¿ã¯ãªã¯ãšã¹ãããããŒã¿ãèŠæ±ã§ãã*path operation* ã®å¶çŽãšèªåããã¥ã¡ã³ãã**æ¡åŒµ**ã§ããŸãã
+* äŸåé¢ä¿ã§å®çŸ©ããã *path operation* ã®ãã©ã¡ãŒã¿ã«ã€ããŠã**èªåæ€èšŒ**ãããŸãã
+* è€éãªãŠãŒã¶ãŒèªèšŒã·ã¹ãã ã**ããŒã¿ããŒã¹æ¥ç¶** ãªã©ã®ãµããŒãã
+* **ããŒã¿ããŒã¹ãããã³ããšã³ãçãšã®åŠ¥åã¯äžèŠ**ããã¹ãŠãšç°¡åã«çµ±åã§ããŸãã
-ä»ã®æ¹æ³ã§ã¯ãããããå¿
èŠãšãããå¿
èŠãªã³ãŒããã€ã³ããŒãããŠäœ¿çšããŸãã
+### ç¡å¶éã®ããã©ã°ã€ã³ã { #unlimited-plug-ins }
-çµ±åã¯éåžžã«ç°¡åã«äœ¿çšã§ããããã«èšèšãããŠããïŒäŸåé¢ä¿ãçšããŠïŒã*path operations* ã§äœ¿çšãããŠããã®ãšåãæ§é ãšæ§æã䜿çšããŠã2è¡ã®ã³ãŒãã§ã¢ããªã±ãŒã·ã§ã³ã®ããã©ã°ã€ã³ããäœæã§ããŸãã
+å¥ã®èšãæ¹ãããã°ããã©ã°ã€ã³ã¯äžèŠã§ãå¿
èŠãªã³ãŒããã€ã³ããŒãããŠäœ¿ãã ãã§ãã
+ããããçµ±åã¯ïŒäŸåé¢ä¿ãçšããŠïŒéåžžã«ç°¡åã«äœ¿ããããèšèšãããŠããã*path operation* ã§äœ¿ãã®ãšåãæ§é ãšæ§æã§ã2 è¡ã®ã³ãŒãã§ã¢ããªã±ãŒã·ã§ã³çšã®ããã©ã°ã€ã³ããäœããŸãã
-### ãã¹ã
+### ãã¹ãæžã¿ { #tested }
-* <abbr title = "èªåçã«ãã¹ããããã³ãŒãã®é">ãã¹ãã«ãã¬ããž</abbr> 100%
-* <abbr title = "Pythonåã¢ãããŒã·ã§ã³ãããã«ããããŠãŒã¶ãŒã¯ããè¯ããšãã£ã¿ãŒãšå€éšããŒã«ã®ãµããŒãåããããã">åã¢ãããŒã·ã§ã³</abbr>100%ã®ã³ãŒãããŒã¹
-* Ê\9c¬ç\95ªã\82¢ã\83\97ã\83ªã\82±ã\83Œã\82·ã\83§ã\83³ã\81§Àœ¿ç\94šã\81\95ã\82\8cã\81Ÿã\81\99
+* 100% ã® <dfn title="èªåçã«ãã¹ããããã³ãŒãã®é">ãã¹ãã«ãã¬ããž</dfn>ã
+* 100% <dfn title="Python ã®åã¢ãããŒã·ã§ã³ãããã«ããããšãã£ã¿ãå€éšããŒã«ããããè¯ãæ¯æŽãåããããŸã">åã¢ãããŒã·ã§ã³ä»ã</dfn>ã®ã³ãŒãããŒã¹ã
+* Ê\9c¬ç\95ªã\82¢ã\83\97ã\83ªã\82±ã\83Œã\82·ã\83§ã\83³ã\81§Àœ¿ç\94šã\81\95ã\82\8cã\81Šã\81\84ã\81Ÿã\81\99ã\80\82
-## Starletteã®æ©èœ
+## Starletteã®æ©èœ { #starlette-features }
-**FastAPI**ã¯ã<a href="https://www.starlette.dev/" class="external-link" target="_blank"><strong>Starlette </strong></a>ãšå®å
šã«äºææ§ããããŸãïŒãããŠããŒã¹ã«ãªã£ãŠããŸãïŒããããã£ãŠã远å ã®Starletteã³ãŒããããã°ããããæ©èœããŸãã
+**FastAPI** 㯠<a href="https://www.starlette.dev/" class="external-link" target="_blank"><strong>Starlette</strong></a> ãšå®å
šã«äºææ§ãããïŒãã€ããã«åºã¥ããŠããŸãïŒããã®ãããæå
ã® Starlette ã®è¿œå ã³ãŒããåäœããŸãã
-`FastAPI`ã¯å®éã«ã¯`Starlette`ã®ãµãã¯ã©ã¹ã§ãããããã£ãŠãStarletteããã§ã«ç¥ã£ãŠããã䜿çšããŠããå Žåã¯ãã»ãšãã©ã®æ©èœãåãããã«æ©èœããŸãã
+`FastAPI` ã¯å®éã«ã¯ `Starlette` ã®ãµãã¯ã©ã¹ã§ãããã§ã« Starlette ãç¥ã£ãŠããããããã¯äœ¿ã£ãŠãããªããã»ãšãã©ã®æ©èœã¯åãããã«åäœããŸãã
-**FastAPI**ã䜿çšãããšã以äžã®ãããªã**Starlette**ã®ãã¹ãŠã®æ©èœãå©çšã§ããŸãïŒFastAPIã¯Starletteã匷åãããã®ã«ãããªãããïŒ:
+**FastAPI** ã§ã¯ **Starlette** ã®ãã¹ãŠã®æ©èœãå©çšã§ããŸãïŒFastAPI ã¯åŒ·åããã Starlette ã«ãããŸããïŒ:
-* èŠäºãªããã©ãŒãã³ã¹ã<a href="https://github.com/encode/starlette#performance" class="external-link" target="_blank"> **NodeJS**ããã³**Go**ã«å¹æµãããæéã®Pythonãã¬ãŒã ã¯ãŒã¯ã®1ã€ã§ãã</a>
-
-* **WebSocket**ã®ãµããŒã
-* **GraphQL**ã®ãµããŒã
-* ããã»ã¹å
ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯
-* èµ·åããã³ã·ã£ããããŠã³ã€ãã³ã
-* `httpx`ã«åºã¥ããŠæ§ç¯ããããã¹ãã¯ã©ã€ã¢ã³ã
-* **CORS**ãGZipãéçãã¡ã€ã«ãã¹ããªãŒãã³ã°å¿ç
-* **ã»ãã·ã§ã³ãšCookie**ã®ãµããŒã
-* ãã¹ãã«ãã¬ããž100%
-* åã¢ãããŒã·ã§ã³100%ã®ã³ãŒãããŒã¹
+* å§åçãªããã©ãŒãã³ã¹ã<a href="https://github.com/encode/starlette#performance" class="external-link" target="_blank">å©çšå¯èœãªæéã¯ã©ã¹ã® Python ãã¬ãŒã ã¯ãŒã¯ã® 1 ã€ã§ã**NodeJS** ã **Go** ãšåçã§ã</a>ã
+* **WebSocket** ã®ãµããŒãã
+* ããã»ã¹å
ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã
+* èµ·åããã³ã·ã£ããããŠã³ã€ãã³ãã
+* HTTPX ã«åºã¥ããã¹ãã¯ã©ã€ã¢ã³ãã
+* **CORS**ãGZipãéçãã¡ã€ã«ãã¹ããªãŒãã³ã°ã¬ã¹ãã³ã¹ã
+* **ã»ãã·ã§ã³ãš Cookie** ã®ãµããŒãã
+* ãã¹ãã«ãã¬ããž 100%ã
+* åã¢ãããŒã·ã§ã³ 100% ã®ã³ãŒãããŒã¹ã
-## Pydanticã®ç¹åŸŽ
+## Pydanticã®æ©èœ { #pydantic-features }
-**FastAPI**ã¯<a href="https://docs.pydantic.dev/" class="external-link" target="_blank"><strong>Pydantic </strong></a>ãšå®å
šã«äºææ§ããããŸãïŒãããŠããŒã¹ã«ãªã£ãŠããŸãïŒããããã£ãŠã远å ã®Pydanticã³ãŒããããã°ããããæ©èœããŸãã
+**FastAPI** 㯠<a href="https://docs.pydantic.dev/" class="external-link" target="_blank"><strong>Pydantic</strong></a> ãšå®å
šã«äºææ§ãããïŒãã€ããã«åºã¥ããŠããŸãïŒããã®ãããæå
ã® Pydantic ã®è¿œå ã³ãŒããåäœããŸãã
-ããŒã¿ããŒã¹ã®ããã«<abbr title = "Object-Relational Mapper">ORM</abbr>sãã<abbr title = "Object-Document Mapper">ODM</abbr>sãªã©ã®ãPydanticã«åºã¥ãå€éšã©ã€ãã©ãªãåããŠããŸãã
+Pydantic ã«åºã¥ãå€éšã©ã€ãã©ãªïŒããŒã¿ããŒã¹çšã® <abbr title="Object-Relational Mapper - ãªããžã§ã¯ãé¢ä¿ããããŒ">ORM</abbr>ã<abbr title="Object-Document Mapper - ãªããžã§ã¯ãããã¥ã¡ã³ãããããŒ">ODM</abbr> ãªã©ïŒãå«ãŸããŸãã
-ããã¯ããã¹ãŠãèªåçã«æ€èšŒããããããå€ãã®å Žåããªã¯ãšã¹ãããååŸãããªããžã§ã¯ãã**ããŒã¿ããŒã¹ã«çŽæ¥**æž¡ãããšãã§ãããšããããšãæå³ããŠããŸãã
+ããã¯ããã¹ãŠãèªåçã«æ€èšŒããããããå€ãã®å Žåããªã¯ãšã¹ãããååŸãããªããžã§ã¯ãã **ãã®ãŸãŸããŒã¿ããŒã¹ã«** æž¡ããããšãæå³ããŸãã
-åãããšããã®éã«ãåœãŠã¯ãŸããå€ãã®å ŽåãããŒã¿ããŒã¹ããååŸãããªããžã§ã¯ãã**ã¯ã©ã€ã¢ã³ãã«çŽæ¥**æž¡ãããšãã§ããŸãã
+éæ¹åãåæ§ã§ãå€ãã®å ŽåãããŒã¿ããŒã¹ããååŸãããªããžã§ã¯ãã **ãã®ãŸãŸã¯ã©ã€ã¢ã³ãã«** æž¡ããŸãã
-**FastAPI**ã䜿çšãããšã**Pydantic**ã®ãã¹ãŠã®æ©èœãå©çšã§ããŸãïŒFastAPIãPydanticã«åºã¥ããŠãã¹ãŠã®ããŒã¿åŠçãè¡ã£ãŠããããïŒã
+**FastAPI** ã§ã¯ **Pydantic** ã®ãã¹ãŠã®æ©èœãå©çšã§ããŸãïŒFastAPI ã¯ããŒã¿åŠçã®ãã¹ãŠã§ Pydantic ã«åºã¥ããŠããŸãïŒ:
-* **brainfuckãªã**ïŒ
- * ã¹ããŒãå®çŸ©ã®ããã®ãã€ã¯ãèšèªãæ°ãã«åŠç¿ããå¿
èŠã¯ãããŸããã
- * Pythonã®åãç¥ã£ãŠããå Žåã¯ãæ¢ã«Pydanticã®äœ¿ç𿹿³ãç¥ã£ãŠããã«çããã§ãã
-* ãŠãŒã¶ãŒã® **<abbr title = "ã³ãŒããšãã£ã¿ãŒã«äŒŒãçµ±åéçºç°å¢">IDE</abbr>/<abbr title = "ã³ãŒããšã©ãŒããã§ãã¯ããããã°ã©ã ">ãªã³ã¿ãŒ</abbr>/æè ãšããŸã飿ºããŸã**ïŒ
- * Pydanticã®ããŒã¿æ§é ã¯ããŠãŒã¶ãŒãå®çŸ©ããã¯ã©ã¹ã®åãªãã€ã³ã¹ã¿ã³ã¹ã§ããããããªãŒãã³ã³ããªãŒãããªã³ãã£ã³ã°ãmypyãããã³ãŠãŒã¶ãŒã®çŽæã¯ãã¹ãŠãæ€èšŒæžã¿ã®ããŒã¿ã§é©åã«æ©èœããã¯ãã§ãã
-* **è€éãªæ§é **ãæ€èšŒïŒ
- * éå±€çãªPydanticã¢ãã«ããPythonã®ã`typing`ãã®ã`list`ããšã`dict`ããªã©ã®å©çšã
- * ã\83\90ã\83ªã\83\87ã\83΋\82¿ã\83΋\81«ã\82\88ã\82\8aã\80\81ڀ\87é\9b\91ã\81ªã\83\87ã\83΋\82¿ã\82¹ã\82Âã\83΋\83\9eã\82\92Ê\98\8e確ã\81\8bã\81€ç°¡å\8d\98ã\81«å®\9a矩ã\80\81ã\83\81ã\82§ã\83\83ã\82¯ã\81\97ã\80\81JSONã\82¹ã\82Âã\83΋\83\9eãšããŠææžåã§ããŸãã
- * æ·±ã**ãã¹ããããJSON**ãªããžã§ã¯ããäœæããããããã¹ãŠãæ€èšŒããŠã¢ãããŒã·ã§ã³ãä»ããããšãã§ããŸãã
+* **brainfuck ãªã**ïŒ
+ * ã¹ããŒãå®çŸ©ã®ããã®æ°ãããã€ã¯ãèšèªãåŠã¶å¿
èŠã¯ãããŸããã
+ * Python ã®åãç¥ã£ãŠããã°ãPydantic ã®äœ¿ãæ¹ãããããŸãã
+* **<abbr title="Integrated Development Environment - çµ±åéçºç°å¢: ã³ãŒããšãã£ã¿ã«é¡äŒŒ">IDE</abbr>/<dfn title="ã³ãŒãã®ãšã©ãŒãæ€æ»ããããã°ã©ã ">ãªã³ã¿ãŒ</dfn>/æè** ãšæ°æã¡ãã飿ºããŸãïŒ
+ * Pydantic ã®ããŒã¿æ§é ã¯ãããªããå®çŸ©ããã¯ã©ã¹ã®åãªãã€ã³ã¹ã¿ã³ã¹ãªã®ã§ããªãŒãã³ã³ããªãŒãããªã³ãã£ã³ã°ãmypyããããŠããªãã®çŽæããæ€èšŒæžã¿ããŒã¿ã«å¯ŸããŠé©åã«æ©èœããŸãã
+* **è€éãªæ§é ** ãæ€èšŒïŒ
+ * éå±€ç㪠Pydantic ã¢ãã«ããPython ã® `typing` ã«ãã `List` ã `Dict` ãªã©ãå©çšã§ããŸãã
+ * ã\81\95ã\82\89ã\81«ã\83\90ã\83ªã\83\87ã\83΋\82¿ã\81«ã\82\88ã\82\8aã\80\81ڀ\87é\9b\91ã\81ªã\83\87ã\83΋\82¿ã\82¹ã\82Âã\83΋\83\9eã\82\92Ê\98\8e確ã\81\8bã\81€å®¹Ê\98\93ã\81«å®\9a矩ã\83»Ê€\9cÊ\9fȋ\81§ã\81\8dã\80\81JSON Schema ãšããŠææžåã§ããŸãã
+ * æ·±ã **ãã¹ãããã JSON** ãªããžã§ã¯ããæ±ããããããã¹ãŠãæ€èšŒããŠã¢ãããŒã·ã§ã³ãä»äžã§ããŸãã
* **æ¡åŒµå¯èœ**ïŒ
- * Pydanticã§ã¯ãã«ã¹ã¿ã ããŒã¿åãå®çŸ©ã§ããŸãããŸãã¯ãããªããŒã¿ãŒãã³ã¬ãŒã¿ãŒã§è£
食ãããã¢ãã«ã®ã¡ãœããã䜿çšããŠæ€èšŒãæ¡åŒµã§ããŸãã
+ * Pydantic ã§ã¯ã«ã¹ã¿ã ããŒã¿åãå®çŸ©ã§ããŸãããããªããŒã¿ãã³ã¬ãŒã¿ãŒã§è£
食ããã¢ãã«ã¡ãœããã§æ€èšŒãæ¡åŒµã§ããŸãã
* ãã¹ãã«ãã¬ããž 100%ã
-# FastAPIãå¿æŽ - ãã«ãã®å
¥æ
+# FastAPIãå¿æŽ - ãã«ãã®å
¥æ { #help-fastapi-get-help }
**FastAPI** ã¯æ°ã«å
¥ããŸãããïŒ
-FastAPIããŠãŒã¶ãŒãéçºè
ãå¿æŽãããã§ããïŒ
+FastAPIãä»ã®ãŠãŒã¶ãŒãäœè
ãå¿æŽãããã§ããïŒ
-ã\82\82ã\81\97ã\81\8fã\81¯ã\80\81 **FastAPI** ã«ã€ããŠãã«ããå¿
èŠã§ããïŒ
+ã\81\9dã\82\8cã\81šã\82\82 **FastAPI** ã«ã€ããŠãã«ããå¿
èŠã§ããïŒ
-ã\81šã\81Šã\82\82ç°¡å\8d\98ã\81«å¿\9cÊ\8fŽã\81§ã\81\8dã\81Ÿã\81\99 (ã\81\9fã\81 1ã\80\812Ã¥\9b\9eã\82¯ã\83ªã\83\83ã\82¯ã\81\99ã\82\8bã\81 ã\81\91ã\81®ã\82\82ã\81®ã\82\82ã\81\82ã\82\8aã\81Ÿã\81\99)ã
+ã\81šã\81Šã\82\82ç°¡å\8d\98ã\81«å¿\9cÊ\8fŽã\81§ã\81\8dã\82\8bÊ\96¹Ê³\95ã\81\8cã\81\82ã\82\8aã\81Ÿã\81\99ïŒ\881ã\80\812Ã¥\9b\9eã\82¯ã\83ªã\83\83ã\82¯ã\81\99ã\82\8bã\81 ã\81\91ã\81®ã\82\82ã\81®ã\82\82ã\81\82ã\82\8aã\81Ÿã\81\99ïŒ\89ã
-ã\81Ÿã\81\9fã\80\81ã\83\98ã\83«ã\83\97ã\82\92Ã¥\85¥Ê\89\8bã\81\99ã\82\8bÊ\89\8bÊ®µã\81\8cããã€ããããŸãã
+ã\83\98ã\83«ã\83\97ã\82\92åŸ\97ã\82\8bÊ\96¹Ê³\95ã\82\82ããã€ããããŸãã
-## GitHubã§ **FastAPI** ã«Star
+## ãã¥ãŒã¹ã¬ã¿ãŒãè³Œèª { #subscribe-to-the-newsletter }
-GitHubã§FastAPIã«ãStarããã€ããããšãã§ããŸã (å³äžéšã®Starãã¿ã³ãã¯ãªãã¯): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. âïž
+[**FastAPI and friends** ãã¥ãŒã¹ã¬ã¿ãŒ](newsletter.md){.internal-link target=_blank}ïŒé
ä¿¡ã¯ãŸãã§ãïŒã賌èªãããšãæ¬¡ã®æ
å ±ããã£ããã¢ããã§ããŸã:
-ã¹ã¿ãŒãå¢ããããšã§ãä»ã®ãŠãŒã¶ãŒã®ç®ã«ã€ãããããªããå€ãã®äººã«ãšã£ãŠäŸ¿å©ãªãã®ã§ããããšã瀺ããŸãã
+* FastAPI ãšé¢é£ãããžã§ã¯ãã®ãã¥ãŒã¹ ð
+* ã¬ã€ã ð
+* æ©èœ âš
+* äºææ§ã«åœ±é¿ããå€æŽ ðš
+* ãã³ããã³ã â
-## GitHubã¬ããžããªã®ãªãªãŒã¹ãWatch
+## X (Twitter) ã§ FastAPI ããã©ã㌠{ #follow-fastapi-on-x-twitter }
-GitHubã§FastAPIããWatchãã§ããŸã (å³äžéšã®Watchãã¿ã³ãã¯ãªãã¯): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. ð
+<a href="https://x.com/fastapi" class="external-link" target="_blank">**X (Twitter)** ã§ @fastapi ããã©ããŒ</a>ããŠã**FastAPI** ã®ææ°æ
å ±ãåãåããŸããããðŠ
+
+## GitHubã§ **FastAPI** ã«Star { #star-fastapi-in-github }
+
+GitHubã§FastAPIã«ãStarããã€ããããšãã§ããŸãïŒå³äžéšã®Starãã¿ã³ãã¯ãªãã¯ïŒ: <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>ãâïž
+
+ã¹ã¿ãŒãå¢ããããšã§ãä»ã®ãŠãŒã¶ãŒã®ç®ã«ã€ãããããªãããã§ã«å€ãã®äººã®åœ¹ã«ç«ã£ãŠããããšãäŒãããŸãã
+
+## GitHubã¬ããžããªã®ãªãªãŒã¹ãWatch { #watch-the-github-repository-for-releases }
+
+GitHubã§FastAPIããWatchãã§ããŸãïŒå³äžéšã®ãWatchããã¿ã³ãã¯ãªãã¯ïŒ: <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>ãð
ããã§ãReleases onlyããéžæã§ããŸãã
-ãããè¡ããšã**FastAPI** ãã°ä¿®æ£ãæ°æ©èœã®å®è£
ãªã©ã®æ°ãããªãªãŒã¹ (æ°ããããŒãžã§ã³) ããããã³ã« (ã¡ãŒã«ã§) éç¥ãåãåããŸãã
+ãããè¡ããšããã°ä¿®æ£ãæ°æ©èœãå«ã **FastAPI** ã®æ°ãããªãªãŒã¹ïŒæ°ããŒãžã§ã³ïŒããããã³ã«ãïŒã¡ãŒã«ã§ïŒéç¥ãåãåããŸãã
-## éçºè
ãšã€ãªãã
+## éçºè
ãšã€ãªãã { #connect-with-the-author }
-以äžã§ã<a href="https://tiangolo.com" class="external-link" target="_blank">éçºè
(Sebastián RamÃrez / `tiangolo`)</a> ãšã³ã³ã¿ã¯ãããšããŸã:
+äœè
ã§ãã<a href="https://tiangolo.com" class="external-link" target="_blank">ç§ïŒSebastián RamÃrez / `tiangolo`ïŒ</a>ãšã€ãªãããŸãã
+
+ã§ããããš:
* <a href="https://github.com/tiangolo" class="external-link" target="_blank">**GitHub** ã§ãã©ããŒ</a>ã
- * ä»ã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã確èªã§ããŸããäœãã®å©ãã«ãªããã®ãèŠã€ãããããããŸããã
- * æ°ããªãªãŒãã³ãœãŒã¹ãããžã§ã¯ããäœæãããšãã«éç¥ãããŸãã
-* <a href="https://x.com/tiangolo" class="external-link" target="_blank">**X (Twitter)** ã§ãã©ããŒ</a>ã
- * FastAPIã®äœ¿çšçšéãæããŠãã ãã (èããŠã¿ããã§ã)ã
- * æ°ããªããŒã«ã®çºè¡šããªãªãŒã¹ãèããŸãã
-* <a href="https://www.linkedin.com/in/tiangolo/" class="external-link" target="_blank">**Linkedin** ã§ã€ãªãã</a>ã
- * æ°ããªããŒã«ã®çºè¡šããªãªãŒã¹ãèããŸã (ãã ãX (Twitter)ã®æ¹ãå©çšé »åºŠãé«ãã§ãã ð€·ââ)ã
-* <a href="https://dev.to/tiangolo" class="external-link" target="_blank">**Dev.to**</a> ã <a href="https://medium.com/@tiangolo" class="external-link" target="_blank">**Medium**</a> ã§èäœç©ãèªã (ãŸãã¯ãã©ããŒ)ã
- * ã¢ã€ãã¢ãäœæããŒã«ã«ã€ããŠã®èšäºãèªããŸãã
- * æ°èŠèšäºã®å·çãéç¥ããŠãããŸãã
+ * 圹ã«ç«ã€ãããããªããç§ãäœæããä»ã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ããèŠãããŸãã
+ * æ°ãããªãŒãã³ãœãŒã¹ãããžã§ã¯ããäœæãããšãã«ããããŸãã
+* <a href="https://x.com/tiangolo" class="external-link" target="_blank">**X (Twitter)** ã§ãã©ããŒ</a> ãŸã㯠<a href="https://fosstodon.org/@tiangolo" class="external-link" target="_blank">Mastodon</a>ã
+ * ããªããã©ã®ããã«FastAPIã䜿ã£ãŠãããæããŠãã ããïŒèãããšå¬ããã§ãïŒã
+ * æ°ããããŒã«ã®åç¥ããªãªãŒã¹ãèããŸãã
+ * ããã«ã<a href="https://x.com/fastapi" class="external-link" target="_blank">X (Twitter) ã® @fastapi</a>ïŒå¥ã¢ã«ãŠã³ãïŒããã©ããŒã§ããŸãã
+* <a href="https://www.linkedin.com/in/tiangolo/" class="external-link" target="_blank">**LinkedIn** ã§ãã©ããŒ</a>ã
+ * æ°ããããŒã«ã®åç¥ããªãªãŒã¹ãèããŸãïŒãã ãX (Twitter) ã®æ¹ããã䜿ã£ãŠããŸã ð€·ââïŒã
+* <a href="https://dev.to/tiangolo" class="external-link" target="_blank">**Dev.to**</a> ã <a href="https://medium.com/@tiangolo" class="external-link" target="_blank">**Medium**</a> ã§å·çå
容ãèªãïŒãŸãã¯ãã©ããŒïŒã
+ * ç§ã®ã¢ã€ãã¢ããäœæããããŒã«ã«é¢ããèšäºãèªããŸãã
+ * æ°ããèšäºãå
¬éãããšãã«èªããŸãã
+
+## **FastAPI** ã«ã€ããŠãã€ãŒã { #tweet-about-fastapi }
+
+<a href="https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi" class="external-link" target="_blank">**FastAPI** ã«ã€ããŠãã€ãŒã</a>ããŠããªãæ°ã«å
¥ã£ãŠããã®ããç§ãä»ã®äººã«æããŠãã ãããð
+
+**FastAPI** ãã©ã®ããã«äœ¿ãããŠããããã©ããæ°ã«å
¥ã£ãŠããããã©ã®ãããžã§ã¯ã/äŒç€Ÿã§äœ¿ã£ãŠãããçãèãããšå¬ããã§ãã
+
+## FastAPIã«æç¥š { #vote-for-fastapi }
+
+* <a href="https://www.slant.co/options/34241/~fastapi-review" class="external-link" target="_blank">Slantã§ **FastAPI** ã«æç¥š</a>ã
+* <a href="https://alternativeto.net/software/fastapi/about/" class="external-link" target="_blank">AlternativeToã§ **FastAPI** ã«æç¥š</a>ã
+* <a href="https://stackshare.io/pypi-fastapi" class="external-link" target="_blank">StackShare ã§ **FastAPI** ã䜿ã£ãŠãããšå®£èš</a>ã
+
+## GitHubã§è³ªåã«å°ã£ãŠãã人ãå©ãã { #help-others-with-questions-in-github }
+
+次ã®å Žæã§ãä»ã®äººã®è³ªåãæå©ãã§ããŸã:
+
+* <a href="https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered" class="external-link" target="_blank">GitHub Discussions</a>
+* <a href="https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+" class="external-link" target="_blank">GitHub Issues</a>
+
+å€ãã®å Žåããã®è³ªåã®çãããã§ã«ç¥ã£ãŠãããããããŸãããð€
+
+ããå€ãã®äººã®è³ªåã«çããŠå©ããŠããããªããããªãã¯å
¬åŒã®[FastAPI Expert](fastapi-people.md#fastapi-experts){.internal-link target=_blank}ã«ãªããŸããð
+
+æã倧äºãªãã€ã³ãã¯ã芪åã§ããããšããå¿ãããããšã§ãã人ã¯ãã©ã¹ãã¬ãŒã·ã§ã³ãæ±ããŠãã£ãŠæ¥ãã®ã§ãå¿
ãããæè¯ã®èãæ¹ãããŠãããšã¯éããŸããããã§ããéã芪åã«å¯Ÿå¿ããŸããããð€
+
+**FastAPI** ã³ãã¥ããã£ã¯èŠªåã§æè¿çã§ããããšãç®æããŠããŸããåæã«ãããããä»è
ãžã®ç¡ç€Œãªæ¯ãèãã¯åãå
¥ããªãã§ãã ããããäºãã倧äºã«ããŸãããã
+
+---
+
+以äžã¯ïŒDiscussions ã Issues ã§ïŒä»ã®äººã®è³ªåãæå©ãããæ¹æ³ã§ã:
+
+### 質åãçè§£ãã { #understand-the-question }
+
+* 質åè
ã®ãç®çãããŠãŒã¹ã±ãŒã¹ãçè§£ã§ããã確èªããŸãã
+
+* 次ã«ã質åïŒå€§åã¯è³ªåã§ãïŒããæç¢ºãã確èªããŸãã
+
+* å€ãã®å ŽåããŠãŒã¶ãŒãæ³åãã解決çã«ã€ããŠã®è³ªåã«ãªã£ãŠããŸããããã£ãšãè¯ããæ¹æ³ããããããããŸãããåé¡ããŠãŒã¹ã±ãŒã¹ãããããçè§£ã§ããã°ãããè¯ãã代æ¿è§£æ±ºçããææ¡ã§ãããããããŸããã
+
+* 質åãçè§£ã§ããªãå Žåã¯ãããã«ã詳现ããå°ããŸãã
+
+### åé¡ãåçŸãã { #reproduce-the-problem }
+
+å€ãã®ã±ãŒã¹ã質åã¯ããã®äººã®ãå
ã®ã³ãŒããã«é¢ä¿ããŠããŸãã
+
+ãã°ãã°ã³ãŒãã®æçã ããå
±æãããŸãããããã§ã¯åé¡ããåçŸãããã«ã¯äžååã§ãã
+
+* ããŒã«ã«ã§åããšã©ãŒãæåã確èªã§ããããã«ããŸãã¯ãŠãŒã¹ã±ãŒã¹ãããããçè§£ã§ããããã«ã**ã³ããŒ&ããŒã¹ã**ããŠå®è¡ã§ãã<a href="https://stackoverflow.com/help/minimal-reproducible-example" class="external-link" target="_blank">æå°ã®åçŸå¯èœãªäŸ</a>ã®æäŸãäŸé Œã§ããŸãã
+
+* ãšãŠãå¯å€§ãªæ°åãªããåé¡ã®èª¬æã ããããšã«ãããªãèªèº«ã§ãã®ãããª**äŸãäœæ**ããŠã¿ãããšãã§ããŸãããã ãæéããããå¯èœæ§ãé«ãã®ã§ããŸãã¯åé¡ã®æç¢ºåãäŸé Œããæ¹ãè¯ãå ŽåããããŸãã
+
+### 解決çãææ¡ãã { #suggest-solutions }
+
+* 質åãçè§£ã§ããããå¯èœãª**åç**ãæç€ºã§ããŸãã
+
+* å€ãã®å Žåãçžæã®ãæ ¹æ¬çãªåé¡ããŠãŒã¹ã±ãŒã¹ããçè§£ããããšãéèŠã§ããçžæã詊ããŠããæ¹æ³ããè¯ãè§£æ±ºæ¹æ³ããããããããªãããã§ãã
+
+### ã¯ããŒãºãäŸé Œãã { #ask-to-close }
+
+ããçžæãè¿ä¿¡ããŠããŠãããªããåé¡ã解決ã§ãããªããããã§ãšãã**ããªãã¯ããŒããŒ**ã§ãïŒðŠž
+
+* ãã®å Žåãæ¬¡ã®ããã«äŸé Œã§ããŸã:
+
+ * GitHub Discussions: ã³ã¡ã³ãã**åç**ãšããŠããŒã¯ããŠãããã
+ * GitHub Issues: issue ã**ã¯ããŒãº**ããŠãããã
+
+## GitHubã¬ããžããªãWatch { #watch-the-github-repository }
+
+GitHubã§FastAPIããWatchãã§ããŸãïŒå³äžéšã®ãWatchããã¿ã³ãã¯ãªãã¯ïŒ: <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>ãð
+
+ãReleases onlyãã§ã¯ãªããWatchingããéžæãããšãæ°ãã issue ã質åãäœæããããšãã«éç¥ãåãåããŸããæ°ãã issue ã®ã¿ãDiscussions ã®ã¿ãPR ã®ã¿ããªã©éç¥å¯Ÿè±¡ãçµãããšãã§ããŸãã
+
+ãã®äžã§ããããã質åã®è§£æ±ºãæå©ãã§ããŸãã
+
+## 質åãã { #ask-questions }
+
+GitHubã¬ããžããªã§<a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">æ°ãã質å</a>ãäœæã§ããŸããäŸãã°:
+
+* **質å**ãããããŸãã¯**åé¡**ã«ã€ããŠå°ããã
+* æ°ãã**æ©èœ**ãææ¡ããã
+
+**Note**: ãããããããªããä»ã®äººã®æå©ãããé¡ãããŸããð
+
+## ãã«ãªã¯ãšã¹ããã¬ãã¥ãŒ { #review-pull-requests }
+
+ä»ã®äººããã®ãã«ãªã¯ãšã¹ãã®ã¬ãã¥ãŒãæäŒã£ãŠããããŸãã
+
+ããã§ããã§ããéã芪åã§ããããã«ããŠãã ãããð€
+
+---
+
+ãã«ãªã¯ãšã¹ããã¬ãã¥ãŒãããšãã®ãã€ã³ãã§ã:
+
+### åé¡ãçè§£ãã { #understand-the-problem }
+
+* ãŸãããã®ãã«ãªã¯ãšã¹ãã解決ããããšããŠãã**åé¡ãçè§£**ããŠãã ãããé·ãã®è°è«ã GitHub Discussion ã issue ã«ãããããããŸããã
+
+* ãã®åé¡ã¯å®ã¯**å¥ã®æ¹æ³**ã§è§£æ±ºã§ãããã«ãªã¯ãšã¹ãèªäœãäžèŠãªå ŽåããããŸãããã®å Žåã¯ããã®ææ¡ã質åãããŠãè¯ãã§ãããã
+
+### ã¹ã¿ã€ã«ã¯æ°ã«ããããªã { #dont-worry-about-style }
+
+* ã³ãããã¡ãã»ãŒãžã®ã¹ã¿ã€ã«ãªã©ã¯ããŸãæ°ã«ããªããŠå€§äžå€«ã§ããç§ã¯ squash and merge ã䜿ããã³ããããæåã§èª¿æŽããŸãã
+
+* ã¹ã¿ã€ã«ã«ãŒã«ã«ã€ããŠãå¿é
ç¡çšã§ããèªååããŒã«ããã§ã«ãã§ãã¯ããŠããŸãã
+
+ã»ãã«ã¹ã¿ã€ã«ãäžè²«æ§ã®èŠä»¶ãããã°ãç§ããçŽæ¥äŸé ŒããŸãããå¿
èŠãªå€æŽãäžã«ç©ã圢ã§ã³ãããã远å ããŸãã
+
+### ã³ãŒããç¢ºèª { #check-the-code }
+
+* ã³ãŒãã確èªããŠèªã¿ã劥åœãã©ãããèŠãŠã**ããŒã«ã«ã§å®è¡**ããæ¬åœã«åé¡ã解決ããŠããã確ãããŠãã ããã
+
+* ãã®ããã§ããããè¡ã£ãããšã**ã³ã¡ã³ã**ã§äŒããŠãã ãããããããã°ãå®éã«ç¢ºèªããŠããããšããããŸãã
+
+/// info | æ
å ±
+
+æ®å¿µãªãããæ¿èªãè€æ°ã€ããã ãã®PRãããã®ãŸãŸä¿¡é Œããããšã¯ã§ããŸããã
+
+説æãé
åçãªãããã3ä»¶ã5件以äžã®æ¿èªãã€ããŠããŠããå®éã«PRã確èªãããšå£ããŠãããããã°ããã£ããã䞻匵ããåé¡ã解決ããŠããªãã£ããããããšãäœåºŠããããŸãããð
+
+ã§ãã®ã§ãå®éã«ã³ãŒããèªã¿ãå®è¡ããŠç¢ºèªãããããã³ã¡ã³ãã§ç¥ãããŠããããããšãæ¬åœã«éèŠã§ããð€
+
+///
+
+* ããPRãç°¡çŽ åã§ããããªãããã®äŸé ŒãããŠãæ§ããŸãããã现ããç¹ã«ãã ããéããå¿
èŠã¯ãããŸããã䞻芳çãªèŠæ¹ãå€ãïŒç§ã«ããããŸã ðïŒãåºæ¬çãªç¹ã«éäžã§ãããšããè¯ãã§ãããã
+
+### ãã¹ã { #tests }
+
+* PRã«**ãã¹ã**ãããã確èªãæäŒã£ãŠãã ããã
+
+* PRåã¯ãã¹ãã**倱æ**ããããšã確èªããŸããðš
+
+* ãããŠPRåŸã«ãã¹ãã**æå**ããããšã確èªããŸããâ
-## **FastAPI** ã«é¢ãããã€ãŒã
+* å€ãã®PRã«ã¯ãã¹ãããããŸããããã¹ãã®è¿œå ã**ãªãã€ã³ã**ãããããã¹ãã**ææ¡**ãããã§ããŸããããã¯æãæéãæ¶è²»ããéšåã®äžã€ã§ã倧ãã«å©ãã«ãªããŸãã
-<a href="https://x.com/compose/tweet?text=I'm loving FastAPI because... https://github.com/fastapi/fastapi cc @tiangolo" class="external-link" target="_blank">**FastAPI** ã«ã€ããŠãã€ãŒã</a>ããéçºè
ãä»ã®äººã«ã©ããæ°ã«å
¥ã£ãã®ãæããŠãã ãããð
+* äœã詊ããããã³ã¡ã³ãããŠãã ãããããããã°ã確èªããŠãããããšãããããŸããð€
-**FastAPI** ãã©ã®ããã«äœ¿ãããã©ããæ°ã«å
¥ãããã©ããªãããžã§ã¯ã/äŒç€Ÿã§äœ¿ãããŠããããªã©ã«ã€ããŠç¥ãããã§ãã
+## ãã«ãªã¯ãšã¹ããäœæ { #create-a-pull-request }
-## FastAPIã«æç¥š
+[è²¢ç®](contributing.md){.internal-link target=_blank}ãšããŠã次ã®ããã«ãã«ãªã¯ãšã¹ãã§ãœãŒã¹ã³ãŒãã«è²¢ç®ã§ããŸã:
-* <a href="https://www.slant.co/options/34241/~fastapi-review" class="external-link" target="_blank">Slantã§ **FastAPI** ã«æç¥š</a>
-* <a href="https://alternativeto.net/software/fastapi/" class="external-link" target="_blank">AlternativeToã§ **FastAPI** ã«æç¥š</a>
-* <a href="https://github.com/marmelab/awesome-rest/pull/93" class="external-link" target="_blank">awesome-restã§ **FastAPI** ã«æç¥š</a>
+* ããã¥ã¡ã³ãã§èŠã€ããã¿ã€ãã®ä¿®æ£ã
+* èªåãäœæ/çºèŠãã FastAPI ã«é¢ããèšäºã»åç»ã»ããããã£ã¹ããã<a href="https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml" class="external-link" target="_blank">ãã®ãã¡ã€ã«ãç·šé</a>ããŠå
±æã
+ * 該åœã»ã¯ã·ã§ã³ã®å
é ã«ãªã³ã¯ã远å ããŠãã ããã
+* èªåã®èšèªãžã®[ããã¥ã¡ã³ã翻蚳ãæäŒã](contributing.md#translations){.internal-link target=_blank}ã
+ * ä»ã®äººãäœæãã翻蚳ã®ã¬ãã¥ãŒãæäŒããŸãã
+* æ°ããããã¥ã¡ã³ãã»ã¯ã·ã§ã³ã®ææ¡ã
+* æ¢åã®issue/ãã°ã®ä¿®æ£ã
+ * ãã¹ãã远å ããŠãã ããã
+* æ°æ©èœã®è¿œå ã
+ * ãã¹ãã远å ããŠãã ããã
+ * é¢é£ãããã°ããã¥ã¡ã³ãã远å ããŠãã ããã
-## GitHub issuesã§ä»ã®äººãå©ãã
+## FastAPIã®ã¡ã³ããã³ã¹ãæäŒã { #help-maintain-fastapi }
-<a href="https://github.com/fastapi/fastapi/issues" class="external-link" target="_blank">æ¢åã®issues</a>ã確èªããŠãä»ã®äººãå©ããŠã¿ãŠãã ãããçãããåçãç¥ã£ãŠãããããããªã質åãã»ãšãã©ã§ããð€
+**FastAPI** ã®ã¡ã³ããã³ã¹ãæäŒã£ãŠãã ããïŒð€
-## GitHubã¬ããžããªãWatch
+ããããšã¯ããããããããã®å€ãã¯**ããªã**ã«ãã§ããŸãã
-GitHubã§FastAPIããwatchãã§ããŸã (å³äžéšã®ãwatchããã¿ã³ãã¯ãªãã¯): <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">https://github.com/fastapi/fastapi</a>. ð
+ä»ããã§ããäž»ãªã¿ã¹ã¯ã¯æ¬¡ã®ãšããã§ã:
-ãReleases onlyãã§ã¯ãªããWatchingããéžæãããšãæ°ããªissueãç«ãŠãããéã«éç¥ãããŸãã
+* [GitHubã§è³ªåã«å°ã£ãŠãã人ãå©ãã](#help-others-with-questions-in-github){.internal-link target=_blank}ïŒäžã®ã»ã¯ã·ã§ã³ãåç
§ïŒã
+* [ãã«ãªã¯ãšã¹ããã¬ãã¥ãŒ](#review-pull-requests){.internal-link target=_blank}ïŒäžã®ã»ã¯ã·ã§ã³ãåç
§ïŒã
-ã\81\9dã\81\97ã\81Šã\80\81issueã\82\92Ú§£Ê±ºã\81\97À»\96ã\81®Àººã\82\92Ã¥\8a©ã\81\91ã\82\8bã\81\93ã\81šã\81\8cã\81§ã\81\8dã\81Ÿãã
+ã\81\93ã\81®2ã\81ۋ\81\8c**Ê\9c\80ã\82\82Ê\99\82é\96\93ã\82\92ʶ\88Ú²»**ã\81\97ã\81Ÿã\81\99ã\80\82FastAPI ã\81®ã\83¡ã\83³ã\83\86ã\83\8aã\83³ã\82¹Àœ\9cÊ¥Âã\81®ÀžÂå¿\83ã\81§ãã
-## issuesãç«ãŠã
+ãããæäŒã£ãŠãããããšã**FastAPIã®ã¡ã³ããã³ã¹ã«è²¢ç®**ãã**ããéãã»ããè¯ãåé²**ã§ããããã«ãªããŸããð
-GitHubã¬ããžããªã§<a href="https://github.com/fastapi/fastapi/issues/new/choose" class="external-link" target="_blank">æ°ããªissueãç«ãŠãããŸã</a>ãäŸãã°:
+## ãã£ããã«åå { #join-the-chat }
-* 質åããŸãã¯ãåé¡ã®å ±å
-* æ°æ©èœã®ææ¡
+ð¥ <a href="https://discord.gg/VQjSZaeJmf" class="external-link" target="_blank">Discord ãã£ãããµãŒããŒ</a> ð¥ ã«åå ããFastAPI ã³ãã¥ããã£ã®ã¿ããªãšäº€æµããŸãããã
-**Note**: issueãç«ãŠã人ã¯ãä»ã®äººã®æå©ãããé¡ãããŸããð
+/// tip | è±ç¥è
-## ãã«ãªã¯ãšã¹ãããã
+質å㯠<a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">GitHub Discussions</a> ã«æçš¿ããŠãã ããããããªã[FastAPI Experts](fastapi-people.md#fastapi-experts){.internal-link target=_blank}ããå©ããŠããããå¯èœæ§ããã£ãšé«ãã§ãã
-以äžã®æ§ãª<a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">ãã«ãªã¯ãšã¹ããäœæ</a>ã§ããŸã:
+ãã£ããã¯äžè¬çãªäŒè©±ã®ã¿ã«äœ¿ããŸãããã
-* ããã¥ã¡ã³ãã®ã¿ã€ããã¹ãä¿®æ£ã
-* æ°ããªããã¥ã¡ã³ãã»ã¯ã·ã§ã³ãææ¡ã
-* æ¢åã®issue/ãã°ãä¿®æ£ã
-* æ°æ©èœã远å ã
+///
-## éçºè
ã®ã¹ãã³ãµãŒã«ãªã
+### 質åã§ãã£ããã䜿ããªã { #dont-use-the-chat-for-questions }
-<a href="https://github.com/sponsors/tiangolo" class="external-link" target="_blank">GitHub sponsors</a>ãéããŠéçºè
ãçµæžçã«ãµããŒãã§ããŸãã
+ãã£ããã¯ãèªç±ãªäŒè©±ãããããããããäžè¬çãããŠçãã«ãã質åã«ãªããã¡ã§ãããã®ãããåçãåŸãããªãå¯èœæ§ããããŸãã
-ããã§ãæè¬ã®æ°æã¡ãäŒããããã«ã³ãŒããŒâïžãè²·ãããšãã§ããŸã ðã
+GitHub ã§ã¯ããã³ãã¬ãŒããæ£ãã圢ã§è³ªåãæžãã®ãå©ããŠããããããè¯ãåçãåŸããããªããŸããã質åããåã«èªåã§åé¡ã解決ã§ããããšããããŸããããã«GitHubãªããæéãããã£ãŠãç§ãå¿
ããã¹ãŠã«åçã§ããããã«ã§ããŸãããã£ããã§ã¯ç§å人ã«ã¯ãããã§ããŸãããð
-## FastAPIã匷åããããŒã«ã®ã¹ãã³ãµãŒã«ãªã
+ãã£ããã§ã®äŒè©±ã¯GitHubã»ã©æ€çŽ¢ãããããªãããã質åãšåçãäŒè©±ã«åãããã¡ã§ãããããŠã[FastAPI Expert](fastapi-people.md#fastapi-experts){.internal-link target=_blank}ã«ãªãããã«ã«ãŠã³ããããã®ã¯GitHubäžã®æŽ»åã ãã§ããã§ããããGitHubã®æ¹ã泚ç®ãéããããã§ãããã
-ããã¥ã¡ã³ãã§èŠãããã«ãFastAPIã¯StarletteãšPydanticãšãã巚人ã®è©ã«ä¹ã£ãŠããŸãã
+äžæ¹ã§ããã£ããã«ã¯æ°å人ã®ãŠãŒã¶ãŒããããããã»ãŒåžžã«èª°ããšäŒè©±ã§ããå¯èœæ§ãé«ãã§ããð
-以äžã®ã¹ãã³ãµãŒã«ãªãããšãã§ããŸã:
+## äœè
ãã¹ãã³ãµãŒ { #sponsor-the-author }
-* <a href="https://github.com/sponsors/samuelcolvin" class="external-link" target="_blank">Samuel Colvin (Pydantic)</a>
-* <a href="https://github.com/sponsors/encode" class="external-link" target="_blank">Encode (Starlette, Uvicorn)</a>
+ããªãã®**補å/äŒç€Ÿ**ã **FastAPI** ã«äŸåããŠããããŸãã¯é¢é£ããŠããããã®ãŠãŒã¶ãŒã«ãªãŒããããå Žåã¯ã<a href="https://github.com/sponsors/tiangolo" class="external-link" target="_blank">GitHub sponsors</a> ãéããŠäœè
ïŒç§ïŒãæ¯æŽã§ããŸãããã©ã³ã«å¿ããŠãããã¥ã¡ã³ãã«ãããžã衚瀺ããããªã©ã®ç¹å
žãããå ŽåããããŸããð
---
-# æŽå²ãèšèšããããŠãããã
+# æŽå²ãèšèšããããŠãããã { #history-design-and-future }
-å°ãåã«ã<a href="https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920" class="external-link" target="_blank">**FastAPI**
-ã®ãŠãŒã¶ãŒã«ä»¥äžã®æ§ã«å°ããããŸãã</a>:
+å°ãåã«ã<a href="https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920" class="external-link" target="_blank">**FastAPI**ã®ãŠãŒã¶ãŒã«ä»¥äžã®æ§ã«å°ããããŸãã</a>:
> ãã®ãããžã§ã¯ãã®æŽå²ã¯ïŒäœããªããšãããããæ°é±éã§ããããã®ãã§ããŠããããã§ãã [...]
ããããã®æŽå²ã®ã»ãã®äžéšã§ãã
-## ä»£æ¿ææ®µ
+## ä»£æ¿ææ®µ { #alternatives }
æ°å¹Žåãããç§ã¯è€éãªèŠä»¶ãæã€API (æ©æ¢°åŠç¿ã忣ã·ã¹ãã ãéåæãžã§ããNoSQLããŒã¿ããŒã¹ãªã©) ãäœæããŠãããããã€ãã®éçºè
ããŒã ãçããŠããŸãã
<blockquote markdown="1">
-**FastAPI**ã\81¯ã\80\81À»£Ê\9b¿ã\83\84ã\83΋\83«ã®ãããŸã§ã®åãããªããã°ååšããªãã£ãã§ãããã
+**FastAPI**ã\81¯ã\80\81À»\96ã\81®Àººã\80\85ã®ãããŸã§ã®åãããªããã°ååšããªãã£ãã§ãããã
以åã«äœãããå€ãã®ããŒã«ããäœæã«ãããåºæ¿ãšããŠåœ¹ç«ã£ãŠããŸããã
</blockquote>
-## 調æ»
+## èª¿æ» { #investigation }
ãã¹ãŠæ¢åã®ä»£æ¿ææ®µã䜿ãããšã§ããã®ãã¹ãŠãåŠã³ãã¢ã€ãã¢ãåŸãŠãèªåãäžç·ã«ä»äºãããŠããéçºè
ã®ããŒã ã«ãšã£ãŠæè¯ã®æ¹æ³ã§çµã¿åãããæ©äŒãåŸãŸããã
ããã§ã**FastAPI**ã®ã³ãŒããæžãå§ããåã«ãOpenAPIãJSON SchemaãOAuth2ãªã©ã®ä»æ§ãæ°ã¶æãããŠå匷ãããããã®é¢ä¿ãéè€ããç®æãçžéç¹ãçè§£ããŸããã
-## èšèš
+## èšèš { #design }
ãã®åŸã (FastAPIã䜿ãéçºè
ãšããŠ) ãŠãŒã¶ãŒã欲ãããAPIãã®èšèšã«æéãè²»ãããŸããã
ãã¹ãŠã®ç®æã§ããã¹ãŠã®éçºè
ã«æé«ã®éçºäœéšãæäŸããŸããã
-## èŠä»¶
+## èŠä»¶ { #requirements }
ããã€ãã®ä»£æ¿ææ³ã詊ããããšãç§ã¯<a href="https://docs.pydantic.dev/" class="external-link" target="_blank">**Pydantic**</a>ã®åŒ·ã¿ãå©çšããããšã決ããŸããã
ãããŠãJSON Schemaã«å®å
šã«æºæ ããããã«ããããå¶çŽå®£èšãå®çŸ©ããããŸããŸãªæ¹æ³ããµããŒãããããããã€ãã®ãšãã£ã¿ãŒã§ã®ãã¹ãã«åºã¥ããŠãšãã£ã¿ãŒã®ãµããŒã (åãã§ãã¯ãèªåè£å®) ãæ¹åããããã«è²¢ç®ããŸããã
-é\96\8bç\99ºÀžÂã\80\81ã\82\82ã\81\861ã\81ۋ\81®é\87\8dڊ\81ã\81ªé\8dµã\81šã\81ªã\82\8b<a href="https://www.starlette.dev/" class="external-link" target="_blank">**Starlette**</a>ã\80\81ã\81«ã\82\82Ú²¢ç\8c®ã\81\97ã\81Ÿã\81\97ã\81\9fã\80\82
+éçºäžããã1ã€ã®éèŠãªéµãšãªã<a href="https://www.starlette.dev/" class="external-link" target="_blank">**Starlette**</a>ã«ãè²¢ç®ããŸããã
-## éçº
+## éçº { #development }
ç§ã**FastAPI**èªäœã®äœæãéå§ããæã«ã¯ãã»ãšãã©ã®éšåããã§ã«æºåãããŠãããèšèšãå®çŸ©ãããå¿
èŠãªæ¡ä»¶ãšããŒã«ã®æºåãã§ããŠããŸããããããŠèŠæ Œã仿§ã«é¢ããç¥èããæç¢ºã«ãªããæŽæ°ãããŠããŸããã
-## ãããã
+## ãããã { #future }
ãã®æç¹ã§ãã§ã«ããããã®ã¢ã€ãã¢ãæã£ã**FastAPI**ãå€ãã®äººã®åœ¹ã«ç«ã£ãŠããããšã¯æããã§ãã
--- /dev/null
+# å€ã 403 èªèšŒãšã©ãŒã®ã¹ããŒã¿ã¹ã³ãŒãã䜿ã { #use-old-403-authentication-error-status-codes }
+
+FastAPI ããŒãžã§ã³ `0.122.0` ããåã¯ãçµ±åãããã»ãã¥ãªãã£ãŠãŒãã£ãªãã£ãèªèšŒã«å€±æããŠã¯ã©ã€ã¢ã³ããžãšã©ãŒãè¿ãéãHTTP ã¹ããŒã¿ã¹ã³ãŒã `403 Forbidden` ã䜿çšããŠããŸããã
+
+FastAPI ããŒãžã§ã³ `0.122.0` 以éã§ã¯ãããé©å㪠HTTP ã¹ããŒã¿ã¹ã³ãŒã `401 Unauthorized` ã䜿çšããHTTP 仿§ã«åŸã£ãŠã¬ã¹ãã³ã¹ã«åŠ¥åœãª `WWW-Authenticate` ããããŒãå«ããŸãã<a href="https://datatracker.ietf.org/doc/html/rfc7235#section-3.1" class="external-link" target="_blank">RFC 7235</a>ã<a href="https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized" class="external-link" target="_blank">RFC 9110</a>ã
+
+ããããäœããã®çç±ã§ã¯ã©ã€ã¢ã³ããåŸæ¥ã®æåã«äŸåããŠããå Žåã¯ãã»ãã¥ãªãã£ã¯ã©ã¹ã§ã¡ãœãã `make_not_authenticated_error` ããªãŒããŒã©ã€ãããããšã§ããã®æåã«æ»ããŸãã
+
+ããšãã°ãæ¢å®ã® `401 Unauthorized` ãšã©ãŒã®ä»£ããã« `403 Forbidden` ãšã©ãŒãè¿ã `HTTPBearer` ã®ãµãã¯ã©ã¹ãäœæã§ããŸã:
+
+{* ../../docs_src/authentication_error_status_code/tutorial001_an_py310.py hl[9:13] *}
+
+/// tip | è±ç¥è
+
+ãã®é¢æ°ã¯äŸå€ã€ã³ã¹ã¿ã³ã¹ãè¿ãç¹ã«æ³šæããŠãã ãããããã§ã¯äŸå€ãéåºããŸãããéåºã¯å
éšã®ä»ã®ã³ãŒãã§è¡ãããŸãã
+
+///
ããã»ãã¥ãªãã£äžã®æ¬ é¥ããœãŒã¹ã³ãŒãã«ãããªãã°ãããã¯ååšãããŸãŸã§ãã
-ããã¥ã¡ã³ããŒã·ã§ã³ãé衚瀺ã«ããã®ã¯ãåã«ããªãã®APIãžã®ã¢ã¯ã»ã¹æ¹æ³ãé£è§£ã«ããã ãã§ãªããåæã«ããªãèªèº«ã®æ¬çªç°å¢ã§ã®APIã®ãããã°ãå°é£ã«ããŠããŸãå¯èœæ§ããããŸããåçŽã«ã <a href="https://en.wikipedia.org/wiki/Security_through_obscurity" class="external-link" target="_blank">Security through obscurity</a> ã®äžã€ã®åœ¢æ
ãšããŠèããããã§ãããã
+ããã¥ã¡ã³ããŒã·ã§ã³ãé衚瀺ã«ããã®ã¯ãåã«ããªãã®APIãžã®ã¢ã¯ã»ã¹æ¹æ³ãé£è§£ã«ããã ãã§ãªããåæã«ããªãèªèº«ã®æ¬çªç°å¢ã§ã®APIã®ãããã°ãå°é£ã«ããŠããŸãå¯èœæ§ããããŸããåçŽã«ã <a href="https://en.wikipedia.org/wiki/Security_through_obscurity" class="external-link" target="_blank">ç§å¿ã«ããã»ãã¥ãªãã£</a> ã®äžã€ã®åœ¢æ
ãšããŠèããããã§ãããã
ããããªãã®APIã®ã»ãã¥ãªãã£ã匷åããããªããããã€ãã®ããããæ¹æ³ããããŸããäŸã瀺ããšã
äŸãã°ã
-{* ../../docs_src/conditional_openapi/tutorial001_py39.py hl[6,11] *}
+{* ../../docs_src/conditional_openapi/tutorial001_py310.py hl[6,11] *}
ããã§ã¯ `openapi_url` ã®èšå®ããããã©ã«ãã® `"/openapi.json"` ã®ãŸãŸå®£èšããŠããŸãã
--- /dev/null
+# Swagger UI ã®èšå® { #configure-swagger-ui }
+
+ããã€ãã®è¿œå ã® <a href="https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/" class="external-link" target="_blank">Swagger UI ãã©ã¡ãŒã¿</a>ãèšå®ã§ããŸãã
+
+èšå®ããã«ã¯ã`FastAPI()` ã®ã¢ããªãªããžã§ã¯ããäœæãããšãããŸã㯠`get_swagger_ui_html()` 颿°ã« `swagger_ui_parameters` åŒæ°ãæž¡ããŸãã
+
+`swagger_ui_parameters` ã¯ãSwagger UI ã«çŽæ¥æž¡ãããèšå®ãå«ãèŸæžãåãåããŸãã
+
+FastAPI ã¯ãããã®èšå®ã **JSON** ã«å€æããJavaScript ãšäºæã«ããŸããSwagger UI ãå¿
èŠãšããã®ã¯ãã®åœ¢åŒã§ãã
+
+## ã·ã³ã¿ãã¯ã¹ãã€ã©ã€ããç¡å¹å { #disable-syntax-highlighting }
+
+äŸãã°ãSwagger UI ã®ã·ã³ã¿ãã¯ã¹ãã€ã©ã€ããç¡å¹åã§ããŸãã
+
+èšå®ã倿Žããªããã°ãã·ã³ã¿ãã¯ã¹ãã€ã©ã€ãã¯ããã©ã«ãã§æå¹ã§ã:
+
+<img src="/img/tutorial/extending-openapi/image02.png">
+
+ãããã`syntaxHighlight` ã `False` ã«èšå®ãããšç¡å¹åã§ããŸã:
+
+{* ../../docs_src/configure_swagger_ui/tutorial001_py310.py hl[3] *}
+
+...ãã®å ŽåãSwagger UI ã§ã¯ã·ã³ã¿ãã¯ã¹ãã€ã©ã€ãã衚瀺ãããªããªããŸã:
+
+<img src="/img/tutorial/extending-openapi/image03.png">
+
+## ããŒãã®å€æŽ { #change-the-theme }
+
+åæ§ã«ãã㌠`"syntaxHighlight.theme"`ïŒéäžã«ããããå«ãŸããŠããç¹ã«æ³šæïŒã§ã·ã³ã¿ãã¯ã¹ãã€ã©ã€ãã®ããŒããèšå®ã§ããŸã:
+
+{* ../../docs_src/configure_swagger_ui/tutorial002_py310.py hl[3] *}
+
+ãã®èšå®ã«ãããã·ã³ã¿ãã¯ã¹ãã€ã©ã€ãã®é
è²ããŒããå€ãããŸã:
+
+<img src="/img/tutorial/extending-openapi/image04.png">
+
+## æ¢å®ã® Swagger UI ãã©ã¡ãŒã¿ã®å€æŽ { #change-default-swagger-ui-parameters }
+
+FastAPI ã«ã¯ãå€ãã®ãŠãŒã¹ã±ãŒã¹ã«é©ããæ¢å®ã®èšå®ãã©ã¡ãŒã¿ãå«ãŸããŠããŸãã
+
+æ¢å®ã§ã¯æ¬¡ã®èšå®ãå«ãŸããŸã:
+
+{* ../../fastapi/openapi/docs.py ln[9:24] hl[18:24] *}
+
+åŒæ° `swagger_ui_parameters` ã«å¥ã®å€ãæå®ããããšã§ãããããäžæžãã§ããŸãã
+
+äŸãã°ã`deepLinking` ãç¡å¹åããã«ã¯ã次ã®èšå®ã `swagger_ui_parameters` ã«æž¡ããŸã:
+
+{* ../../docs_src/configure_swagger_ui/tutorial003_py310.py hl[3] *}
+
+## ãã®ä»ã® Swagger UI ãã©ã¡ãŒã¿ { #other-swagger-ui-parameters }
+
+å©çšå¯èœãªä»ã®ãã¹ãŠã®èšå®ã«ã€ããŠã¯ãå
¬åŒã® <a href="https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/" class="external-link" target="_blank">Swagger UI ãã©ã¡ãŒã¿ã®ããã¥ã¡ã³ã</a>ãåç
§ããŠãã ããã
+
+## JavaScript å°çšã®èšå® { #javascript-only-settings }
+
+Swagger UI ã§ã¯ãä»ã«ã **JavaScript å°çš** ã®ãªããžã§ã¯ãïŒäŸ: JavaScript ã®é¢æ°ïŒã«ããèšå®ãå¯èœã§ãã
+
+FastAPI ã«ã¯ã次㮠JavaScript å°çšã® `presets` èšå®ãå«ãŸããŠããŸã:
+
+```JavaScript
+presets: [
+ SwaggerUIBundle.presets.apis,
+ SwaggerUIBundle.SwaggerUIStandalonePreset
+]
+```
+
+ãããã¯æååã§ã¯ãªã **JavaScript** ã®ãªããžã§ã¯ãã§ãããããPython ã®ã³ãŒãããçŽæ¥æž¡ãããšã¯ã§ããŸããã
+
+ãã®ãã㪠JavaScript å°çšã®èšå®ã䜿ãå¿
èŠãããå Žåã¯ãäžèšã®ããããã®æ¹æ³ã䜿çšããSwagger UI ã® path operation ããªãŒããŒã©ã€ãããŠãå¿
èŠãª JavaScript ãæåã§èšè¿°ããŠãã ããã
--- /dev/null
+# ã«ã¹ã¿ã ããã¥ã¡ã³ã UI ã®éçã¢ã»ããïŒã»ã«ããã¹ãã£ã³ã°ïŒ { #custom-docs-ui-static-assets-self-hosting }
+
+API ããã¥ã¡ã³ã㯠**Swagger UI** ãš **ReDoc** ã䜿çšããŠãããããããã«ããã€ãã® JavaScript ãš CSS ãã¡ã€ã«ãå¿
èŠã§ãã
+
+æ¢å®ã§ã¯ããããã®ãã¡ã€ã«ã¯ <abbr title="Content Delivery Network - ã³ã³ãã³ãé
ä¿¡ãããã¯ãŒã¯: éåžžã¯è€æ°ã®ãµãŒããŒã§æ§æãããJavaScript ã CSS ãªã©ã®éçãã¡ã€ã«ãæäŸãããµãŒãã¹ãã¯ã©ã€ã¢ã³ãã«è¿ããµãŒããŒãããããã®ãã¡ã€ã«ãé
ä¿¡ããããšã§ãããã©ãŒãã³ã¹ãæ¹åããããã«ãã䜿ãããŸãã">CDN</abbr> ããé
ä¿¡ãããŸãã
+
+ããããã«ã¹ã¿ãã€ãºããããšãå¯èœã§ãç¹å®ã® CDN ãæå®ããããèªåã§ãã¡ã€ã«ãé
ä¿¡ãããã§ããŸãã
+
+## JavaScript ãš CSS ã®ã«ã¹ã¿ã CDN { #custom-cdn-for-javascript-and-css }
+
+å¥ã® <abbr title="Content Delivery Network - ã³ã³ãã³ãé
ä¿¡ãããã¯ãŒã¯">CDN</abbr> ã䜿ããããšããŸããäŸãã° `https://unpkg.com/` ã䜿ãããå Žåã§ãã
+
+äŸãã°ãäžéšã® URL ãå¶éãããŠããåœã«äœãã§ããå Žåã«åœ¹ç«ã¡ãŸãã
+
+### èªåããã¥ã¡ã³ãã®ç¡å¹å { #disable-the-automatic-docs }
+
+æåã®æé ã¯èªåããã¥ã¡ã³ããç¡å¹åããããšã§ããããã©ã«ãã§ã¯ãããã¯æ¢å®ã® CDN ã䜿çšããŸãã
+
+ç¡å¹åããã«ã¯ã`FastAPI` ã¢ããªäœææã«ãããã® URL ã `None` ã«èšå®ããŸã:
+
+{* ../../docs_src/custom_docs_ui/tutorial001_py310.py hl[8] *}
+
+### ã«ã¹ã¿ã ããã¥ã¡ã³ãã®è¿œå { #include-the-custom-docs }
+
+ããã§ãã«ã¹ã¿ã ããã¥ã¡ã³ãçšã® *path operations* ãäœæã§ããŸãã
+
+FastAPI ã®å
éšé¢æ°ãåå©çšããŠããã¥ã¡ã³ãçšã® HTML ããŒãžãçæããå¿
èŠãªåŒæ°ãæž¡ããŸã:
+
+- `openapi_url`: ããã¥ã¡ã³ãã® HTML ããŒãžã API ã® OpenAPI ã¹ããŒããååŸãã URLãããã§ã¯å±æ§ `app.openapi_url` ã䜿çšã§ããŸãã
+- `title`: API ã®ã¿ã€ãã«ã
+- `oauth2_redirect_url`: æ¢å®å€ã䜿ãã«ã¯ããã§ `app.swagger_ui_oauth2_redirect_url` ã䜿çšã§ããŸãã
+- `swagger_js_url`: Swagger UI ããã¥ã¡ã³ãçšã® HTML ãååŸãã JavaScript ãã¡ã€ã«ã® URLãããã¯ã«ã¹ã¿ã CDN ã® URL ã§ãã
+- `swagger_css_url`: Swagger UI ããã¥ã¡ã³ãçšã® HTML ãååŸãã CSS ãã¡ã€ã«ã® URLãããã¯ã«ã¹ã¿ã CDN ã® URL ã§ãã
+
+ReDoc ã«ã€ããŠãåæ§ã§ã...
+
+{* ../../docs_src/custom_docs_ui/tutorial001_py310.py hl[2:6,11:19,22:24,27:33] *}
+
+/// tip | è±ç¥è
+
+`swagger_ui_redirect` çšã® *path operation* ã¯ãOAuth2 ã䜿çšããå Žåã®è£å©ã§ãã
+
+API ã OAuth2 ãããã€ããšçµ±åãããšãèªèšŒãå®è¡ããŠååŸããã¯ã¬ãã³ã·ã£ã«ãæã£ãç¶æ
ã§ API ããã¥ã¡ã³ãã«æ»ããŸãããããŠå®éã® OAuth2 èªèšŒãçšããŠããã¥ã¡ã³ãäžãã API ãšå¯Ÿè©±ã§ããŸãã
+
+Swagger UI ããã®åŠçãè£åŽã§è¡ããŸããããã®ããã«ãã®ãredirectãã®è£å©ãå¿
èŠã§ãã
+
+///
+
+### ãã¹ãçšã® *path operation* ãäœæ { #create-a-path-operation-to-test-it }
+
+ãã¹ãŠãåäœãããããã¹ãã§ããããã«ã*path operation* ãäœæããŸã:
+
+{* ../../docs_src/custom_docs_ui/tutorial001_py310.py hl[36:38] *}
+
+### ãã¹ã { #test-it }
+
+ããã§ã<a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> ã«ã¢ã¯ã»ã¹ããŠããŒãžãåèªã¿èŸŒã¿ãããšãæ°ãã CDN ãããããã®ã¢ã»ãããèªã¿èŸŒãŸããã¯ãã§ãã
+
+## ããã¥ã¡ã³ãçš JavaScript ãš CSS ã®ã»ã«ããã¹ãã£ã³ã° { #self-hosting-javascript-and-css-for-docs }
+
+ãªãã©ã€ã³ïŒã€ã³ã¿ãŒããã鿥ç¶ïŒã§ãããããã¯ããŒã«ã«ãããã¯ãŒã¯ã§ãã¢ããªãåäœããããå Žåãªã©ã«ã¯ãJavaScript ãš CSS ãã»ã«ããã¹ãããã®ãæçšã§ãã
+
+ããã§ã¯ãåã FastAPI ã¢ããªå
ã§ãããã®ãã¡ã€ã«ãé
ä¿¡ããããã¥ã¡ã³ãã§ãããã䜿çšããããã«èšå®ããæ¹æ³ã瀺ããŸãã
+
+### ãããžã§ã¯ãã®ãã¡ã€ã«æ§æ { #project-file-structure }
+
+ãããžã§ã¯ãã®ãã¡ã€ã«æ§æã次ã®ããã«ãªã£ãŠãããšããŸã:
+
+```
+.
+âââ app
+â âââ __init__.py
+â âââ main.py
+```
+
+ãããã®éçãã¡ã€ã«ãä¿åããããã®ãã£ã¬ã¯ããªãäœæããŸãã
+
+æ°ãããã¡ã€ã«æ§æã¯æ¬¡ã®ããã«ãªããŸã:
+
+```
+.
+âââ app
+â  âââ __init__.py
+â  âââ main.py
+âââ static/
+```
+
+### ãã¡ã€ã«ã®ããŠã³ããŒã { #download-the-files }
+
+ããã¥ã¡ã³ãã«å¿
èŠãªéçãã¡ã€ã«ãããŠã³ããŒããã`static/` ãã£ã¬ã¯ããªã«é
眮ããŸãã
+
+åãªã³ã¯ãå³ã¯ãªãã¯ããŠããªã³ã¯å
ãå¥åã§ä¿å...ãã®ãããªãªãã·ã§ã³ãéžã¹ãŸãã
+
+**Swagger UI** ã§ã¯æ¬¡ã®ãã¡ã€ã«ã䜿çšããŸã:
+
+- <a href="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js" class="external-link" target="_blank">`swagger-ui-bundle.js`</a>
+- <a href="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css" class="external-link" target="_blank">`swagger-ui.css`</a>
+
+ãã㊠**ReDoc** ã§ã¯æ¬¡ã®ãã¡ã€ã«ã䜿çšããŸã:
+
+- <a href="https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js" class="external-link" target="_blank">`redoc.standalone.js`</a>
+
+ãã®åŸããã¡ã€ã«æ§æã¯æ¬¡ã®ããã«ãªããŸã:
+
+```
+.
+âââ app
+â  âââ __init__.py
+â  âââ main.py
+âââ static
+ âââ redoc.standalone.js
+ âââ swagger-ui-bundle.js
+ âââ swagger-ui.css
+```
+
+### éçãã¡ã€ã«ã®é
ä¿¡ { #serve-the-static-files }
+
+- `StaticFiles` ãã€ã³ããŒãããŸãã
+- ç¹å®ã®ãã¹ã« `StaticFiles()` ã€ã³ã¹ã¿ã³ã¹ããããŠã³ããããŸãã
+
+{* ../../docs_src/custom_docs_ui/tutorial002_py310.py hl[7,11] *}
+
+### éçãã¡ã€ã«ã®ãã¹ã { #test-the-static-files }
+
+ã¢ããªã±ãŒã·ã§ã³ãèµ·åãã<a href="http://127.0.0.1:8000/static/redoc.standalone.js" class="external-link" target="_blank">http://127.0.0.1:8000/static/redoc.standalone.js</a> ã«ã¢ã¯ã»ã¹ããŸãã
+
+**ReDoc** çšã®éåžžã«é·ã JavaScript ãã¡ã€ã«ã衚瀺ãããã¯ãã§ãã
+
+å
é ã¯æ¬¡ã®ããã«ãªã£ãŠãããããããŸãã:
+
+```JavaScript
+/*! For license information please see redoc.standalone.js.LICENSE.txt */
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")):
+...
+```
+
+ããã§ãã¢ããªããéçãã¡ã€ã«ãé
ä¿¡ã§ããŠããããšããããŠããã¥ã¡ã³ãçšã®éçãã¡ã€ã«ãæ£ããå Žæã«é
眮ã§ããŠããããšã確èªã§ããŸãã
+
+次ã«ãããã¥ã¡ã³ãã§ãããã®éçãã¡ã€ã«ã䜿çšããããã«ã¢ããªãèšå®ããŸãã
+
+### éçãã¡ã€ã«çšã«èªåããã¥ã¡ã³ããç¡å¹å { #disable-the-automatic-docs-for-static-files }
+
+ã«ã¹ã¿ã CDN ã䜿ãå Žåãšåæ§ãæåã®æé ã¯èªåããã¥ã¡ã³ããç¡å¹åããããšã§ããæ¢å®ã§ã¯ CDN ã䜿çšããŸãã
+
+ç¡å¹åããã«ã¯ã`FastAPI` ã¢ããªäœææã«ãããã® URL ã `None` ã«èšå®ããŸã:
+
+{* ../../docs_src/custom_docs_ui/tutorial002_py310.py hl[9] *}
+
+### éçãã¡ã€ã«çšã®ã«ã¹ã¿ã ããã¥ã¡ã³ãã远å { #include-the-custom-docs-for-static-files }
+
+ã«ã¹ã¿ã CDN ãšåæ§ã®æ¹æ³ã§ãã«ã¹ã¿ã ããã¥ã¡ã³ãçšã® *path operations* ãäœæã§ããŸãã
+
+åã³ãFastAPI ã®å
éšé¢æ°ãåå©çšããŠããã¥ã¡ã³ãçšã® HTML ããŒãžãçæããå¿
èŠãªåŒæ°ãæž¡ããŸã:
+
+- `openapi_url`: ããã¥ã¡ã³ãã® HTML ããŒãžã API ã® OpenAPI ã¹ããŒããååŸãã URLãããã§ã¯å±æ§ `app.openapi_url` ã䜿çšã§ããŸãã
+- `title`: API ã®ã¿ã€ãã«ã
+- `oauth2_redirect_url`: æ¢å®å€ã䜿ãã«ã¯ããã§ `app.swagger_ui_oauth2_redirect_url` ã䜿çšã§ããŸãã
+- `swagger_js_url`: Swagger UI ããã¥ã¡ã³ãçšã® HTML ãååŸãã **JavaScript** ãã¡ã€ã«ã® URLã**ããã¯ããªãã®ã¢ããªèªèº«ãããŸé
ä¿¡ããŠãããã®ã§ã**ã
+- `swagger_css_url`: Swagger UI ããã¥ã¡ã³ãçšã® HTML ãååŸãã **CSS** ãã¡ã€ã«ã® URLã**ããã¯ããªãã®ã¢ããªèªèº«ãããŸé
ä¿¡ããŠãããã®ã§ã**ã
+
+ReDoc ã«ã€ããŠãåæ§ã§ã...
+
+{* ../../docs_src/custom_docs_ui/tutorial002_py310.py hl[2:6,14:22,25:27,30:36] *}
+
+/// tip | è±ç¥è
+
+`swagger_ui_redirect` çšã® *path operation* ã¯ãOAuth2 ã䜿çšããå Žåã®è£å©ã§ãã
+
+API ã OAuth2 ãããã€ããšçµ±åãããšãèªèšŒãå®è¡ããŠååŸããã¯ã¬ãã³ã·ã£ã«ãæã£ãç¶æ
ã§ API ããã¥ã¡ã³ãã«æ»ããŸãããããŠå®éã® OAuth2 èªèšŒãçšããŠããã¥ã¡ã³ãäžãã API ãšå¯Ÿè©±ã§ããŸãã
+
+Swagger UI ããã®åŠçãè£åŽã§è¡ããŸããããã®ããã«ãã®ãredirectãã®è£å©ãå¿
èŠã§ãã
+
+///
+
+### éçãã¡ã€ã«ããã¹ãããããã® *path operation* ãäœæ { #create-a-path-operation-to-test-static-files }
+
+ãã¹ãŠãåäœãããããã¹ãã§ããããã«ã*path operation* ãäœæããŸã:
+
+{* ../../docs_src/custom_docs_ui/tutorial002_py310.py hl[39:41] *}
+
+### éçãã¡ã€ã« UI ã®ãã¹ã { #test-static-files-ui }
+
+ããã§ãWiFi ãåæã㊠<a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> ã«ã¢ã¯ã»ã¹ããããŒãžãåèªã¿èŸŒã¿ã§ããã¯ãã§ãã
+
+ã€ã³ã¿ãŒãããã«æ¥ç¶ããŠããªããŠããAPI ã®ããã¥ã¡ã³ãã衚瀺ããAPI ãšå¯Ÿè©±ã§ããŸãã
--- /dev/null
+# ã«ã¹ã¿ã Request ãš APIRoute ã¯ã©ã¹ { #custom-request-and-apiroute-class }
+
+å Žåã«ãã£ãŠã¯ã`Request` ã `APIRoute` ã¯ã©ã¹ã§äœ¿ãããããžãã¯ãäžæžããããããšããããŸãã
+
+ç¹ã«ãããã«ãŠã§ã¢ã§ã®ããžãã¯ã®ä»£æ¿ãšããŠæå¹ãªå ŽåããããŸãã
+
+ããšãã°ãã¢ããªã±ãŒã·ã§ã³ã§åŠçãããåã«ãªã¯ãšã¹ãããã£ãèªã¿åã£ããæäœããããããå Žåã§ãã
+
+/// danger | èŠå
+
+ããã¯ãäžçŽãæ©èœã§ãã
+
+FastAPI ãå§ããã°ããã®å Žåã¯ããã®ã»ã¯ã·ã§ã³ã¯èªã¿é£ã°ããŠãããã§ãããã
+
+///
+
+## ãŠãŒã¹ã±ãŒã¹ { #use-cases }
+
+ãŠãŒã¹ã±ãŒã¹ã®äŸ:
+
+* JSON ã§ã¯ãªããªã¯ãšã¹ãããã£ã JSON ã«å€æããïŒäŸ: <a href="https://msgpack.org/index.html" class="external-link" target="_blank">`msgpack`</a>ïŒã
+* gzip å§çž®ããããªã¯ãšã¹ãããã£ã®è§£åã
+* ãã¹ãŠã®ãªã¯ãšã¹ãããã£ã®èªåãã®ã³ã°ã
+
+## ã«ã¹ã¿ã ãªã¯ãšã¹ãããã£ã®ãšã³ã³ãŒãã£ã³ã°ã®åŠç { #handling-custom-request-body-encodings }
+
+gzip ã®ãªã¯ãšã¹ããè§£åããããã«ãã«ã¹ã¿ã ã® `Request` ãµãã¯ã©ã¹ãäœ¿ãæ¹æ³ãèŠãŠãããŸãã
+
+ãããŠããã®ã«ã¹ã¿ã ãªã¯ãšã¹ãã¯ã©ã¹ã䜿ãããã® `APIRoute` ãµãã¯ã©ã¹ãçšæããŸãã
+
+### ã«ã¹ã¿ã `GzipRequest` ã¯ã©ã¹ã®äœæ { #create-a-custom-gziprequest-class }
+
+/// tip | è±ç¥è
+
+ããã¯ä»çµã¿ã瀺ãããã®ãµã³ãã«ã§ããGzip 察å¿ãå¿
èŠãªå Žåã¯ãçšæãããŠãã [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank} ã䜿çšã§ããŸãã
+
+///
+
+ãŸãã`GzipRequest` ã¯ã©ã¹ãäœæããŸããããã¯é©åãªããããŒãããå Žåã«æ¬äœãè§£åããããã`Request.body()` ã¡ãœãããäžæžãããŸãã
+
+ããããŒã« `gzip` ããªããã°ãè§£åã¯è©Šã¿ãŸããã
+
+ãã®æ¹æ³ã«ãããåãã«ãŒãã¯ã©ã¹ã§ gzip å§çž®æžã¿ïŒæªå§çž®ã®ãªã¯ãšã¹ãã®äž¡æ¹ãæ±ããŸãã
+
+{* ../../docs_src/custom_request_and_route/tutorial001_an_py310.py hl[9:16] *}
+
+### ã«ã¹ã¿ã `GzipRoute` ã¯ã©ã¹ã®äœæ { #create-a-custom-gziproute-class }
+
+次ã«ã`GzipRequest` ãå©çšãã `fastapi.routing.APIRoute` ã®ã«ã¹ã¿ã ãµãã¯ã©ã¹ãäœæããŸãã
+
+ããã§ã¯ `APIRoute.get_route_handler()` ã¡ãœãããäžæžãããŸãã
+
+ãã®ã¡ãœããã¯é¢æ°ãè¿ããŸãããããŠãã®é¢æ°ããªã¯ãšã¹ããåãåããã¬ã¹ãã³ã¹ãè¿ããŸãã
+
+ããã§ã¯ãå
ã®ãªã¯ãšã¹ããã `GzipRequest` ãäœæããããã«å©çšããŸãã
+
+{* ../../docs_src/custom_request_and_route/tutorial001_an_py310.py hl[19:27] *}
+
+/// note | æè¡è©³çް
+
+`Request` ã«ã¯ `request.scope` 屿§ããããããã¯ãªã¯ãšã¹ãã«é¢ããã¡ã¿ããŒã¿ãå«ã Python ã® `dict` ã§ãã
+
+`Request` ã«ã¯ `request.receive` ããããããã¯ãªã¯ãšã¹ãã®æ¬äœããåä¿¡ãããããã®é¢æ°ã§ãã
+
+`scope` ã® `dict` ãš `receive` 颿°ã¯ãããã ASGI 仿§ã®äžéšã§ãã
+
+ãããŠãã® 2 ã€ïŒ`scope` ãš `receive`ïŒããæ°ãã `Request` ã€ã³ã¹ã¿ã³ã¹ãäœæããããã«å¿
èŠãªãã®ã§ãã
+
+`Request` ã«ã€ããŠè©³ããã¯ã<a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">Starlette ã® Requests ã«é¢ããããã¥ã¡ã³ã</a> ãåç
§ããŠãã ããã
+
+///
+
+`GzipRequest.get_route_handler` ãè¿ã颿°ãç°ãªãã®ã¯ã`Request` ã `GzipRequest` ã«å€æããç¹ã ãã§ãã
+
+ããã«ããã`GzipRequest` ã¯å¿
èŠã«å¿ããŠããŒã¿ãè§£åããŠãã *path operations* ã«æž¡ããŸãã
+
+ãã以éã®åŠçããžãã¯ã¯ãã¹ãŠåãã§ãã
+
+ãã ãã`GzipRequest.body` ã倿ŽããŠãããããå¿
èŠã«å¿ã㊠**FastAPI** ã«ãã£ãŠèªã¿èŸŒãŸããéã«ãªã¯ãšã¹ãããã£ãèªåçã«è§£åãããŸãã
+
+## äŸå€ãã³ãã©ã§ã®ãªã¯ãšã¹ãããã£ãžã®ã¢ã¯ã»ã¹ { #accessing-the-request-body-in-an-exception-handler }
+
+/// tip | è±ç¥è
+
+åãåé¡ã解決ããã«ã¯ã`RequestValidationError` çšã®ã«ã¹ã¿ã ãã³ãã©ã§ `body` ãäœ¿ãæ¹ããã£ãšç°¡åã§ãããïŒ[ãšã©ãŒåŠç](../tutorial/handling-errors.md#use-the-requestvalidationerror-body){.internal-link target=_blank}ïŒã
+
+ãã ãããã®äŸãæå¹ã§ãå
éšã³ã³ããŒãã³ããšã©ã®ããã«ããåããããã瀺ããŠããŸãã
+
+///
+
+åãã¢ãããŒãã䜿ã£ãŠãäŸå€ãã³ãã©å
ã§ãªã¯ãšã¹ãããã£ã«ã¢ã¯ã»ã¹ããããšãã§ããŸãã
+
+ããããšã¯ã`try`/`except` ãããã¯ã®äžã§ãªã¯ãšã¹ããåŠçããã ãã§ãïŒ
+
+{* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[14,16] *}
+
+äŸå€ãçºçããŠãã`Request` ã€ã³ã¹ã¿ã³ã¹ã¯ã¹ã³ãŒãå
ã«æ®ãããããšã©ãŒåŠçæã«ãªã¯ãšã¹ãããã£ãèªã¿åããæŽ»çšã§ããŸãïŒ
+
+{* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[17:19] *}
+
+## ã«ãŒã¿ãŒã§ã®ã«ã¹ã¿ã `APIRoute` ã¯ã©ã¹ { #custom-apiroute-class-in-a-router }
+
+`APIRouter` ã® `route_class` ãã©ã¡ãŒã¿ãèšå®ããããšãã§ããŸãïŒ
+
+{* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[26] *}
+
+ãã®äŸã§ã¯ã`router` é
äžã® *path operations* ã¯ã«ã¹ã¿ã ã® `TimedRoute` ã¯ã©ã¹ã䜿çšããã¬ã¹ãã³ã¹ã®çæã«ããã£ãæéã瀺ã远å ã® `X-Response-Time` ããããŒãã¬ã¹ãã³ã¹ã«å«ãŸããŸãïŒ
+
+{* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[13:20] *}
--- /dev/null
+# OpenAPI ã®æ¡åŒµ { #extending-openapi }
+
+çæããã OpenAPI ã¹ããŒãã倿Žããå¿
èŠãããå ŽåããããŸãã
+
+ãã®ã»ã¯ã·ã§ã³ã§ã¯ãã®æ¹æ³ã説æããŸãã
+
+## éåžžã®ããã»ã¹ { #the-normal-process }
+
+éåžžïŒããã©ã«ãïŒã®ããã»ã¹ã¯æ¬¡ã®ãšããã§ãã
+
+`FastAPI` ã¢ããªã±ãŒã·ã§ã³ïŒã€ã³ã¹ã¿ã³ã¹ïŒã«ã¯ãOpenAPI ã¹ããŒããè¿ãããšãæåŸ
ããã `.openapi()` ã¡ãœããããããŸãã
+
+ã¢ããªã±ãŒã·ã§ã³ãªããžã§ã¯ãã®äœææã«ã`/openapi.json`ïŒãŸã㯠`openapi_url` ã«èšå®ãããã¹ïŒãžã® path operation ãç»é²ãããŸãã
+
+ããã¯åã«ãã¢ããªã±ãŒã·ã§ã³ã® `.openapi()` ã¡ãœããã®çµæãå«ã JSON ã¬ã¹ãã³ã¹ãè¿ããŸãã
+
+ããã©ã«ãã§ã¯ã`.openapi()` ã¡ãœããã¯ãããã㣠`.openapi_schema` ã«å
容ããããã確èªããããã°ãããè¿ããŸãã
+
+ãªããã°ã`fastapi.openapi.utils.get_openapi` ã«ãããŠãŒãã£ãªãã£é¢æ°ã䜿ã£ãŠçæããŸãã
+
+ãã®é¢æ° `get_openapi()` ã¯æ¬¡ã®åŒæ°ãåãåããŸã:
+
+- `title`: ããã¥ã¡ã³ãã«è¡šç€ºããã OpenAPI ã®ã¿ã€ãã«ã
+- `version`: API ã®ããŒãžã§ã³ãäŸ: `2.5.0`ã
+- `openapi_version`: 䜿çšãã OpenAPI 仿§ã®ããŒãžã§ã³ãããã©ã«ãã¯ææ°ã® `3.1.0`ã
+- `summary`: API ã®çãæŠèŠã
+- `description`: API ã®èª¬æãMarkdown ãå«ããããšãã§ããããã¥ã¡ã³ãã«è¡šç€ºãããŸãã
+- `routes`: ã«ãŒãã®ãªã¹ããç»é²æžã¿ã®å path operation ã§ãã`app.routes` ããååŸãããŸãã
+
+/// info | æ
å ±
+
+ãã©ã¡ãŒã¿ `summary` 㯠OpenAPI 3.1.0 以éã§å©çšå¯èœã§ãFastAPI 0.99.0 以éã察å¿ããŠããŸãã
+
+///
+
+## ããã©ã«ãã®äžæžã { #overriding-the-defaults }
+
+äžèšã®æ
å ±ã䜿ã£ãŠãåããŠãŒãã£ãªãã£é¢æ°ã§ OpenAPI ã¹ããŒããçæããå¿
èŠãªéšåãäžæžãã§ããŸãã
+
+ããšãã°ã<a href="https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo" class="external-link" target="_blank">ã«ã¹ã¿ã ããŽãå«ããããã® ReDoc ã® OpenAPI æ¡åŒµ</a>ã远å ããŠã¿ãŸãããã
+
+### éåžžã® **FastAPI** { #normal-fastapi }
+
+ãŸããéåžžã©ããã« **FastAPI** ã¢ããªã±ãŒã·ã§ã³ãå®è£
ããŸã:
+
+{* ../../docs_src/extending_openapi/tutorial001_py310.py hl[1,4,7:9] *}
+
+### OpenAPI ã¹ããŒãã®çæ { #generate-the-openapi-schema }
+
+次ã«ã`custom_openapi()` 颿°å
ã§åããŠãŒãã£ãªãã£é¢æ°ã䜿ã£ãŠ OpenAPI ã¹ããŒããçæããŸã:
+
+{* ../../docs_src/extending_openapi/tutorial001_py310.py hl[2,15:21] *}
+
+### OpenAPI ã¹ããŒãã®å€æŽ { #modify-the-openapi-schema }
+
+OpenAPI ã¹ããŒãã® `info`ããªããžã§ã¯ããã«ã«ã¹ã¿ã ã® `x-logo` ã远å ããŠãReDoc æ¡åŒµãå ããŸã:
+
+{* ../../docs_src/extending_openapi/tutorial001_py310.py hl[22:24] *}
+
+### OpenAPI ã¹ããŒãã®ãã£ãã·ã¥ { #cache-the-openapi-schema }
+
+çæããã¹ããŒããä¿æããããã£ãã·ã¥ããšã㊠`.openapi_schema` ããããã£ãå©çšã§ããŸãã
+
+ããããããšã§ããŠãŒã¶ãŒã API ããã¥ã¡ã³ããéããã³ã«ã¹ããŒããçæããå¿
èŠããªããªããŸãã
+
+æåã®1åã ãçæããããã®åŸã¯åããã£ãã·ã¥æžã¿ã¹ããŒãã以éã®ãªã¯ãšã¹ãã§äœ¿ãããŸãã
+
+{* ../../docs_src/extending_openapi/tutorial001_py310.py hl[13:14,25:26] *}
+
+### ã¡ãœããã®äžæžã { #override-the-method }
+
+ããã§ã`.openapi()` ã¡ãœãããæ°ãã颿°ã«çœ®ãæããããŸãã
+
+{* ../../docs_src/extending_openapi/tutorial001_py310.py hl[29] *}
+
+### ç¢ºèª { #check-it }
+
+<a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a> ã«ã¢ã¯ã»ã¹ãããšãã«ã¹ã¿ã ããŽïŒãã®äŸã§ã¯ **FastAPI** ã®ããŽïŒã䜿ãããŠããããšã確èªã§ããŸã:
+
+<img src="/img/tutorial/extending-openapi/image01.png">
--- /dev/null
+# äžè¬ - ããŠã㌠- ã¬ã·ã { #general-how-to-recipes }
+
+ããã§ã¯ãäžè¬çãŸãã¯ãããã質åã«å¯ŸããŠãããã¥ã¡ã³ãå
ã®ä»ã®ç®æãžã®åç
§ãããã€ã瀺ããŸãã
+
+## ããŒã¿ã®ãã£ã«ã¿ãªã³ã° - ã»ãã¥ãªã㣠{ #filter-data-security }
+
+è¿ãã¹ã以äžã®ããŒã¿ãè¿ããªãããã«ããã«ã¯ã[ãã¥ãŒããªã¢ã« - ã¬ã¹ãã³ã¹ã¢ãã« - æ»ãå€ã®å](../tutorial/response-model.md){.internal-link target=_blank} ãåç
§ããŠãã ããã
+
+## ããã¥ã¡ã³ãã®ã¿ã° - OpenAPI { #documentation-tags-openapi }
+
+*path operations* ã«ã¿ã°ã远å ããããã¥ã¡ã³ã UI ã§ã°ã«ãŒãåããã«ã¯ã[ãã¥ãŒããªã¢ã« - path operation ã®èšå® - ã¿ã°](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank} ãåç
§ããŠãã ããã
+
+## ããã¥ã¡ã³ãã®æŠèŠãšèª¬æ - OpenAPI { #documentation-summary-and-description-openapi }
+
+*path operations* ã«æŠèŠãšèª¬æã远å ããããã¥ã¡ã³ã UI ã«è¡šç€ºããã«ã¯ã[ãã¥ãŒããªã¢ã« - path operation ã®èšå® - æŠèŠãšèª¬æ](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank} ãåç
§ããŠãã ããã
+
+## ããã¥ã¡ã³ãã®ã¬ã¹ãã³ã¹èª¬æ - OpenAPI { #documentation-response-description-openapi }
+
+ããã¥ã¡ã³ã UI ã«è¡šç€ºãããã¬ã¹ãã³ã¹ã®èª¬æãå®çŸ©ããã«ã¯ã[ãã¥ãŒããªã¢ã« - path operation ã®èšå® - ã¬ã¹ãã³ã¹ã®èª¬æ](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank} ãåç
§ããŠãã ããã
+
+## *Path Operation* ã®éæšå¥šå - OpenAPI { #documentation-deprecate-a-path-operation-openapi }
+
+*path operation* ãéæšå¥šã«ããããã¥ã¡ã³ã UI ã«è¡šç€ºããã«ã¯ã[ãã¥ãŒããªã¢ã« - path operation ã®èšå® - éæšå¥š](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank} ãåç
§ããŠãã ããã
+
+## ä»»æã®ããŒã¿ã JSON äºæã«å€æ { #convert-any-data-to-json-compatible }
+
+ä»»æã®ããŒã¿ã JSON äºæã«å€æããã«ã¯ã[ãã¥ãŒããªã¢ã« - JSON äºæãšã³ã³ãŒã](../tutorial/encoder.md){.internal-link target=_blank} ãåç
§ããŠãã ããã
+
+## OpenAPI ã¡ã¿ããŒã¿ - ããã¥ã¡ã³ã { #openapi-metadata-docs }
+
+ã©ã€ã»ã³ã¹ãããŒãžã§ã³ãé£çµ¡å
ãªã©ãå«ãã¡ã¿ããŒã¿ã OpenAPI ã¹ããŒãã«è¿œå ããã«ã¯ã[ãã¥ãŒããªã¢ã« - ã¡ã¿ããŒã¿ãšããã¥ã¡ã³ãã® URL](../tutorial/metadata.md){.internal-link target=_blank} ãåç
§ããŠãã ããã
+
+## OpenAPI ã®ã«ã¹ã¿ã URL { #openapi-custom-url }
+
+OpenAPI ã® URL ãã«ã¹ã¿ãã€ãºïŒãŸãã¯åé€ïŒããã«ã¯ã[ãã¥ãŒããªã¢ã« - ã¡ã¿ããŒã¿ãšããã¥ã¡ã³ãã® URL](../tutorial/metadata.md#openapi-url){.internal-link target=_blank} ãåç
§ããŠãã ããã
+
+## OpenAPI ããã¥ã¡ã³ãã® URL { #openapi-docs-urls }
+
+èªåçæãããããã¥ã¡ã³ã UI ã䜿çšãã URL ã倿Žããã«ã¯ã[ãã¥ãŒããªã¢ã« - ã¡ã¿ããŒã¿ãšããã¥ã¡ã³ãã® URL](../tutorial/metadata.md#docs-urls){.internal-link target=_blank} ãåç
§ããŠãã ããã
--- /dev/null
+# GraphQL { #graphql }
+
+**FastAPI** 㯠**ASGI** æšæºã«åºã¥ããŠãããããASGI ã«å¯Ÿå¿ããä»»æã® **GraphQL** ã©ã€ãã©ãªãç°¡åã«çµ±åã§ããŸãã
+
+åãã¢ããªã±ãŒã·ã§ã³å
ã§éåžžã® FastAPI ã® *path operation* ãš GraphQL ãçµã¿åãããŠäœ¿ããŸãã
+
+/// tip | è±ç¥è
+
+**GraphQL** ã¯éåžžã«ç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã解決ããŸãã
+
+äžè¬ç㪠**Web API** ãšæ¯ã¹ããšã**é·æ** ãš **çæ** ããããŸãã
+
+ãèªèº«ã®ãŠãŒã¹ã±ãŒã¹ã§åŸããã **å©ç¹** ã **æ¬ ç¹** ãè£ããã©ãããè©äŸ¡ããŠãã ããã ð€
+
+///
+
+## GraphQL ã©ã€ãã©ãª { #graphql-libraries }
+
+**ASGI** ããµããŒããã **GraphQL** ã©ã€ãã©ãªã®äžéšã以äžã«ç€ºããŸãã**FastAPI** ãšçµã¿åãããŠäœ¿çšã§ããŸã:
+
+* <a href="https://strawberry.rocks/" class="external-link" target="_blank">Strawberry</a> ð
+ * <a href="https://strawberry.rocks/docs/integrations/fastapi" class="external-link" target="_blank">FastAPI åãããã¥ã¡ã³ã</a>ãã
+* <a href="https://ariadnegraphql.org/" class="external-link" target="_blank">Ariadne</a>
+ * <a href="https://ariadnegraphql.org/docs/fastapi-integration" class="external-link" target="_blank">FastAPI åãããã¥ã¡ã³ã</a>ãã
+* <a href="https://tartiflette.io/" class="external-link" target="_blank">Tartiflette</a>
+ * ASGI 飿ºçšã® <a href="https://tartiflette.github.io/tartiflette-asgi/" class="external-link" target="_blank">Tartiflette ASGI</a> ãã
+* <a href="https://graphene-python.org/" class="external-link" target="_blank">Graphene</a>
+ * <a href="https://github.com/ciscorn/starlette-graphene3" class="external-link" target="_blank">starlette-graphene3</a> ãã
+
+## Strawberry ã§ GraphQL { #graphql-with-strawberry }
+
+**GraphQL** ãå¿
èŠããŸãã¯å©çšãããå Žåã¯ã<a href="https://strawberry.rocks/" class="external-link" target="_blank">**Strawberry**</a> ã**æšå¥š**ããŸãã**FastAPI** ã®èšèšã«æãè¿ãããã¹ãŠã**åã¢ãããŒã·ã§ã³**ã«åºã¥ããŠããŸãã
+
+ãŠãŒã¹ã±ãŒã¹ã«ãã£ãŠã¯ä»ã®ã©ã€ãã©ãªãéžã¶æ¹ãããå ŽåããããŸãããç§ã«å°ããããã°ããããã **Strawberry** ã詊ãããšãå§ããã§ãããã
+
+FastAPI ãš Strawberry ãçµ±åããæ¹æ³ã®ç°¡åãªãã¬ãã¥ãŒã§ã:
+
+{* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *}
+
+詳现㯠<a href="https://strawberry.rocks/" class="external-link" target="_blank">Strawberry ã®ããã¥ã¡ã³ã</a>ãã芧ãã ããã
+
+ãŸãã<a href="https://strawberry.rocks/docs/integrations/fastapi" class="external-link" target="_blank">Strawberry ãš FastAPI</a> ã®é£æºã«é¢ããããã¥ã¡ã³ãããããŸãã
+
+## Starlette ã®æ§ `GraphQLApp` { #older-graphqlapp-from-starlette }
+
+以åã® Starlette ã«ã¯ã<a href="https://graphene-python.org/" class="external-link" target="_blank">Graphene</a> ãšçµ±åããããã® `GraphQLApp` ã¯ã©ã¹ãå«ãŸããŠããŸããã
+
+ãã㯠Starlette ããã¯éæšå¥šã«ãªããŸããããããããã䜿çšããŠããã³ãŒããããå Žåã¯ãåããŠãŒã¹ã±ãŒã¹ãã«ããŒãã**ã»ãŒåäžã®ã€ã³ã¿ãŒãã§ãŒã¹**ãæã€ <a href="https://github.com/ciscorn/starlette-graphene3" class="external-link" target="_blank">starlette-graphene3</a> ãžå®¹æã«**ç§»è¡**ã§ããŸãã
+
+/// tip | è±ç¥è
+
+GraphQL ãå¿
èŠã§ããã°ãäŸç¶ãšã㊠<a href="https://strawberry.rocks/" class="external-link" target="_blank">Strawberry</a> ã®å©çšãæšå¥šããŸããç¬èªã®ã¯ã©ã¹ãåã§ã¯ãªããåã¢ãããŒã·ã§ã³ã«åºã¥ããŠããããã§ãã
+
+///
+
+## ããã«åŠã¶ { #learn-more }
+
+**GraphQL** ã«ã€ããŠã¯ã<a href="https://graphql.org/" class="external-link" target="_blank">å
¬åŒ GraphQL ããã¥ã¡ã³ã</a>ã§ããã«åŠã¹ãŸãã
+
+äžèšã®åã©ã€ãã©ãªã«ã€ããŠã¯ããªã³ã¯å
ã®ããã¥ã¡ã³ãããåç
§ãã ããã
--- /dev/null
+# ããŠã㌠- ã¬ã·ã { #how-to-recipes }
+
+ããã§ã¯ã**è€æ°ã®ãããã¯**ã«é¢ããããŸããŸãªã¬ã·ãããããŠããŒãã¬ã€ãã玹ä»ããŸãã
+
+ãããã®ã¢ã€ãã¢ã®å€ãã¯ãããã**ç¬ç«**ããŠãããã»ãšãã©ã®å Žåã**ããªãã®ãããžã§ã¯ã**ã«çŽæ¥åœãŠã¯ãŸããã®ã ããèªãã°ååã§ãã
+
+ãããžã§ã¯ãã«ãšã£ãŠè峿·±ãæçšã ãšæããã®ãããã°ããã²ç¢ºèªããŠãã ãããããã§ãªããã°ãèªã¿é£ã°ããŠãåé¡ãããŸããã
+
+/// tip | è±ç¥è
+
+**FastAPI ãåŠã¶**ããšãäœç³»çã«é²ãããå ŽåïŒæšå¥šïŒã代ããã« [ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã](../tutorial/index.md){.internal-link target=_blank} ãç« ããšã«èªãã§ãã ããã
+
+///
--- /dev/null
+# Pydantic v1 ãã Pydantic v2 ãžã®ç§»è¡ { #migrate-from-pydantic-v1-to-pydantic-v2 }
+
+å€ã FastAPI ã¢ããªãããå ŽåãPydantic v1 ã䜿ã£ãŠãããããããŸããã
+
+FastAPI 0.100.0 㯠Pydantic v1 / v2 ã®ã©ã¡ãã«ã察å¿ããŠãããã€ã³ã¹ããŒã«ãããŠããæ¹ã䜿çšããŸããã
+
+FastAPI 0.119.0 ã§ã¯ãPydantic v2 å
ããã® Pydantic v1 ã®éšåçãµããŒãïŒ`pydantic.v1`ïŒãå°å
¥ãããv2 ãžã®ç§»è¡ã容æã«ãªããŸããã
+
+FastAPI 0.126.0 ã§ Pydantic v1 ã®ãµããŒãã¯çµäºããŸãããããã°ããã®é㯠`pydantic.v1` ã¯å©çšå¯èœã§ããã
+
+/// warning | 泚æ
+
+Pydantic ããŒã 㯠Python ã®ææ°ããŒãžã§ã³ãã€ãŸã **Python 3.14** ãããPydantic v1 ã®ãµããŒããçµäºããŸããã
+
+ããã«ã¯ `pydantic.v1` ãå«ãŸããPython 3.14 以äžã§ã¯ãµããŒããããŸããã
+
+Python ã®ææ°æ©èœã䜿ãããå Žåã¯ãPydantic v2 ã䜿çšããŠããããšã確èªããå¿
èŠããããŸãã
+
+///
+
+å€ã FastAPI ã¢ããªã§ Pydantic v1 ã䜿ã£ãŠããå Žåãããã§ã¯ Pydantic v2 ãžã®ç§»è¡æ¹æ³ãšã段éçç§»è¡ãå©ãã **FastAPI 0.119.0 ã®æ©èœ** ã玹ä»ããŸãã
+
+## å
Œ΋‹ۋ { #official-guide }
+
+Pydantic ã«ã¯ v1 ãã v2 ãžã®å
¬åŒã® <a href="https://docs.pydantic.dev/latest/migration/" class="external-link" target="_blank">ç§»è¡ã¬ã€ã</a> ããããŸãã
+
+倿Žç¹ãæ€èšŒãããæ£ç¢ºã§å³å¯ã«ãªã£ãç¹ã泚æäºé
ãªã©ãå«ãŸããŸãã
+
+äœãå€ãã£ãããããããçè§£ããããã«åç
§ããŠãã ããã
+
+## ãã¹ã { #tests }
+
+ã¢ããªã«å¯Ÿãã[ãã¹ã](../tutorial/testing.md){.internal-link target=_blank}ãçšæããç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒCIïŒã§å®è¡ããããã«ããŠãã ããã
+
+ããã«ãããã¢ããã°ã¬ãŒãåŸãæåŸ
ã©ããåäœããŠããããšã確èªã§ããŸãã
+
+## `bump-pydantic` { #bump-pydantic }
+
+å€ãã®å Žåãã«ã¹ã¿ãã€ãºã®ãªãéåžžã® Pydantic ã¢ãã«ã䜿ã£ãŠããã°ãv1 ãã v2 ãžã®ç§»è¡äœæ¥ã®å€§åãèªååã§ããŸãã
+
+åã Pydantic ããŒã ãæäŸãã <a href="https://github.com/pydantic/bump-pydantic" class="external-link" target="_blank">`bump-pydantic`</a> ã䜿çšã§ããŸãã
+
+ãã®ããŒã«ã¯å¿
èŠãªã³ãŒã倿Žã®ã»ãšãã©ãèªåã§è¡ããŸãã
+
+ãã®åŸãã¹ããå®è¡ããåé¡ãªããã°å®äºã§ããð
+
+## v2 ã«ããã Pydantic v1 { #pydantic-v1-in-v2 }
+
+Pydantic v2 ã«ã¯ãPydantic v1 ããµãã¢ãžã¥ãŒã« `pydantic.v1` ãšããŠå梱ãããŠããŸãããã ãããã㯠Python 3.13 ãè¶
ããããŒãžã§ã³ã§ã¯ãµããŒããããŸããã
+
+ã€ãŸããPydantic v2 ã®ææ°ããŒãžã§ã³ãã€ã³ã¹ããŒã«ãããã®ãµãã¢ãžã¥ãŒã«ããæ§ Pydantic v1 ã®ã³ã³ããŒãã³ããã€ã³ããŒãããŠããããã v1 ãã€ã³ã¹ããŒã«ããŠãããã®ããã«äœ¿çšã§ããŸãã
+
+{* ../../docs_src/pydantic_v1_in_v2/tutorial001_an_py310.py hl[1,4] *}
+
+### v2 å
ã® Pydantic v1 ã«å¯Ÿãã FastAPI ã®ãµããŒã { #fastapi-support-for-pydantic-v1-in-v2 }
+
+FastAPI 0.119.0 以éã§ã¯ãç§»è¡ã容æã«ãããããPydantic v2 å
ã® Pydantic v1 ã«å¯ŸããéšåçãµããŒãããããŸãã
+
+ãã®ãããPydantic ã v2 ã®ææ°ã«äžããã€ã³ããŒãã `pydantic.v1` ãµãã¢ãžã¥ãŒã«ã«åãæ¿ããã ãã§ãå€ãã®å Žåãã®ãŸãŸåäœããŸãã
+
+{* ../../docs_src/pydantic_v1_in_v2/tutorial002_an_py310.py hl[2,5,15] *}
+
+/// warning | 泚æ
+
+åè¿°ã®ãšãããPython ã®æè¿ã®ããŒãžã§ã³ïŒPython 3.14 以éïŒã§ã¯ Pydantic v1 ããµããŒããããªãããã`pydantic.v1` ã®äœ¿çšã Python 3.14 以äžã§ã¯ãµããŒããããŸããã
+
+///
+
+### åäžã¢ããªã§ã® Pydantic v1 ãš v2 { #pydantic-v1-and-v2-on-the-same-app }
+
+Pydantic v2 ã®ã¢ãã«ã®ãã£ãŒã«ãã« Pydantic v1 ã®ã¢ãã«ãïŒãŸãã¯ãã®éãïŒåã蟌ãããšã¯ãPydantic ã§ã¯ããµããŒããããŠããŸãããã
+
+```mermaid
+graph TB
+ subgraph "â Not Supported"
+ direction TB
+ subgraph V2["Pydantic v2 Model"]
+ V1Field["Pydantic v1 Model"]
+ end
+ subgraph V1["Pydantic v1 Model"]
+ V2Field["Pydantic v2 Model"]
+ end
+ end
+
+ style V2 fill:#f9fff3
+ style V1 fill:#fff6f0
+ style V1Field fill:#fff6f0
+ style V2Field fill:#f9fff3
+```
+
+...but, you can have separated models using Pydantic v1 and v2 in the same app.
+
+```mermaid
+graph TB
+ subgraph "â
Supported"
+ direction TB
+ subgraph V2["Pydantic v2 Model"]
+ V2Field["Pydantic v2 Model"]
+ end
+ subgraph V1["Pydantic v1 Model"]
+ V1Field["Pydantic v1 Model"]
+ end
+ end
+
+ style V2 fill:#f9fff3
+ style V1 fill:#fff6f0
+ style V1Field fill:#fff6f0
+ style V2Field fill:#f9fff3
+```
+
+å Žåã«ãã£ãŠã¯ãåã FastAPI ã® path operation å
ã§ãPydantic v1 ãš v2 ã®äž¡æ¹ã®ã¢ãã«ãæ±ãããšãå¯èœã§ã:
+
+{* ../../docs_src/pydantic_v1_in_v2/tutorial003_an_py310.py hl[2:3,6,12,21:22] *}
+
+äžã®äŸã§ã¯ãå
¥åã¢ãã«ã¯ Pydantic v1ãåºåã¢ãã«ïŒ`response_model=ItemV2` ã§å®çŸ©ïŒã¯ Pydantic v2 ã§ãã
+
+### Pydantic v1 ã®ãã©ã¡ãŒã¿ { #pydantic-v1-parameters }
+
+Pydantic v1 ã®ã¢ãã«ã§ `Body`ã`Query`ã`Form` ãªã©ã® FastAPI åºæã®ãã©ã¡ãŒã¿ãŠãŒãã£ãªãã£ã䜿ãå¿
èŠãããå Žåãv2 ãžã®ç§»è¡ãå®äºãããŸã§ã®é㯠`fastapi.temp_pydantic_v1_params` ããã€ã³ããŒãã§ããŸã:
+
+{* ../../docs_src/pydantic_v1_in_v2/tutorial004_an_py310.py hl[4,18] *}
+
+### 段éçã«ç§»è¡ { #migrate-in-steps }
+
+/// tip | è±ç¥è
+
+ãŸã㯠`bump-pydantic` ã詊ããŠãã ããããã¹ããéããåé¡ãªããã°ã³ãã³ãäžçºã§å®äºã§ããâš
+
+///
+
+`bump-pydantic` ãé©çšã§ããªãå Žåã¯ãåäžã¢ããªã§ v1 ãš v2 ã®ã¢ãã«ã䜵çšã§ãããµããŒããå©çšããŠãåŸã
ã« v2 ãžç§»è¡ã§ããŸãã
+
+ãŸã Pydantic ã v2 ã®ææ°ã«ã¢ããã°ã¬ãŒããããã¹ãŠã®ã¢ãã«ã®ã€ã³ããŒãã `pydantic.v1` ã«åãæ¿ããŸãã
+
+ãã®åŸãã¢ãã«ãã°ã«ãŒãããšã«å°ãã〠Pydantic v1 ãã v2 ãžç§»è¡ããŠãããŸããð¶
--- /dev/null
+# å
¥åãšåºåã§OpenAPIã®ã¹ããŒããåãããã©ãã { #separate-openapi-schemas-for-input-and-output-or-not }
+
+**Pydantic v2** ã®ãªãªãŒã¹ä»¥éãçæããã OpenAPI ã¯ä»¥åããå°ãæ£ç¢ºã§ãããæ£ãããã®ã«ãªããŸãããð
+
+å®éã«ã¯ãå Žåã«ãã£ãŠã¯åã Pydantic ã¢ãã«ã«å¯ŸããŠãå
¥åçšãšåºåçšã§ OpenAPI ã« **2 ã€ã® JSON Schema** ãå«ãŸããããšããããŸãããã㯠**ããã©ã«ãå€** ã®æç¡ã«äŸåããŸãã
+
+ãã®åäœãšãå¿
èŠã«å¿ããŠã®å€æŽæ¹æ³ãèŠãŠãããŸãã
+
+## å
¥åºåã®Pydanticã¢ãã« { #pydantic-models-for-input-and-output }
+
+次ã®ããã«ããã©ã«ãå€ãæã€ Pydantic ã¢ãã«ããããšããŸãã
+
+{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py ln[1:7] hl[7] *}
+
+### å
¥åçšã¢ãã« { #model-for-input }
+
+ãã®ã¢ãã«ã次ã®ããã«å
¥åãšããŠäœ¿ããš:
+
+{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py ln[1:15] hl[14] *}
+
+...`description` ãã£ãŒã«ã㯠**å¿
é ã§ã¯ãããŸãã**ãããã©ã«ãå€ã `None` ã ããã§ãã
+
+### ããã¥ã¡ã³ãã§ã®å
¥åã¢ãã« { #input-model-in-docs }
+
+ããã¥ã¡ã³ãã§ç¢ºèªãããšã`description` ãã£ãŒã«ãã«ã¯ **èµ€ãã¢ã¹ã¿ãªã¹ã¯** ãä»ããŠããããå¿
é ãšããŠã¯ããŒã¯ãããŠããŸãã:
+
+<div class="screenshot">
+<img src="/img/tutorial/separate-openapi-schemas/image01.png">
+</div>
+
+### åºåçšã¢ãã« { #model-for-output }
+
+ãããåãã¢ãã«ã次ã®ããã«åºåãšããŠäœ¿ãå Žå:
+
+{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py hl[19] *}
+
+...`description` ã«ããã©ã«ãå€ãããããããã®ãã£ãŒã«ãã«äœãè¿ããªããŠãããã® **ããã©ã«ãå€** ãå
¥ããŸãã
+
+### åºåã®ã¬ã¹ãã³ã¹ããŒã¿ { #model-for-output-response-data }
+
+ããã¥ã¡ã³ããã詊ããŠã¬ã¹ãã³ã¹ã確èªãããšãã³ãŒãã§ã¯äžæ¹ã® `description` ãã£ãŒã«ãã«äœã远å ããŠããªãã«ãããããããJSON ã¬ã¹ãã³ã¹ã«ã¯ããã©ã«ãå€ïŒ`null`ïŒãå«ãŸããŠããŸã:
+
+<div class="screenshot">
+<img src="/img/tutorial/separate-openapi-schemas/image02.png">
+</div>
+
+ã€ãŸããã®ãã£ãŒã«ãã«ã¯ **åžžã«å€ããããŸã**ãå€ã `None`ïŒJSON ã§ã¯ `null`ïŒã«ãªãããšãããã ãã§ãã
+
+ãããã£ãŠããã® API ã䜿ãã¯ã©ã€ã¢ã³ãã¯å€ã®æç¡ã確èªããå¿
èŠããªãããã£ãŒã«ãã **åžžã«ååšãã** ãšä»®å®ã§ããŸããå Žåã«ãã£ãŠã¯ããã©ã«ãå€ã® `None` ã«ãªãã ãã§ãã
+
+ããã OpenAPI ã§è¡šçŸããã«ã¯ããã®ãã£ãŒã«ãã **å¿
é ** ãšããŠããŒã¯ããŸããåžžã«ååšããããã§ãã
+
+ãã®ãããã¢ãã«ã® JSON Schema ã¯ã**å
¥åãåºåã** ã«ãã£ãŠç°ãªãå ŽåããããŸã:
+
+- **å
¥å** ã§ã¯ `description` 㯠**å¿
é ã§ã¯ãªã**
+- **åºå** ã§ã¯ **å¿
é **ïŒå€ã¯ `None`ãJSON ã§ã¯ `null` ã®å¯èœæ§ããïŒ
+
+### ããã¥ã¡ã³ãã§ã®åºåã¢ãã« { #model-for-output-in-docs }
+
+ããã¥ã¡ã³ãã§åºåã¢ãã«ãèŠããšã`name` ãš `description` ã® **äž¡æ¹** ã **èµ€ãã¢ã¹ã¿ãªã¹ã¯** ã§ **å¿
é ** ãšããŠããŒã¯ãããŠããŸã:
+
+<div class="screenshot">
+<img src="/img/tutorial/separate-openapi-schemas/image03.png">
+</div>
+
+### ããã¥ã¡ã³ãã§ã®å
¥åã»åºåã¢ãã« { #model-for-input-and-output-in-docs }
+
+ããã«ãOpenAPI ã«å«ãŸããå©çšå¯èœãªã¹ããŒãïŒJSON SchemaïŒã確èªãããšã`Item-Input` ãš `Item-Output` ã® 2 ã€ãããããšãåãããŸãã
+
+`Item-Input` ã§ã¯ã`description` 㯠**å¿
é ã§ã¯ãããŸãã**ïŒèµ€ãã¢ã¹ã¿ãªã¹ã¯ãªãïŒã
+
+äžæ¹ã`Item-Output` ã§ã¯ã`description` 㯠**å¿
é **ïŒèµ€ãã¢ã¹ã¿ãªã¹ã¯ããïŒã§ãã
+
+<div class="screenshot">
+<img src="/img/tutorial/separate-openapi-schemas/image04.png">
+</div>
+
+ãã® **Pydantic v2** ã®æ©èœã«ãããAPI ããã¥ã¡ã³ãã¯ãã **æ£ç¢º** ã«ãªããèªåçæãããã¯ã©ã€ã¢ã³ãã SDK ãããæ£ç¢ºã«ãªããŸããããã«ãããããè¯ã **éçºè
ãšã¯ã¹ããªãšã³ã¹** ãšäžè²«æ§ãåŸãããŸããð
+
+## ã¹ããŒããåããªã { #do-not-separate-schemas }
+
+äžæ¹ã§ã**å
¥åãšåºåã§åãã¹ããŒã** ã«ãããå ŽåããããŸãã
+
+äž»ãªãŠãŒã¹ã±ãŒã¹ã¯ããã§ã«èªåçæãããã¯ã©ã€ã¢ã³ãã³ãŒãã SDK ãããããŸã ãããããã¹ãп޿°ããããªãå Žåã§ãããããã¯æŽæ°ããããšããŠããä»ã§ã¯ãªããããããŸããã
+
+ãã®å Žåã¯ã**FastAPI** ã®ãã©ã¡ãŒã¿ `separate_input_output_schemas=False` ã§ãã®æ©èœãç¡å¹åã§ããŸãã
+
+/// info | æ
å ±
+
+`separate_input_output_schemas` ã®ãµããŒã㯠FastAPI `0.102.0` ã§è¿œå ãããŸãããð€
+
+///
+
+{* ../../docs_src/separate_openapi_schemas/tutorial002_py310.py hl[10] *}
+
+### ããã¥ã¡ã³ãã§å
¥åã»åºåã«åäžã¹ããŒããäœ¿çš { #same-schema-for-input-and-output-models-in-docs }
+
+ããã§ã¢ãã«ã®å
¥åãšåºåã¯åäžã®ã¹ããŒãã`Item` ã®ã¿ã«ãªãã`description` 㯠**å¿
é ã§ã¯ãããŸãã**:
+
+<div class="screenshot">
+<img src="/img/tutorial/separate-openapi-schemas/image05.png">
+</div>
--- /dev/null
+# ããŒã¿ããŒã¹ã®ãã¹ã { #testing-a-database }
+
+ããŒã¿ããŒã¹ãSQLãSQLModel ã«ã€ããŠã¯ã<a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel ããã¥ã¡ã³ã</a>ã§åŠã¹ãŸããð€
+
+FastAPI ãšäžç·ã« SQLModel ã䜿ãããã®ãã <a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/" class="external-link" target="_blank">ãã¥ãŒããªã¢ã«</a>ããããŸããâš
+
+ãã®ãã¥ãŒããªã¢ã«ã«ã¯ã<a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/" class="external-link" target="_blank">SQL ããŒã¿ããŒã¹ã®ãã¹ã</a>ã«é¢ããã»ã¯ã·ã§ã³ãå«ãŸããŠããŸããð
* **é«é**: **NodeJS** ã **Go** 䞊ã¿ã®ãšãŠãé«ãããã©ãŒãã³ã¹ïŒStarlette ãš Pydantic ã®ãããã§ãïŒã [å©çšå¯èœãªæãé«é㪠Python ãã¬ãŒã ã¯ãŒã¯ã®äžã€ã§ã](#performance)ã
* **é«éãªã³ãŒãã£ã³ã°**: éçºé床ãçŽ 200%ã300% åäžãããŸãã*
* **å°ãªããã°**: éçºè
èµ·å ã®ãã¥ãŒãã³ãšã©ãŒãçŽ 40% åæžããŸãã*
-* **çŽæç**: çŽ æŽããããšãã£ã¿ãµããŒããããããå Žæã§ <abbr title="also known as auto-complete, autocompletion, IntelliSense">è£å®</abbr> ã䜿ããŸãããããã°æéãåæžããŸãã
+* **çŽæç**: çŽ æŽããããšãã£ã¿ãµããŒãã<dfn title="å¥å: auto-completeãautocompletionãIntelliSense">è£å®</dfn> ãããããå Žæã§äœ¿ããŸãããããã°æéãåæžããŸãã
* **ç°¡å**: ç°¡åã«å©çšã»ç¿åŸã§ããããã«ãã¶ã€ã³ãããŠããŸããããã¥ã¡ã³ããèªãæéãåæžããŸãã
* **çã**: ã³ãŒãã®éè€ãæå°éã«ããŸããåãã©ã¡ãŒã¿å®£èšããè€æ°ã®æ©èœãåŸãããŸãããã°ãæžããŸãã
* **å
ç¢æ§**: èªå察話åããã¥ã¡ã³ãã«ãããæ¬çªç°å¢åãã®ã³ãŒããåŸãããŸãã
<a href="https://typer.tiangolo.com" target="_blank"><img src="https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg" style="width: 20%;"></a>
-Web API ã®ä»£ããã«ã¿ãŒããã«ã§äœ¿çšãã <abbr title="Command Line Interface">CLI</abbr> ã¢ããªãæ§ç¯ããå Žåã¯ã<a href="https://typer.tiangolo.com/" class="external-link" target="_blank">**Typer**</a> ã確èªããŠãã ããã
+Web API ã®ä»£ããã«ã¿ãŒããã«ã§äœ¿çšãã <abbr title="Command Line Interface - ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹">CLI</abbr> ã¢ããªãæ§ç¯ããå Žåã¯ã<a href="https://typer.tiangolo.com/" class="external-link" target="_blank">**Typer**</a> ã確èªããŠãã ããã
**Typer** 㯠FastAPI ã®åŒåã§ãããããŠã**CLI ç FastAPI** ãæå³ããŠããŸãã âšïž ð
* ããŒã¿ã®æ€èšŒ:
* ããŒã¿ãç¡å¹ãªå Žåã«èªåã§æç¢ºãªãšã©ãŒãè¿ããŸãã
* æ·±ãå
¥ãåã«ãªã£ã JSON ãªããžã§ã¯ãã§ãæ€èšŒãå¯èœã§ãã
-* å
¥åããŒã¿ã® <abbr title="also known as: serialization, parsing, marshalling">倿</abbr>: ãããã¯ãŒã¯ãã Python ã®ããŒã¿ãåãžã以äžããèªã¿åããŸã:
+* å
¥åããŒã¿ã® <dfn title="å¥å: serializationãparsingãmarshalling">倿</dfn>: ãããã¯ãŒã¯ãã Python ã®ããŒã¿ãåãžã以äžããèªã¿åããŸã:
* JSONã
* ãã¹ãã©ã¡ãŒã¿ã
* ã¯ãšãªãã©ã¡ãŒã¿ã
* ããããŒã
* ãã©ãŒã ã
* ãã¡ã€ã«ã
-* åºåããŒã¿ã® <abbr title="also known as: serialization, parsing, marshalling">倿</abbr>: Python ã®ããŒã¿ãåãããããã¯ãŒã¯ããŒã¿ãžïŒJSON ãšããŠïŒå€æããŸã:
+* åºåããŒã¿ã® <dfn title="å¥å: serializationãparsingãmarshalling">倿</dfn>: Python ã®ããŒã¿ãåãããããã¯ãŒã¯ããŒã¿ãžïŒJSON ãšããŠïŒå€æããŸã:
* Python ã®åïŒ`str`ã`int`ã`float`ã`bool`ã`list` ãªã©ïŒã®å€æã
* `datetime` ãªããžã§ã¯ãã
* `UUID` ãªããžã§ã¯ãã
* **ããããŒ**ã**Cookie**ã**ãã©ãŒã ãã£ãŒã«ã**ã**ãã¡ã€ã«**ãªã©ãä»ã®ããŸããŸãªå Žæããã® **ãã©ã¡ãŒã¿** 宣èšã
* `maximum_length` ã `regex` ã®ãã㪠**æ€èšŒå¶çŽ** ãèšå®ããæ¹æ³ã
-* éåžžã«åŒ·åã§äœ¿ãããã **<abbr title="also known as components, resources, providers, services, injectables">äŸåæ§æ³šå
¥</abbr>** ã·ã¹ãã ã
+* éåžžã«åŒ·åã§äœ¿ãããã **<dfn title="å¥å: componentsãresourcesãprovidersãservicesãinjectables">äŸåæ§æ³šå
¥</dfn>** ã·ã¹ãã ã
* **JWT ããŒã¯ã³**ãçšãã **OAuth2** ã **HTTP Basic** èªèšŒã®ãµããŒããå«ããã»ãã¥ãªãã£ãšèªèšŒã
* **æ·±ããã¹ãããã JSON ã¢ãã«**ã宣èšããããã®ãããé«åºŠãªïŒãããåæ§ã«ç°¡åãªïŒææ³ïŒPydantic ã®ãããã§ãïŒã
* <a href="https://strawberry.rocks" class="external-link" target="_blank">Strawberry</a> ããã³ä»ã®ã©ã€ãã©ãªã«ãã **GraphQL** çµ±åã
* <a href="https://www.python-httpx.org" target="_blank"><code>httpx</code></a> - `TestClient` ã䜿çšãããå Žåã«å¿
èŠã§ãã
* <a href="https://jinja.palletsprojects.com" target="_blank"><code>jinja2</code></a> - ããã©ã«ãã®ãã³ãã¬ãŒãèšå®ã䜿çšãããå Žåã«å¿
èŠã§ãã
-* <a href="https://github.com/Kludex/python-multipart" target="_blank"><code>python-multipart</code></a> - `request.form()` ãšãšãã«ããã©ãŒã ã® <abbr title="converting the string that comes from an HTTP request into Python data">ãparsingã</abbr> ããµããŒããããå Žåã«å¿
èŠã§ãã
+* <a href="https://github.com/Kludex/python-multipart" target="_blank"><code>python-multipart</code></a> - `request.form()` ãšãšãã«ããã©ãŒã ã® <dfn title="HTTP ãªã¯ãšã¹ãããå±ãæååã Python ããŒã¿ã«å€æããããš">ãparsingã</dfn> ããµããŒããããå Žåã«å¿
èŠã§ãã
FastAPI ã«ãã£ãŠäœ¿çšããããã®:
# Pythonã®åã®çŽ¹ä» { #python-types-intro }
-Pythonã§ã¯ãªãã·ã§ã³ã®ãåãã³ããïŒãåã¢ãããŒã·ã§ã³ããšãåŒã°ããŸãïŒããµããŒããããŠããŸãã
+Python ã«ã¯ãªãã·ã§ã³ã®ãåãã³ããïŒãåã¢ãããŒã·ã§ã³ããšãåŒã°ããŸãïŒããµããŒããããŠããŸãã
-ã\81\93ã\82\8cã\82\89ã\81® **ã\80\8cÃ¥\9e\8bã\83\92ã\83³ã\83\88ã\80\8d** ã\81Ÿã\81\9fã\81¯ã\82¢ã\83\8eã\83\86ã\83΋\82·ã\83§ã\83³ã\81¯ã\80\81å€\89Ê\95°ã\81®<abbr title="for example: str, int, float, bool">Ã¥\9e\8b</abbr>ã宣èšã§ããç¹å¥ãªæ§æã§ãã
+ã\81\93ã\82\8cã\82\89ã\81® **ã\80\8cÃ¥\9e\8bã\83\92ã\83³ã\83\88ã\80\8d** ã\82\84ã\82¢ã\83\8eã\83\86ã\83΋\82·ã\83§ã\83³ã\81¯ã\80\81å€\89Ê\95°ã\81®<dfn title="ÀŸ\8bã\81\88ã\81°: strã\80\81intã\80\81floatã\80\81bool">Ã¥\9e\8b</dfn>ã宣èšã§ããç¹å¥ãªæ§æã§ãã
倿°ã«åã宣èšããããšã§ããšãã£ã¿ãŒãããŒã«ãããè¯ããµããŒããæäŸã§ããŸãã
-ããã¯Pythonã®åãã³ãã«ã€ããŠã® **ã¯ã€ãã¯ãã¥ãŒããªã¢ã«/ãªãã¬ãã·ã¥** ã«ãããŸããã**FastAPI** ã§äœ¿çšããããã«å¿
èŠãªæäœéã®ããšã ããã«ããŒããŠããŸãã...å®éã«ã¯æ¬åœã«å°ãªãã§ãã
+ãã㯠Python ã®åãã³ãã«ã€ããŠã® **ã¯ã€ãã¯ãã¥ãŒããªã¢ã«/ãªãã¬ãã·ã¥** ã«ãããŸããã**FastAPI** ã§äœ¿ãããã«å¿
èŠãªæäœéã®ããšã ããã«ããŒããŠããŸãã...å®éã«ã¯æ¬åœã«å°ãªãã§ãã
**FastAPI** ã¯ãã¹ãŠãããã®åãã³ãã«åºã¥ããŠãããå€ãã®åŒ·ã¿ãšå©ç¹ãäžããŠãããŸãã
/// note | åè
-ããããªããPythonã®å°éå®¶ã§ããã§ã«åãã³ãã«ã€ããŠãã¹ãŠç¥ã£ãŠããã®ã§ããã°ã次ã®ç« ãŸã§èªã¿é£ã°ããŠãã ããã
+ããããªãã Python ã®å°éå®¶ã§ããã§ã«åãã³ãã«ã€ããŠãã¹ãŠç¥ã£ãŠããã®ã§ããã°ã次ã®ç« ãŸã§èªã¿é£ã°ããŠãã ããã
///
ç°¡åãªäŸããå§ããŠã¿ãŸããã:
-{* ../../docs_src/python_types/tutorial001_py39.py *}
+{* ../../docs_src/python_types/tutorial001_py310.py *}
ãã®ããã°ã©ã ãåŒã³åºããšã以äžãåºåãããŸã:
ãã®é¢æ°ã¯ä»¥äžã®ãããªããšãè¡ããŸã:
-* `first_name`ãš`last_name`ãååŸããŸãã
-* `title()`ãçšããŠãããããã®æåã®æåã倧æåã«å€æããŸãã
-* çãäžã«ã¹ããŒã¹ãå
¥ããŠ<abbr title="Puts them together, as one. With the contents of one after the other.">é£çµ</abbr>ããŸãã
+* `first_name` ãš `last_name` ãååŸããŸãã
+* `title()` ãçšããŠãããããã®æåã®æåã倧æåã«å€æããŸãã
+* çãäžã«ã¹ããŒã¹ãå
¥ããŠ<dfn title="1ã€ã«ãŸãšããŸããçæ¹ã®å
容ãããçæ¹ã®åŸãã«ç¶ããŸãã">é£çµ</dfn>ããŸãã
-{* ../../docs_src/python_types/tutorial001_py39.py hl[2] *}
+{* ../../docs_src/python_types/tutorial001_py310.py hl[2] *}
### ç·šé { #edit-it }
ãããããããããšãæåã®æåã倧æåã«å€æãããã®ã¡ãœããããåŒã³åºãå¿
èŠããããŸãã
-ããã¯`upper`ã§ãããïŒ`uppercase`ã§ãããïŒ`first_uppercase`ïŒ`capitalize`ïŒ
+ãã㯠`upper` ã§ãããïŒ`uppercase` ã§ãããïŒ`first_uppercase`ïŒ`capitalize`ïŒ
ãããŠãå€ãããããã°ã©ããŒã®å人ã§ãããšãã£ã¿ã§èªåè£å®ã詊ããŠã¿ãŸãã
-颿°ã®æåã®ãã©ã¡ãŒã¿`first_name`ãå
¥åããããã(`.`)ãå
¥åããŠããã`Ctrl+Space`ãæŒããšè£å®ãå®è¡ãããŸãã
+颿°ã®æåã®ãã©ã¡ãŒã¿ `first_name` ãå
¥åãããããïŒ`.`ïŒãå
¥åããŠããã`Ctrl+Space` ãæŒããšè£å®ãå®è¡ãããŸãã
ããããæ²ããããšã«ãããã¯ãªãã®åœ¹ã«ãç«ã¡ãŸãã:
ããããåãã³ããã§ã:
-{* ../../docs_src/python_types/tutorial002_py39.py hl[1] *}
+{* ../../docs_src/python_types/tutorial002_py310.py hl[1] *}
ããã¯ã以äžã®ããã«ããã©ã«ãå€ã宣èšããã®ãšåãã§ã¯ãããŸãã:
ãããä»ãããªããåã³ãã®é¢æ°ãäœæããŠããæäžã«ãåãã³ãã䜿ã£ãŠãããšæ³åããŠã¿ãŠãã ããã
-åãã¿ã€ãã³ã°ã§`Ctrl+Space`ã§èªåè£å®ãå®è¡ãããšã以äžã®ããã«ãªããŸã:
+åãã¿ã€ãã³ã°ã§ `Ctrl+Space` ã§èªåè£å®ãå®è¡ãããšã以äžã®ããã«ãªããŸã:
<img src="/img/python-types/image02.png">
ãã®é¢æ°ãèŠãŠãã ããããã§ã«åãã³ããæã£ãŠããŸã:
-{* ../../docs_src/python_types/tutorial003_py39.py hl[1] *}
+{* ../../docs_src/python_types/tutorial003_py310.py hl[1] *}
ãšãã£ã¿ã¯å€æ°ã®åãç¥ã£ãŠããã®ã§ãè£å®ã ãã§ãªãããšã©ãŒãã§ãã¯ãããããšãã§ããŸã:
<img src="/img/python-types/image04.png">
-ããã§`age`ã`str(age)`ã§æååã«å€æããŠä¿®æ£ããå¿
èŠãããããšãããããŸã:
+ããã§ `age` ã `str(age)` ã§æååã«å€æããŠä¿®æ£ããå¿
èŠãããããšãããããŸã:
-{* ../../docs_src/python_types/tutorial004_py39.py hl[2] *}
+{* ../../docs_src/python_types/tutorial004_py310.py hl[2] *}
## åã®å®£èš { #declaring-types }
### åçŽãªå { #simple-types }
-`str`ã ãã§ãªããPythonã®æšæºçãªåãã¹ãŠã宣èšã§ããŸãã
+`str` ã ãã§ãªããPython ã®æšæºçãªåãã¹ãŠã宣èšã§ããŸãã
äŸãã°ã以äžã䜿çšå¯èœã§ã:
* `bool`
* `bytes`
-{* ../../docs_src/python_types/tutorial005_py39.py hl[1] *}
+{* ../../docs_src/python_types/tutorial005_py310.py hl[1] *}
-### åãã©ã¡ãŒã¿ãæã€ãžã§ããªãã¯å { #generic-types-with-type-parameters }
+### `typing` ã¢ãžã¥ãŒã« { #typing-module }
-ã\83\87ã\83΋\82¿Ê§\8bé\80 ã\81®ÀžÂã\81«ã\81¯ã\80\81`dict`ã\80\81`list`ã\80\81`set`ã\80\81`tuple`ã\81®ã\82\88ã\81\86ã\81«À»\96ã\81®å\80ۋ\82\92Ã¥\90«ã\82\80ã\81\93ã\81šã\81\8cã\81§ã\81\8dã\82\8bã\82\82ã\81®ã\81\8cã\81\82ã\82\8aã\81Ÿã\81\99ã\80\82ã\81Ÿã\81\9fÃ¥\86\85é\83šã\81®å\80ۋ\82\82ç\8b¬Ú\87ªã\81®å\9e\8bã\82\92Ê\8c\81ã\81ۋ\81\93ã\81šã\81\8cã\81§ã\81\8dã\81Ÿã\81\99ã\80\82
+ã\81\84ã\81\8fã\81€ã\81\8bã\81®Ú¿œå\8a ã\81®ã\83Šã\83Œã\82¹ã\82±ã\83Œã\82¹ã\81§ã\81¯ã\80\81ʚ\99ʺ\96ã\83©ã\82€ã\83\96ã\83©ã\83ªã\81® `typing` ã\83¢ã\82žã\83¥ã\83Œã\83«ã\81\8bã\82\89Àœ\95ã\81\8bã\82\92ã\82€ã\83³ã\83\9dã\83Œã\83\88ã\81\99ã\82\8bå¿\85ڊ\81ã\81\8cã\81\82ã\82\8bã\81\8bã\82\82ã\81\97ã\82\8cã\81Ÿã\81\9bã\82\93ã\80\82ÀŸ\8bã\81\88ã\81°ã\80\8cÀ»»Ê\84\8fã\81®å\9e\8bã\80\8dã\82\92å\8f\97ã\81\91À»\98ã\81\91ã\82\8bã\81\93ã\81šã\82\92宣ښ\80ã\81\97ã\81\9fã\81\84堎å\90\88ã\80\81`typing` ã\81® `Any` ã\82\92Àœ¿ã\81\88ã\81Ÿã\81\99:
-å
éšã®åãæã€ãããã®åã¯ã**generic**ãåãšåŒã°ããŸãããããŠãå
éšã®åãå«ããŠå®£èšããããšãå¯èœã§ãã
+```python
+from typing import Any
-ãããã®åãå
éšã®åã宣èšããã«ã¯ãPythonã®æšæºã¢ãžã¥ãŒã«`typing`ã䜿çšã§ããŸãããããã®åãã³ãããµããŒãããããã«ç¹å¥ã«ååšããŠããŸãã
-#### æ°ããPythonããŒãžã§ã³ { #newer-versions-of-python }
-
-`typing`ãäœ¿ãæ§æã¯ãPython 3.6ããææ°ããŒãžã§ã³ãŸã§ïŒPython 3.9ãPython 3.10ãªã©ãå«ãïŒãã¹ãŠã®ããŒãžã§ã³ãš **äºææ§** ããããŸãã
+def some_function(data: Any):
+ print(data)
+```
-Pythonãé²åããã«ã€ãã**æ°ããããŒãžã§ã³** ã§ã¯ãããã®åã¢ãããŒã·ã§ã³ãžã®ãµããŒããæ¹åãããå€ãã®å Žåãåã¢ãããŒã·ã§ã³ã宣èšããããã«`typing`ã¢ãžã¥ãŒã«ãã€ã³ããŒãããŠäœ¿ãå¿
èŠãããªããªããŸãã
+### ãžã§ããªãã¯å { #generic-types }
-ãããžã§ã¯ãã§ããæ°ããPythonããŒãžã§ã³ãéžã¹ããªãããã®è¿œå ã®ã·ã³ãã«ããæŽ»çšã§ããŸãã
+äžéšã®åã¯ãè§æ¬åŒ§å
ã§ãåãã©ã¡ãŒã¿ããåãåããå
éšã®åãå®çŸ©ã§ããŸããäŸãã°ãæååã®ãªã¹ãã㯠`list[str]` ãšããŠå®£èšããŸãã
-ã\83\89ã\82Âã\83¥ã\83¡ã\83³ã\83\88Ã¥\85šÀœ\93ã\81§ã\80\81Pythonã\81®å\90\84ã\83\90ã\83΋\82žã\83§ã\83³ã\81šÀº\92Ê\8f\9bÊ\80§ã\81®ã\81\82ã\82\8bÀŸ\8bïŒ\88å·®å\88\86ã\81\8cã\81\82ã\82\8b堎å\90\88ïŒ\89ã\82\92瀺ã\81\97ã\81Šã\81\84ãŸãã
+ã\81\93ã\81®ã\82\88ã\81\86ã\81«å\9e\8bã\83\91ã\83©ã\83¡ã\83΋\82¿ã\82\92Ã¥\8f\96ã\82\8cã\82\8bÃ¥\9e\8bã\81¯ **Generic types**ïŒ\88ã\82žã\82§ã\83\8dã\83ªã\82¯ã\82¹ïŒ\89ã\81šå\91΋\81°ã\82\8cãŸãã
-äŸãã°ã**Python 3.6+**ãã¯Python 3.6以äžïŒ3.7ã3.8ã3.9ã3.10ãªã©ãå«ãïŒãšäºææ§ãããããšãæå³ããŸãããŸãã**Python 3.9+**ãã¯Python 3.9以äžïŒ3.10ãªã©ãå«ãïŒãšäºææ§ãããããšãæå³ããŸãã
+次ã®çµã¿èŸŒã¿åããžã§ããªã¯ã¹ãšããŠïŒè§æ¬åŒ§ãšå
éšã®åã§ïŒäœ¿ããŸã:
-**ææ°ã®PythonããŒãžã§ã³** ã䜿ãããªããææ°ããŒãžã§ã³åãã®äŸã䜿ã£ãŠãã ãããäŸãã°ã**Python 3.10+**ãã®ããã«ãããã㯠**æè¯ãã€æãã·ã³ãã«ãªæ§æ** ã«ãªããŸãã
+* `list`
+* `tuple`
+* `set`
+* `dict`
#### List { #list }
-äŸãã°ã`str`ã®`list`ã®å€æ°ãå®çŸ©ããŠã¿ãŸãããã
+äŸãã°ã`str` ã® `list` ã®å€æ°ãå®çŸ©ããŠã¿ãŸãããã
åãã³ãã³ïŒ`:`ïŒã®æ§æã§å€æ°ã宣èšããŸãã
-åãšããŠã`list`ãæå®ããŸãã
+åãšããŠã`list` ãæå®ããŸãã
ãªã¹ãã¯ããã€ãã®å
éšã®åãå«ãåãªã®ã§ãããããè§æ¬åŒ§ã§å²ã¿ãŸã:
-{* ../../docs_src/python_types/tutorial006_py39.py hl[1] *}
+{* ../../docs_src/python_types/tutorial006_py310.py hl[1] *}
/// info | æ
å ±
è§æ¬åŒ§å
ã®å
éšã®åã¯ãåãã©ã¡ãŒã¿ããšåŒã°ããŠããŸãã
-ãã®å Žåã`str`ã¯`list`ã«æž¡ãããåãã©ã¡ãŒã¿ã§ãã
+ãã®å Žåã`str` 㯠`list` ã«æž¡ãããåãã©ã¡ãŒã¿ã§ãã
///
-ã€ãŸã: 倿°`items`ã¯`list`ã§ããããã®ãªã¹ãã®åé
ç®ã¯`str`ã§ãã
+ã€ãŸã: 倿° `items` 㯠`list` ã§ããããã®ãªã¹ãã®åé
ç®ã¯ `str` ã§ãã
ããããããšã§ããšãã£ã¿ã¯ãªã¹ãã®é
ç®ãåŠçããŠããéã«ããµããŒããæäŸã§ããŸãã
åããªããã°ãããã¯ã»ãŒäžå¯èœã§ãã
-倿°`item`ã¯ãªã¹ã`items`ã®èŠçŽ ã®äžã€ã§ããããšã«æ³šæããŠãã ããã
+倿° `item` ã¯ãªã¹ã `items` ã®èŠçŽ ã®äžã€ã§ããããšã«æ³šæããŠãã ããã
-ããã§ãããšãã£ã¿ã¯ããã`str`ã§ããããšãç¥ã£ãŠããŠããã®ããã®ãµããŒããæäŸããŠããŸãã
+ããã§ãããšãã£ã¿ã¯ããã `str` ã§ããããšãç¥ã£ãŠããŠããã®ããã®ãµããŒããæäŸããŠããŸãã
#### Tuple ãš Set { #tuple-and-set }
-`tuple`ãš`set`ã®å®£èšãåæ§ã§ã:
+`tuple` ãš `set` ã®å®£èšãåæ§ã§ã:
-{* ../../docs_src/python_types/tutorial007_py39.py hl[1] *}
+{* ../../docs_src/python_types/tutorial007_py310.py hl[1] *}
ã€ãŸã:
-* 倿°`items_t`ã¯`int`ãå¥ã®`int`ã`str`ã®3ã€ã®é
ç®ãæã€`tuple`ã§ãã
-* 倿°`items_s`ã¯`set`ã§ããããã®åé
ç®ã¯`bytes`åã§ãã
+* 倿° `items_t` 㯠`int`ãå¥ã® `int`ã`str` ã® 3 ã€ã®é
ç®ãæã€ `tuple` ã§ãã
+* 倿° `items_s` 㯠`set` ã§ããããã®åé
ç®ã¯ `bytes` åã§ãã
#### Dict { #dict }
-`dict`ãå®çŸ©ããã«ã¯ãã«ã³ãåºåãã§2ã€ã®åãã©ã¡ãŒã¿ãæž¡ããŸãã
+`dict` ãå®çŸ©ããã«ã¯ãã«ã³ãåºåãã§ 2 ã€ã®åãã©ã¡ãŒã¿ãæž¡ããŸãã
-æåã®åãã©ã¡ãŒã¿ã¯`dict`ã®ããŒã§ãã
+æåã®åãã©ã¡ãŒã¿ã¯ `dict` ã®ããŒã§ãã
-2çªç®ã®åãã©ã¡ãŒã¿ã¯`dict`ã®å€ã§ã:
+2 çªç®ã®åãã©ã¡ãŒã¿ã¯ `dict` ã®å€ã§ã:
-{* ../../docs_src/python_types/tutorial008_py39.py hl[1] *}
+{* ../../docs_src/python_types/tutorial008_py310.py hl[1] *}
ã€ãŸã:
-* 倿°`prices`ã¯`dict`ã§ã:
- * ãã®`dict`ã®ããŒã¯`str`åã§ãïŒäŸãã°ãåé
ç®ã®ååïŒã
- * ãã®`dict`ã®å€ã¯`float`åã§ãïŒäŸãã°ãåé
ç®ã®äŸ¡æ ŒïŒã
+* 倿° `prices` 㯠`dict` ã§ã:
+ * ãã® `dict` ã®ããŒã¯ `str` åã§ãïŒäŸãã°ãåé
ç®ã®ååïŒã
+ * ãã® `dict` ã®å€ã¯ `float` åã§ãïŒäŸãã°ãåé
ç®ã®äŸ¡æ ŒïŒã
#### Union { #union }
-倿°ã**è€æ°ã®åã®ãããã**ã«ãªãåŸãããšã宣èšã§ããŸããäŸãã°ã`int`ãŸãã¯`str`ã§ãã
-
-Python 3.6以äžïŒPython 3.10ãå«ãïŒã§ã¯ã`typing`ã®`Union`åã䜿ããè§æ¬åŒ§ã®äžã«åãä»ããå¯èœæ§ã®ããåãå
¥ããããŸãã
+倿°ã **è€æ°ã®åã®ãããã** ã«ãªãåŸãããšã宣èšã§ããŸããäŸãã°ã`int` ãŸã㯠`str` ã§ãã
-Python 3.10ã§ã¯ãåãä»ããå¯èœæ§ã®ããåã<abbr title='also called "bitwise or operator", but that meaning is not relevant here'>瞊æ£ïŒ`|`ïŒ</abbr>ã§åºåã£ãŠæžãã **æ°ããæ§æ** ããããŸãã
+ãããå®çŸ©ããã«ã¯ãäž¡æ¹ã®åãåºåãããã« <dfn title="ããããåäœã® OR æŒç®åããšãåŒã°ããŸãããããã§ã®æå³ãšã¯é¢ä¿ãããŸããã">瞊æ£ïŒ`|`ïŒ</dfn> ã䜿ããŸãã
-//// tab | Python 3.10+
+ããã¯ããŠããªã³ïŒunionïŒããšåŒã°ããŸãã倿°ãããã 2 ã€ã®åã®éåã®åéåã®ããããã«ãªãåŸãããã§ãã
```Python hl_lines="1"
{!> ../../docs_src/python_types/tutorial008b_py310.py!}
```
-////
-
-//// tab | Python 3.9+
-
-```Python hl_lines="1 4"
-{!> ../../docs_src/python_types/tutorial008b_py39.py!}
-```
-
-////
-
-ã©ã¡ãã®å Žåãã`item`ã¯`int`ãŸãã¯`str`ã«ãªãåŸãããšãæå³ããŸãã
-
-#### `None`ã®å¯èœæ§ { #possibly-none }
-
-å€ã`str`ã®ãããªåãæã€å¯èœæ§ãããäžæ¹ã§ã`None`ã«ããªãåŸãããšã宣èšã§ããŸãã
-
-Python 3.6以äžïŒPython 3.10ãå«ãïŒã§ã¯ã`typing`ã¢ãžã¥ãŒã«ãã`Optional`ãã€ã³ããŒãããŠäœ¿ãããšã§å®£èšã§ããŸãã
-
-```Python hl_lines="1 4"
-{!../../docs_src/python_types/tutorial009_py39.py!}
-```
-
-ãã ã®`str`ã®ä»£ããã«`Optional[str]`ã䜿çšããããšã§ãå€ãåžžã«`str`ã§ãããšä»®å®ããŠãããšãã«ãå®éã«ã¯`None`ã§ããå¯èœæ§ããããšãããšã©ãŒããšãã£ã¿ãæ€åºããã®ã«åœ¹ç«ã¡ãŸãã
+ãã㯠`item` ã `int` ãŸã㯠`str` ã«ãªãåŸãããšãæå³ããŸã.
-`Optional[Something]`ã¯å®éã«ã¯`Union[Something, None]`ã®ã·ã§ãŒãã«ããã§ãäž¡è
ã¯ç䟡ã§ãã
+#### `None` ã®å¯èœæ§ { #possibly-none }
-ããã¯ãPython 3.10ã§ã¯`Something | None`ã䜿ããããšãæå³ããŸã:
+å€ã `str` ã®ãããªåãæã€å¯èœæ§ãããäžæ¹ã§ã`None` ã«ããªãåŸãããšã宣èšã§ããŸãã
//// tab | Python 3.10+
////
-//// tab | Python 3.9+
-
-```Python hl_lines="1 4"
-{!> ../../docs_src/python_types/tutorial009_py39.py!}
-```
-
-////
-
-//// tab | Python 3.9+ alternative
-
-```Python hl_lines="1 4"
-{!> ../../docs_src/python_types/tutorial009b_py39.py!}
-```
-
-////
-
-#### `Union`ãŸãã¯`Optional`ã®äœ¿çš { #using-union-or-optional }
-
-Python 3.10æªæºã®ããŒãžã§ã³ã䜿ã£ãŠããå Žåãããã¯ç§ã®ãšãŠã **䞻芳ç** ãªèгç¹ããã®ãã³ãã§ã:
-
-* ðš `Optional[SomeType]`ã¯é¿ããŠãã ãã
-* 代ããã« âš **`Union[SomeType, None]`ã䜿ã£ãŠãã ãã** âš
-
-ã©ã¡ããç䟡ã§ãå
éšçã«ã¯åãã§ããã`Optional`ãã`Union`ãããããããŸãããšããã®ãã**optional**ããšããåèªã¯å€ããªãã·ã§ã³ã§ããããšã瀺åããããã«èŠããŸãããå®éã«ã¯ã`None`ã«ãªãåŸãããšããæå³ã§ããããªãã·ã§ã³ã§ã¯ãªãå¿
é ã§ããå Žåã§ãããã ããã§ãã
-
-`Union[SomeType, None]`ã®ã»ããæå³ãããæç€ºçã ãšæããŸãã
-
-ããã¯èšèãååã®è©±ã«ãããŸããããããããã®èšèã¯ããªããããŒã ã¡ã€ããã³ãŒããã©ãèãããã«åœ±é¿ãåŸãŸãã
-
-äŸãšããŠããã®é¢æ°ãèŠãŠã¿ãŸããã:
-
-{* ../../docs_src/python_types/tutorial009c_py39.py hl[1,4] *}
-
-ãã©ã¡ãŒã¿`name`ã¯`Optional[str]`ãšããŠå®çŸ©ãããŠããŸããã**ãªãã·ã§ã³ã§ã¯ãããŸãã**ããã®ãã©ã¡ãŒã¿ãªãã§é¢æ°ãåŒã³åºããŸãã:
-
-```Python
-say_hi() # Oh, no, this throws an error! ð±
-```
-
-`name`ãã©ã¡ãŒã¿ã¯ããã©ã«ãå€ããªãããã**äŸç¶ãšããŠå¿
é **ïŒ*optional*ã§ã¯ãªãïŒã§ããããã§ãã`name`ã¯å€ãšããŠ`None`ãåãä»ããŸã:
-
-```Python
-say_hi(name=None) # This works, None is valid ð
-```
-
-è¯ãç¥ãããšããŠãPython 3.10ã«ãªãã°ãã®å¿é
ã¯äžèŠã§ããåã®ãŠããªã³ãå®çŸ©ããããã«`|`ãåçŽã«äœ¿ããããã§ã:
-
-{* ../../docs_src/python_types/tutorial009c_py310.py hl[1,4] *}
-
-ãããŠã`Optional`ã`Union`ã®ãããªååã«ã€ããŠå¿é
ããå¿
èŠããªããªããŸããð
-
-#### ãžã§ããªãã¯å { #generic-types }
-
-è§æ¬åŒ§ã§åãã©ã¡ãŒã¿ãåããããã®åã¯ãäŸãã°æ¬¡ã®ããã« **Generic types** ãŸã㯠**Generics** ãšåŒã°ããŸã:
-
-//// tab | Python 3.10+
-
-åãçµã¿èŸŒã¿åããžã§ããªã¯ã¹ãšããŠïŒè§æ¬åŒ§ãšå
éšã®åã§ïŒäœ¿ããŸã:
-
-* `list`
-* `tuple`
-* `set`
-* `dict`
-
-ãŸãããããŸã§ã®PythonããŒãžã§ã³ãšåæ§ã«ã`typing`ã¢ãžã¥ãŒã«ãã:
-
-* `Union`
-* `Optional`
-* ...and others.
-
-Python 3.10ã§ã¯ããžã§ããªã¯ã¹ã®`Union`ã`Optional`ã䜿ã代æ¿ãšããŠãåã®ãŠããªã³ã宣èšããããã«<abbr title='also called "bitwise or operator", but that meaning is not relevant here'>瞊æ£ïŒ`|`ïŒ</abbr>ã䜿ããŸããããã¯ãã£ãšè¯ããããã·ã³ãã«ã§ãã
-
-////
-
-//// tab | Python 3.9+
-
-åãçµã¿èŸŒã¿åããžã§ããªã¯ã¹ãšããŠïŒè§æ¬åŒ§ãšå
éšã®åã§ïŒäœ¿ããŸã:
-
-* `list`
-* `tuple`
-* `set`
-* `dict`
-
-ãããŠ`typing`ã¢ãžã¥ãŒã«ã®ãžã§ããªã¯ã¹:
-
-* `Union`
-* `Optional`
-* ...and others.
-
-////
+ãã ã® `str` ã®ä»£ããã« `str | None` ã䜿çšããããšã§ãå€ãåžžã« `str` ã§ãããšä»®å®ããŠãããšãã«ãå®éã«ã¯ `None` ã§ããå¯èœæ§ããããšãããšã©ãŒããšãã£ã¿ãæ€åºããã®ã«åœ¹ç«ã¡ãŸãã
### åãšããŠã®ã¯ã©ã¹ { #classes-as-types }
倿°ã®åãšããŠã¯ã©ã¹ã宣èšããããšãã§ããŸãã
-ååãæã€`Person`ã¯ã©ã¹ããããšããŸããã:
+ååãæã€ `Person` ã¯ã©ã¹ããããšããŸããã:
-{* ../../docs_src/python_types/tutorial010_py39.py hl[1:3] *}
+{* ../../docs_src/python_types/tutorial010_py310.py hl[1:3] *}
-倿°ã`Person`åãšããŠå®£èšã§ããŸã:
+倿°ã `Person` åãšããŠå®£èšã§ããŸã:
-{* ../../docs_src/python_types/tutorial010_py39.py hl[6] *}
+{* ../../docs_src/python_types/tutorial010_py310.py hl[6] *}
ãããŠãåã³ããã¹ãŠã®ãšãã£ã¿ã®ãµããŒããåŸãããšãã§ããŸã:
<img src="/img/python-types/image06.png">
-ããã¯ã`one_person`ã¯ã¯ã©ã¹`Person`ã®**ã€ã³ã¹ã¿ã³ã¹**ã§ãããããšãæå³ããŸãã
+ããã¯ã`one_person` ã¯ã¯ã©ã¹ `Person` ã® **ã€ã³ã¹ã¿ã³ã¹** ã§ãããããšãæå³ããŸãã
-ã`one_person`ã¯`Person`ãšããååã®**ã¯ã©ã¹**ã§ããããšããæå³ã§ã¯ãããŸããã
+ã`one_person` 㯠`Person` ãšããååã® **ã¯ã©ã¹** ã§ããããšããæå³ã§ã¯ãããŸããã
-## Pydanticã®ã¢ãã« { #pydantic-models }
+## Pydantic ã®ã¢ãã« { #pydantic-models }
-<a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> ã¯ããŒã¿æ€èšŒãè¡ãããã®Pythonã©ã€ãã©ãªã§ãã
+<a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> ã¯ããŒã¿æ€èšŒãè¡ãããã® Python ã©ã€ãã©ãªã§ãã
ããŒã¿ã®ã圢ãã屿§ä»ãã®ã¯ã©ã¹ãšããŠå®£èšããŸãã
ãŸãããã®çµæã®ãªããžã§ã¯ãã§ãã¹ãŠã®ãšãã£ã¿ã®ãµããŒããåããããšãã§ããŸãã
-Pydanticã®å
¬åŒããã¥ã¡ã³ãããã®äŸ:
+Pydantic ã®å
¬åŒããã¥ã¡ã³ãããã®äŸ:
{* ../../docs_src/python_types/tutorial011_py310.py *}
/// info | æ
å ±
-<a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydanticã®è©³çްã¯ããã¥ã¡ã³ããåç
§ããŠãã ãã</a>ã
+<a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic ã®è©³çްã¯ããã¥ã¡ã³ããåç
§ããŠãã ãã</a>ã
///
-**FastAPI** ã¯ãã¹ãŠPydanticãããŒã¹ã«ããŠããŸãã
+**FastAPI** ã¯ãã¹ãŠ Pydantic ãããŒã¹ã«ããŠããŸãã
-ãã¹ãŠã®ããšã¯[ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã](tutorial/index.md){.internal-link target=_blank}ã§å®éã«èŠãããšãã§ããŸãã
-
-/// tip | è±ç¥è
-
-Pydanticã«ã¯ãããã©ã«ãå€ãªãã§`Optional`ãŸãã¯`Union[Something, None]`ã䜿ã£ãå Žåã®ç¹å¥ãªæåããããŸãã詳现ã¯Pydanticããã¥ã¡ã³ãã®<a href="https://docs.pydantic.dev/2.3/usage/models/#required-fields" class="external-link" target="_blank">Required Optional fields</a>ãåç
§ããŠãã ããã
-
-///
+ãã¹ãŠã®ããšã¯ [ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã](tutorial/index.md){.internal-link target=_blank} ã§å®éã«èŠãããšãã§ããŸãã
## ã¡ã¿ããŒã¿ã¢ãããŒã·ã§ã³ä»ãåãã³ã { #type-hints-with-metadata-annotations }
-Pythonã«ã¯ã`Annotated`ã䜿ã£ãŠåãã³ãã«**远å ã®<abbr title="Data about the data, in this case, information about the type, e.g. a description.">ã¡ã¿ããŒã¿</abbr>**ãä»äžã§ããæ©èœããããŸãã
+Python ã«ã¯ã`Annotated` ã䜿ã£ãŠåãã³ãã« **远å ã® <dfn title="ããŒã¿ã«é¢ããããŒã¿ããã®å Žåã¯åã«é¢ããæ
å ±ïŒäŸãã°èª¬æïŒã">ã¡ã¿ããŒã¿</dfn>** ãä»äžã§ããæ©èœããããŸãã
-Python 3.9以éã`Annotated`ã¯æšæºã©ã€ãã©ãªã®äžéšãªã®ã§ã`typing`ããã€ã³ããŒãã§ããŸãã
+`Annotated` 㯠`typing` ããã€ã³ããŒãã§ããŸãã
-{* ../../docs_src/python_types/tutorial013_py39.py hl[1,4] *}
+{* ../../docs_src/python_types/tutorial013_py310.py hl[1,4] *}
-Pythonèªäœã¯ããã®`Annotated`ã§äœããããããã§ã¯ãããŸããããŸãããšãã£ã¿ãä»ã®ããŒã«ã«ãšã£ãŠããåã¯äŸç¶ãšããŠ`str`ã§ãã
+Python èªäœã¯ããã® `Annotated` ã§äœããããããã§ã¯ãããŸããããŸãããšãã£ã¿ãä»ã®ããŒã«ã«ãšã£ãŠããåã¯äŸç¶ãšã㊠`str` ã§ãã
-ãããã`Annotated`å
ã®ãã®ã¹ããŒã¹ã䜿ã£ãŠãã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«åäœãããããã«ã€ããŠã®è¿œå ã¡ã¿ããŒã¿ã **FastAPI** ã«æäŸã§ããŸãã
+ãããã`Annotated` å
ã®ãã®ã¹ããŒã¹ã䜿ã£ãŠãã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«åäœãããããã«ã€ããŠã®è¿œå ã¡ã¿ããŒã¿ã **FastAPI** ã«æäŸã§ããŸãã
-èŠããŠããã¹ãéèŠãªç¹ã¯ã`Annotated`ã«æž¡ã**æåã®*åãã©ã¡ãŒã¿***ã**å®éã®å**ã§ããããšã§ããæ®ãã¯ãä»ã®ããŒã«åãã®ã¡ã¿ããŒã¿ã«ãããŸããã
+èŠããŠããã¹ãéèŠãªç¹ã¯ã`Annotated` ã«æž¡ã **æåã®ãåãã©ã¡ãŒã¿ã** ã **å®éã®å** ã§ããããšã§ããæ®ãã¯ãä»ã®ããŒã«åãã®ã¡ã¿ããŒã¿ã«ãããŸããã
-ä»ã®ãšããã¯ã`Annotated`ãååšãããããæšæºã®Pythonã§ããããšãç¥ã£ãŠããã°ååã§ããð
+ä»ã®ãšããã¯ã`Annotated` ãååšãããããæšæºã® Python ã§ããããšãç¥ã£ãŠããã°ååã§ããð
-åŸã§ããããã©ãã»ã©**匷å**ã«ãªãåŸãããèŠãããšã«ãªããŸãã
+åŸã§ããããã©ãã»ã© **匷å** ã«ãªãåŸãããèŠãããšã«ãªããŸãã
/// tip | è±ç¥è
-ããã **æšæºã®Python** ã§ãããšããäºå®ã¯ããšãã£ã¿ã§ã䜿çšããŠããããŒã«ïŒã³ãŒãã®è§£æããªãã¡ã¯ã¿ãªã³ã°ãªã©ïŒãšãšãã«ã**å¯èœãªéãæé«ã®éçºäœéš**ãåŸãããããšãæå³ããŸãã âš
+ããã **æšæºã® Python** ã§ãããšããäºå®ã¯ããšãã£ã¿ã§ã䜿çšããŠããããŒã«ïŒã³ãŒãã®è§£æããªãã¡ã¯ã¿ãªã³ã°ãªã©ïŒãšãšãã«ã**å¯èœãªéãæé«ã®éçºäœéš** ãåŸãããããšãæå³ããŸãã âš
-ãŸããããªãã®ã³ãŒããä»ã®å€ãã®PythonããŒã«ãã©ã€ãã©ãªãšãéåžžã«äºææ§ãé«ãããšãæå³ããŸãã ð
+ãŸããããªãã®ã³ãŒããä»ã®å€ãã® Python ããŒã«ãã©ã€ãã©ãªãšãéåžžã«äºææ§ãé«ãããšãæå³ããŸãã ð
///
-## **FastAPI**ã§ã®åãã³ã { #type-hints-in-fastapi }
+## **FastAPI** ã§ã®åãã³ã { #type-hints-in-fastapi }
**FastAPI** ã¯ãããã®åãã³ããå©çšããŠããã€ãã®ããšãè¡ããŸãã
* **ããŒã¿ã®å€æ**: ãªã¯ãšã¹ãããå¿
èŠãªåã«ããŒã¿ã倿ããŸãã
* **ããŒã¿ã®æ€èšŒ**: åãªã¯ãšã¹ãããæ¥ãããŒã¿ã«ã€ããŠ:
* ããŒã¿ãç¡å¹ãªå Žåã«ã¯ã©ã€ã¢ã³ãã«è¿ããã **èªåãšã©ãŒ** ãçæããŸãã
-* OpenAPIã䜿çšããŠAPIã**ããã¥ã¡ã³ãå**ããŸã:
+* OpenAPI ã䜿çšã㊠API ã **ããã¥ã¡ã³ãå** ããŸã:
* ããã¯èªåã®å¯Ÿè©±åããã¥ã¡ã³ãã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã§äœ¿ãããŸãã
-ãã¹ãŠãæœè±¡çã«èããããããããŸãããå¿é
ããªãã§ãã ããã ãã®å
šãŠã®åäœã¯ [ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã](tutorial/index.md){.internal-link target=_blank}ã§èŠãããšãã§ããŸãã
+ãã¹ãŠãæœè±¡çã«èããããããããŸãããå¿é
ããªãã§ãã ããã ãã®å
šãŠã®åäœã¯ [ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã](tutorial/index.md){.internal-link target=_blank} ã§èŠãããšãã§ããŸãã
-éèŠãªã®ã¯ãPythonã®æšæºçãªåã䜿ãããšã§ãïŒã¯ã©ã¹ããã³ã¬ãŒã¿ãªã©ã远å ããã®ã§ã¯ãªãïŒ1ã€ã®å Žæã§ **FastAPI** ãå€ãã®äœæ¥ã代ããã«ãã£ãŠãããŠãããšããããšã§ãã
+éèŠãªã®ã¯ãPython ã®æšæºçãªåã䜿ãããšã§ãïŒã¯ã©ã¹ããã³ã¬ãŒã¿ãªã©ã远å ããã®ã§ã¯ãªãïŒ1 ã€ã®å Žæã§ **FastAPI** ãå€ãã®äœæ¥ã代ããã«ãã£ãŠãããŠãããšããããšã§ãã
/// info | æ
å ±
-ãã§ã«ãã¹ãŠã®ãã¥ãŒããªã¢ã«ãçµããŠãåã«ã€ããŠã®è©³çްãèŠãããã«ãã®ããŒãžã«æ»ã£ãŠããå Žåã¯ãè¯ããªãœãŒã¹ãšããŠ<a href="https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html" class="external-link" target="_blank">`mypy`ã®ãããŒãã·ãŒãã</a>ããããŸãã
+ãã§ã«ãã¹ãŠã®ãã¥ãŒããªã¢ã«ãçµããŠãåã«ã€ããŠã®è©³çްãèŠãããã«ãã®ããŒãžã«æ»ã£ãŠããå Žåã¯ãè¯ããªãœãŒã¹ãšã㊠<a href="https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html" class="external-link" target="_blank">`mypy` ã®ãããŒãã·ãŒãã</a> ããããŸãã
///
--- /dev/null
+# ãªãœãŒã¹ { #resources }
+
+远å ãªãœãŒã¹ãå€éšãªã³ã¯ãªã©ãâïž
--- /dev/null
+/// details | ð AI ãšäººéã«ãã翻蚳
+
+ãã®ç¿»èš³ã¯ã人éã®ã¬ã€ãã«åºã¥ã㊠AI ã«ãã£ãŠäœæãããŸãããð€
+
+åæã®æå³ãåãéããŠããããäžèªç¶ãªè¡šçŸã«ãªã£ãŠããå¯èœæ§ããããŸããð€
+
+[AI LLM ãããé©åã«èªå°ããã®ãæäŒã](https://fastapi.tiangolo.com/ja/contributing/#translations) ããšã§ããã®ç¿»èš³ãæ¹åã§ããŸãã
+
+[è±èªç](ENGLISH_VERSION_URL)
+
+///
ãŸãåãã«ã`BackgroundTasks` ãã€ã³ããŒããã`BackgroundTasks` ã®å宣èšãšå
±ã«ã*path operation function* ã®ãã©ã¡ãŒã¿ãŒãå®çŸ©ããŸã:
-{* ../../docs_src/background_tasks/tutorial001_py39.py hl[1,13] *}
+{* ../../docs_src/background_tasks/tutorial001_py310.py hl[1,13] *}
**FastAPI** ã¯ã`BackgroundTasks` åã®ãªããžã§ã¯ããäœæãããã®ãã©ã¡ãŒã¿ãŒã«æž¡ããŸãã
ãŸããæžãèŸŒã¿æäœã§ã¯ `async` ãš `await` ã䜿çšããªããããéåžžã® `def` ã§é¢æ°ãå®çŸ©ããŸãã
-{* ../../docs_src/background_tasks/tutorial001_py39.py hl[6:9] *}
+{* ../../docs_src/background_tasks/tutorial001_py310.py hl[6:9] *}
## ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã®è¿œå { #add-the-background-task }
*path operation function* å
ã§ã`.add_task()` ã¡ãœããã䜿çšããŠã¿ã¹ã¯é¢æ°ã *background tasks* ãªããžã§ã¯ãã«æž¡ããŸãã
-{* ../../docs_src/background_tasks/tutorial001_py39.py hl[14] *}
+{* ../../docs_src/background_tasks/tutorial001_py310.py hl[14] *}
`.add_task()` ã¯ä»¥äžã®åŒæ°ãåãåããŸã:
--- /dev/null
+# å€§èŠæš¡ã¢ããªã±ãŒã·ã§ã³ - è€æ°ãã¡ã€ã« { #bigger-applications-multiple-files }
+
+ã¢ããªã±ãŒã·ã§ã³ã Web API ãäœãå Žåããã¹ãŠã1ã€ã®ãã¡ã€ã«ã«åããããããšã¯ã»ãšãã©ãããŸããã
+
+**FastAPI** ã¯ãæè»æ§ãä¿ã£ããŸãŸã¢ããªã±ãŒã·ã§ã³ãæ§é åã§ãã䟿å©ãªããŒã«ãæäŸããŸãã
+
+/// info | æ
å ±
+
+Flask åºèº«ã§ããã°ãFlask ã® Blueprint ã«çžåœããŸãã
+
+///
+
+## äŸã®ãã¡ã€ã«æ§æ { #an-example-file-structure }
+
+次ã®ãããªãã¡ã€ã«æ§æããããšããŸã:
+
+```
+.
+âââ app
+â  âââ __init__.py
+â  âââ main.py
+â  âââ dependencies.py
+â  âââ routers
+â  â âââ __init__.py
+â  â âââ items.py
+â  â âââ users.py
+â  âââ internal
+â  âââ __init__.py
+â  âââ admin.py
+```
+
+/// tip | è±ç¥è
+
+è€æ°ã® `__init__.py` ãã¡ã€ã«ããããŸã: åãã£ã¬ã¯ããªããµããã£ã¬ã¯ããªã«1ã€ãã€ã§ãã
+
+ããã«ããããããã¡ã€ã«ããå¥ã®ãã¡ã€ã«ãžã³ãŒããã€ã³ããŒãã§ããŸãã
+
+äŸãã°ã`app/main.py` ã§ã¯æ¬¡ã®ããã«æžããŸã:
+
+```
+from app.routers import items
+```
+
+///
+
+* `app` ãã£ã¬ã¯ããªã¯ãã¹ãŠãå«ã¿ãŸãããããŠç©ºã®ãã¡ã€ã« `app/__init__.py` ãããããPython ããã±ãŒãžãïŒãPython ã¢ãžã¥ãŒã«ãã®éåïŒ: `app` ã§ãã
+* `app/main.py` ãã¡ã€ã«ããããŸããPython ããã±ãŒãžïŒ`__init__.py` ã®ãããã£ã¬ã¯ããªïŒã®äžã«ããããããã®ããã±ãŒãžã®ãã¢ãžã¥ãŒã«ã: `app.main` ã§ãã
+* `app/dependencies.py` ãã¡ã€ã«ãããã`app/main.py` ãšåæ§ã«ãã¢ãžã¥ãŒã«ã: `app.dependencies` ã§ãã
+* `app/routers/` ãµããã£ã¬ã¯ããªã«å¥ã® `__init__.py` ãããã®ã§ããPython ãµãããã±ãŒãžã: `app.routers` ã§ãã
+* `app/routers/items.py` ã¯ããã±ãŒãž `app/routers/` å
ã®ãã¡ã€ã«ãªã®ã§ããµãã¢ãžã¥ãŒã«: `app.routers.items` ã§ãã
+* `app/routers/users.py` ãåæ§ã§ãå¥ã®ãµãã¢ãžã¥ãŒã«: `app.routers.users` ã§ãã
+* `app/internal/` ãµããã£ã¬ã¯ããªã«ã `__init__.py` ãããã®ã§ãå¥ã®ãPython ãµãããã±ãŒãžã: `app.internal` ã§ãã
+* `app/internal/admin.py` ã¯å¥ã®ãµãã¢ãžã¥ãŒã«: `app.internal.admin` ã§ãã
+
+<img src="/img/tutorial/bigger-applications/package.drawio.svg">
+
+åããã¡ã€ã«æ§æã«ã³ã¡ã³ããä»ãããšæ¬¡ã®ãšããã§ã:
+
+```bash
+.
+âââ app # "app" is a Python package
+â  âââ __init__.py # this file makes "app" a "Python package"
+â  âââ main.py # "main" module, e.g. import app.main
+â  âââ dependencies.py # "dependencies" module, e.g. import app.dependencies
+â  âââ routers # "routers" is a "Python subpackage"
+â  â âââ __init__.py # makes "routers" a "Python subpackage"
+â  â âââ items.py # "items" submodule, e.g. import app.routers.items
+â  â âââ users.py # "users" submodule, e.g. import app.routers.users
+â  âââ internal # "internal" is a "Python subpackage"
+â  âââ __init__.py # makes "internal" a "Python subpackage"
+â  âââ admin.py # "admin" submodule, e.g. import app.internal.admin
+```
+
+## `APIRouter` { #apirouter }
+
+ãŠãŒã¶ãŒã ããæ±ããã¡ã€ã«ã `/app/routers/users.py` ã®ãµãã¢ãžã¥ãŒã«ã ãšããŸãã
+
+ãŠãŒã¶ãŒã«é¢é£ãã *path operations* ãã»ãã®ã³ãŒãããåé¢ããŠæŽçãããã¯ãã§ãã
+
+ãã ããåã **FastAPI** ã¢ããªã±ãŒã·ã§ã³ / Web APIïŒåããPython ããã±ãŒãžãã®äžéšïŒã§ããç¹ã¯å€ãããŸããã
+
+ãã®ã¢ãžã¥ãŒã«ã§ `APIRouter` ã䜿ã£ãŠ *path operations* ãäœæã§ããŸãã
+
+### `APIRouter` ã®ã€ã³ããŒã { #import-apirouter }
+
+ã¯ã©ã¹ `FastAPI` ãšåæ§ã«ã€ã³ããŒããããã€ã³ã¹ã¿ã³ã¹ããäœæããŸã:
+
+{* ../../docs_src/bigger_applications/app_an_py310/routers/users.py hl[1,3] title["app/routers/users.py"] *}
+
+### `APIRouter` ã§ã® *path operations* { #path-operations-with-apirouter }
+
+ããã䜿ã£ãŠ *path operations* ã宣èšããŸãã
+
+äœ¿ãæ¹ã¯ `FastAPI` ã¯ã©ã¹ãšåãã§ã:
+
+{* ../../docs_src/bigger_applications/app_an_py310/routers/users.py hl[6,11,16] title["app/routers/users.py"] *}
+
+`APIRouter` ã¯ããã `FastAPI`ãã®ãããªã¯ã©ã¹ãšèããããŸãã
+
+åããªãã·ã§ã³ããã¹ãŠãµããŒããããŠããŸãã
+
+åã `parameters`ã`responses`ã`dependencies`ã`tags` ãªã©ã䜿ããŸãã
+
+/// tip | è±ç¥è
+
+ãã®äŸã§ã¯å€æ°å㯠`router` ã§ãããä»»æã®ååãä»ããããŸãã
+
+///
+
+ãã® `APIRouter` ãã¡ã€ã³ã® `FastAPI` ã¢ããªã«åã蟌ã¿ãŸããããã®åã«äŸåé¢ä¿ãšå¥ã® `APIRouter` ã確èªããŸãã
+
+## äŸåé¢ä¿ { #dependencies }
+
+ã¢ããªã±ãŒã·ã§ã³ã®è€æ°ç®æã§äœ¿ãäŸåé¢ä¿ãå¿
èŠã«ãªããŸãã
+
+ãã®ãããå°çšã® `dependencies` ã¢ãžã¥ãŒã«ïŒ`app/dependencies.py`ïŒã«çœ®ããŸãã
+
+ããã§ã¯ã«ã¹ã¿ã ããã㌠`X-Token` ãèªãç°¡åãªäŸåé¢ä¿ã䜿ããŸã:
+
+{* ../../docs_src/bigger_applications/app_an_py310/dependencies.py hl[3,6:8] title["app/dependencies.py"] *}
+
+/// tip | è±ç¥è
+
+ãã®äŸãç°¡åã«ããããã«æ¶ç©ºã®ããããŒã䜿ã£ãŠããŸãã
+
+ãããå®éã«ã¯ãçµã¿èŸŒã¿ã® [Security utilities](security/index.md){.internal-link target=_blank} ãäœ¿ãæ¹ãè¯ãçµæã«ãªããŸãã
+
+///
+
+## å¥ã¢ãžã¥ãŒã«ã§ã® `APIRouter` { #another-module-with-apirouter }
+
+ã¢ããªã±ãŒã·ã§ã³ã®ãitemsããæ±ããšã³ããã€ã³ãã `app/routers/items.py` ã®ã¢ãžã¥ãŒã«ã«ãããšããŸãã
+
+次㮠*path operations* ããããŸã:
+
+* `/items/`
+* `/items/{item_id}`
+
+æ§é 㯠`app/routers/users.py` ãšåãã§ãã
+
+ããããããå°ãè³¢ãããŠã³ãŒããå°ãç°¡æœã«ããããšããã§ãã
+
+ãã®ã¢ãžã¥ãŒã«ã®ãã¹ãŠã® *path operations* ã«ã¯åããã®ããããšåãã£ãŠããŸã:
+
+* ãã¹ã® `prefix`: `/items`
+* `tags`ïŒ1ã€ã®ã¿ã°: `items`ïŒ
+* 远å ã® `responses`
+* `dependencies`: å
ã»ã©äœæãã `X-Token` ã®äŸåé¢ä¿ãå¿
èŠ
+
+ããã§ãå *path operation* ã«åå¥ã«è¿œå ãã代ããã«ããããã `APIRouter` ã«è¿œå ã§ããŸãã
+
+{* ../../docs_src/bigger_applications/app_an_py310/routers/items.py hl[5:10,16,21] title["app/routers/items.py"] *}
+
+å *path operation* ã®ãã¹ã¯æ¬¡ã®ããã« `/` ã§å§ããå¿
èŠããããã:
+
+```Python hl_lines="1"
+@router.get("/{item_id}")
+async def read_item(item_id: str):
+ ...
+```
+
+...prefix ã®æ«å°Ÿã« `/` ãå«ããŠã¯ãããŸããã
+
+ãã®å Žåã® prefix 㯠`/items` ã§ãã
+
+ãŸãã`tags` ã®ãªã¹ãã远å ã® `responses` ãããã®ã«ãŒã¿ãŒã«å«ãŸãããã¹ãŠã® *path operations* ã«é©çšãããã远å ã§ããŸãã
+
+ããã« `dependencies` ã®ãªã¹ãã远å ã§ããŸããããã¯ãã®ã«ãŒã¿ãŒå
ã®ãã¹ãŠã® *path operations* ã«è¿œå ãããããããžã®åãªã¯ãšã¹ãããšã«å®è¡ã»è§£æ±ºãããŸãã
+
+/// tip | è±ç¥è
+
+[*path operation ãã³ã¬ãŒã¿*ã®äŸåé¢ä¿](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} ãšåæ§ã«ã*path operation 颿°*ã«ã¯å€ã¯æž¡ãããªãç¹ã«æ³šæããŠãã ããã
+
+///
+
+æçµçã«ãitem ã®ãã¹ã¯æ¬¡ã®ãšããã«ãªããŸã:
+
+* `/items/`
+* `/items/{item_id}`
+
+...æå³ãããšããã§ãã
+
+* ãããã«ã¯ãæåå `"items"` ã1ã€å«ãã¿ã°ã®ãªã¹ããä»ããŸãã
+ * ãããã®ãã¿ã°ãã¯ãïŒOpenAPI ã䜿ãïŒèªåã€ã³ã¿ã©ã¯ãã£ãããã¥ã¡ã³ãã§ç¹ã«æçšã§ãã
+* ãã¹ãŠã«äºåå®çŸ©ãã `responses` ãå«ãŸããŸãã
+* ããããã¹ãŠã® *path operations* ã§ã¯ãå®è¡åã« `dependencies` ã®ãªã¹ããè©äŸ¡ã»å®è¡ãããŸãã
+ * ç¹å®ã® *path operation* ã«äŸåé¢ä¿ã宣èšããå Žåã¯ã**ããããå®è¡ãããŸã**ã
+ * ã«ãŒã¿ãŒã®äŸåé¢ä¿ãå
ã«å®è¡ããããã®åŸã«[ãã³ã¬ãŒã¿å
ã® `dependencies`](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}ãæ¬¡ã«éåžžã®ãã©ã¡ãŒã¿äŸåé¢ä¿ãç¶ããŸãã
+ * [`scopes` ã䌎ã `Security` äŸåé¢ä¿](../advanced/security/oauth2-scopes.md){.internal-link target=_blank} ã远å ããããšãã§ããŸãã
+
+/// tip | è±ç¥è
+
+`APIRouter` ã« `dependencies` ã眮ãããšã§ã*path operations* ã®ã°ã«ãŒãå
šäœã«èªèšŒãèŠæ±ããããšãã£ãçšéã«äœ¿ããŸããåã
ã® *path operation* ã«äŸåé¢ä¿ã远å ããŠããªããŠãæ§ããŸããã
+
+///
+
+/// check | 確èª
+
+`prefix`ã`tags`ã`responses`ã`dependencies` ã®åãã©ã¡ãŒã¿ã¯ïŒã»ãã®å€ãã®ã±ãŒã¹ãšåæ§ã«ïŒã³ãŒãéè€ãé¿ããããã® **FastAPI** ã®æ©èœã§ãã
+
+///
+
+### äŸåé¢ä¿ãã€ã³ããŒã { #import-the-dependencies }
+
+ãã®ã³ãŒãã¯ã¢ãžã¥ãŒã« `app.routers.items`ïŒãã¡ã€ã« `app/routers/items.py`ïŒå
ã«ãããŸãã
+
+ãããŠäŸåé¢ä¿ã®é¢æ°ã¯ã¢ãžã¥ãŒã« `app.dependencies`ïŒãã¡ã€ã« `app/dependencies.py`ïŒããååŸããå¿
èŠããããŸãã
+
+ããã§ãäŸåé¢ä¿ã«ã¯ `..` ã䜿ã£ãçžå¯Ÿã€ã³ããŒãã䜿ããŸã:
+
+{* ../../docs_src/bigger_applications/app_an_py310/routers/items.py hl[3] title["app/routers/items.py"] *}
+
+#### çžå¯Ÿã€ã³ããŒãã®ä»çµã¿ { #how-relative-imports-work }
+
+/// tip | è±ç¥è
+
+ã€ã³ããŒãã®ä»çµã¿ãååçè§£ããŠããå Žåã¯ã次ã®ç¯ã«é²ãã§ãã ããã
+
+///
+
+ããã1〠`.` ã䜿ããšã次ã®ãããªæå³ã«ãªããŸã:
+
+```Python
+from .dependencies import get_token_header
+```
+
+æå³:
+
+* ãã®ã¢ãžã¥ãŒã«ïŒ`app/routers/items.py`ïŒãååšããåãããã±ãŒãžïŒãã£ã¬ã¯ã㪠`app/routers/`ïŒããéå§ã...
+* ã¢ãžã¥ãŒã« `dependencies`ïŒä»®æ³çã«ã¯ `app/routers/dependencies.py`ïŒãæ¢ã...
+* ãããã颿° `get_token_header` ãã€ã³ããŒãããã
+
+ããããã®ãã¡ã€ã«ã¯ååšãããå®éã®äŸåé¢ä¿ã¯ `app/dependencies.py` ã«ãããŸãã
+
+ã¢ããªïŒãã¡ã€ã«æ§æãã©ããªã£ãŠããããæãåºããŠãã ãã:
+
+<img src="/img/tutorial/bigger-applications/package.drawio.svg">
+
+---
+
+ããã2〠`..` ã䜿ããšã次ã®ããã«ãªããŸã:
+
+```Python
+from ..dependencies import get_token_header
+```
+
+æå³:
+
+* ãã®ã¢ãžã¥ãŒã«ïŒ`app/routers/items.py`ïŒãååšããåãããã±ãŒãžïŒãã£ã¬ã¯ã㪠`app/routers/`ïŒããéå§ã...
+* 芪ããã±ãŒãžïŒãã£ã¬ã¯ã㪠`app/`ïŒã«ç§»åã...
+* ããã§ã¢ãžã¥ãŒã« `dependencies`ïŒãã¡ã€ã« `app/dependencies.py`ïŒãæ¢ã...
+* ãããã颿° `get_token_header` ãã€ã³ããŒãããã
+
+ããã¯æ£ããåäœããŸãïŒ ð
+
+---
+
+åæ§ã«ãããã3〠`...` ã䜿ããš:
+
+```Python
+from ...dependencies import get_token_header
+```
+
+æå³:
+
+* ãã®ã¢ãžã¥ãŒã«ïŒ`app/routers/items.py`ïŒãååšããåãããã±ãŒãžïŒãã£ã¬ã¯ã㪠`app/routers/`ïŒããéå§ã...
+* 芪ããã±ãŒãžïŒãã£ã¬ã¯ã㪠`app/`ïŒã«ç§»åã...
+* ããã«ãã®èŠªããã±ãŒãžã«ç§»åããããšããŸãïŒ`app` ã¯æäžäœãªã®ã§èŠªããã±ãŒãžã¯ãããŸãã ð±ïŒ...
+* ããã§ã¢ãžã¥ãŒã« `dependencies`ïŒãã¡ã€ã« `app/dependencies.py`ïŒãæ¢ã...
+* ãããã颿° `get_token_header` ãã€ã³ããŒãããã
+
+ãã㯠`app/` ããäžäœã®ããã±ãŒãžïŒç¬èªã® `__init__.py` ãæã€ïŒãåç
§ããããšã«ãªããŸããããããã®ãããªãã®ã¯ãããŸããããã®ããããã®äŸã§ã¯ãšã©ãŒã«ãªããŸããðš
+
+ããã§ä»çµã¿ãåãã£ãã®ã§ãã©ãã»ã©è€éã§ãèªåã®ã¢ããªã§çžå¯Ÿã€ã³ããŒãã䜿ããŸããð€
+
+### ã«ã¹ã¿ã ã® `tags`ã`responses`ã`dependencies` ã远å { #add-some-custom-tags-responses-and-dependencies }
+
+`APIRouter` ã«è¿œå æžã¿ãªã®ã§ãå *path operation* ã« `/items` ã® prefix ã `tags=["items"]` ãä»ããŠããŸããã
+
+ããããç¹å®ã® *path operation* ã«é©çšããã _远å ã®_ `tags` ãããã® *path operation* åºæã®è¿œå ã® `responses` ãå ããããšã¯ã§ããŸã:
+
+{* ../../docs_src/bigger_applications/app_an_py310/routers/items.py hl[30:31] title["app/routers/items.py"] *}
+
+/// tip | è±ç¥è
+
+ãã®æåŸã® *path operation* ã¯ã`["items", "custom"]` ã®ã¿ã°ã®çµã¿åãããæã¡ãŸãã
+
+ãŸãããã¥ã¡ã³ãã«ã¯ `404` ãš `403` ã®äž¡æ¹ã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸãã
+
+///
+
+## ã¡ã€ã³ã® `FastAPI` { #the-main-fastapi }
+
+次ã«ã`app/main.py` ã®ã¢ãžã¥ãŒã«ãèŠãŠãããŸãã
+
+ããã§ã¯ã©ã¹ `FastAPI` ãã€ã³ããŒãããŠäœ¿çšããŸãã
+
+ããã¯ãã¹ãŠããŸãšããã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ãã¡ã€ã«ã«ãªããŸãã
+
+ãããŠå€§éšåã®ããžãã¯ã¯ããããã®å°çšã¢ãžã¥ãŒã«ã«çœ®ããããããã¡ã€ã³ãã¡ã€ã«ã¯ããªãã·ã³ãã«ã«ãªããŸãã
+
+### `FastAPI` ã®ã€ã³ããŒã { #import-fastapi }
+
+éåžžã©ãã `FastAPI` ã¯ã©ã¹ãã€ã³ããŒãããŠäœæããŸãã
+
+ããã«ãå `APIRouter` ã®äŸåé¢ä¿ãšçµã¿åãããã[ã°ããŒãã«äŸåé¢ä¿](dependencies/global-dependencies.md){.internal-link target=_blank}ã宣èšã§ããŸã:
+
+{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[1,3,7] title["app/main.py"] *}
+
+### `APIRouter` ã®ã€ã³ããŒã { #import-the-apirouter }
+
+次ã«ã`APIRouter` ãæã€ä»ã®ãµãã¢ãžã¥ãŒã«ãã€ã³ããŒãããŸã:
+
+{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[4:5] title["app/main.py"] *}
+
+`app/routers/users.py` ãš `app/routers/items.py` ã¯åã Python ããã±ãŒãž `app` ã®ãµãã¢ãžã¥ãŒã«ãªã®ã§ã1ã€ã®ããã `.` ã䜿ã£ããçžå¯Ÿã€ã³ããŒããã§ã€ã³ããŒãã§ããŸãã
+
+### ã€ã³ããŒãã®åäœ { #how-the-importing-works }
+
+次ã®éšå:
+
+```Python
+from .routers import items, users
+```
+
+ã¯æ¬¡ã®æå³ã§ã:
+
+* ãã®ã¢ãžã¥ãŒã«ïŒ`app/main.py`ïŒãååšããåãããã±ãŒãžïŒãã£ã¬ã¯ã㪠`app/`ïŒããéå§ã...
+* ãµãããã±ãŒãž `routers`ïŒãã£ã¬ã¯ã㪠`app/routers/`ïŒãæ¢ã...
+* ãããããµãã¢ãžã¥ãŒã« `items`ïŒãã¡ã€ã« `app/routers/items.py`ïŒãš `users`ïŒãã¡ã€ã« `app/routers/users.py`ïŒãã€ã³ããŒããã...
+
+ã¢ãžã¥ãŒã« `items` ã«ã¯å€æ° `router`ïŒ`items.router`ïŒããããŸãããã㯠`app/routers/items.py` ã§äœæãã `APIRouter` ãªããžã§ã¯ããšåããã®ã§ãã
+
+ã¢ãžã¥ãŒã« `users` ã«ã€ããŠãåæ§ã§ãã
+
+次ã®ããã«ã€ã³ããŒãããããšãã§ããŸã:
+
+```Python
+from app.routers import items, users
+```
+
+/// info | æ
å ±
+
+æåã®ããŒãžã§ã³ã¯ãçžå¯Ÿã€ã³ããŒããã§ã:
+
+```Python
+from .routers import items, users
+```
+
+2ã€ç®ã®ããŒãžã§ã³ã¯ã絶察ã€ã³ããŒããã§ã:
+
+```Python
+from app.routers import items, users
+```
+
+Python ã®ããã±ãŒãžãšã¢ãžã¥ãŒã«ã«ã€ããŠè©³ããã¯ã<a href="https://docs.python.org/3/tutorial/modules.html" class="external-link" target="_blank">å
¬åŒã® Python ã¢ãžã¥ãŒã«ã«é¢ããããã¥ã¡ã³ã</a>ãã芧ãã ããã
+
+///
+
+### ååè¡çªã®åé¿ { #avoid-name-collisions }
+
+ãµãã¢ãžã¥ãŒã« `items` ã®å€æ° `router` ã ããã€ã³ããŒãããã®ã§ã¯ãªãããµãã¢ãžã¥ãŒã«èªäœãçŽæ¥ã€ã³ããŒãããŠããŸãã
+
+ããã¯ããµãã¢ãžã¥ãŒã« `users` ã«ã `router` ãšãã倿°ãããããã§ãã
+
+ããæ¬¡ã®ããã«ç¶ããŠã€ã³ããŒãããå Žå:
+
+```Python
+from .routers.items import router
+from .routers.users import router
+```
+
+`users` ã® `router` ã `items` ã®ãã®ãäžæžãããŠããŸããåæã«äž¡æ¹ã䜿ããªããªããŸãã
+
+åããã¡ã€ã«ã§äž¡æ¹ã䜿ããããã«ããããããµãã¢ãžã¥ãŒã«ãçŽæ¥ã€ã³ããŒãããŸã:
+
+{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[5] title["app/main.py"] *}
+
+### `users` ãš `items` ã® `APIRouter` ãåã蟌ã { #include-the-apirouters-for-users-and-items }
+
+ã§ã¯ããµãã¢ãžã¥ãŒã« `users` ãš `items` ãã `router` ãåã蟌ã¿ãŸã:
+
+{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[10:11] title["app/main.py"] *}
+
+/// info | æ
å ±
+
+`users.router` ã¯ããã¡ã€ã« `app/routers/users.py` å
ã® `APIRouter` ãå«ã¿ãŸãã
+
+`items.router` ã¯ããã¡ã€ã« `app/routers/items.py` å
ã® `APIRouter` ãå«ã¿ãŸãã
+
+///
+
+`app.include_router()` ã䜿ã£ãŠãå `APIRouter` ãã¡ã€ã³ã® `FastAPI` ã¢ããªã±ãŒã·ã§ã³ã«è¿œå ã§ããŸãã
+
+ãã®ã«ãŒã¿ãŒã®ãã¹ãŠã®ã«ãŒããã¢ããªã«å«ãŸããŸãã
+
+/// note | æè¡è©³çް
+
+å®éã«ã¯ã`APIRouter` ã§å®£èšãããå *path operation* ããšã«å
éšçã« *path operation* ãäœæãããŸãã
+
+ã€ãŸãè£åŽã§ã¯ããã¹ãŠãåãåäžã®ã¢ããªã§ãããã®ããã«åäœããŸãã
+
+///
+
+/// check | 確èª
+
+ã«ãŒã¿ãŒãåã蟌ãã§ãããã©ãŒãã³ã¹ãå¿é
ããå¿
èŠã¯ãããŸããã
+
+ããã¯èµ·åæã«ãã€ã¯ãç§ã§è¡ãããŸãã
+
+ãããã£ãŠããã©ãŒãã³ã¹ã«ã¯åœ±é¿ããŸãããâ¡
+
+///
+
+### ã«ã¹ã¿ã ã® `prefix`ã`tags`ã`responses`ã`dependencies` ä»ãã§ `APIRouter` ãåã蟌ã { #include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies }
+
+ããªãã®çµç¹ãã `app/internal/admin.py` ãã¡ã€ã«ãæäŸããããšããŸãããã
+
+ããã«ã¯ãçµç¹ãè€æ°ãããžã§ã¯ãã§å
±æããŠãã管ççšã® *path operations* ãæã€ `APIRouter` ãå«ãŸããŠããŸãã
+
+ãã®äŸã§ã¯ãšãŠãã·ã³ãã«ã§ãããçµç¹å
ã®ä»ãããžã§ã¯ããšå
±æããŠããããã`APIRouter` èªäœãçŽæ¥å€æŽã㊠`prefix`ã`dependencies`ã`tags` ãªã©ã远å ã§ããªããšããŸã:
+
+{* ../../docs_src/bigger_applications/app_an_py310/internal/admin.py hl[3] title["app/internal/admin.py"] *}
+
+ããã§ãã`APIRouter` ãåã蟌ãéã«ã«ã¹ã¿ã ã® `prefix` ãèšå®ããŠãã¹ãŠã® *path operations* ã `/admin` ã§å§ããããæ¢åã® `dependencies` ã§ä¿è·ããããããã« `tags` ãš `responses` ãå«ããããšããŸãã
+
+å
ã® `APIRouter` ã倿Žããããšãªãã`app.include_router()` ã«ãããã®ãã©ã¡ãŒã¿ãæž¡ãããšã§å®£èšã§ããŸã:
+
+{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[14:17] title["app/main.py"] *}
+
+ãã®ããã«ãããšãå
ã® `APIRouter` ã¯æªå€æŽã®ãŸãŸãªã®ã§ãåã `app/internal/admin.py` ãã¡ã€ã«ãçµç¹å
ã®ä»ãããžã§ã¯ããšãåŒãç¶ãå
±æã§ããŸãã
+
+çµæãšããŠããã®ã¢ããªå
ã§ã¯ `admin` ã¢ãžã¥ãŒã«ã®å *path operation* ãæ¬¡ã®ããã«ãªããŸã:
+
+* prefix 㯠`/admin`
+* ã¿ã°ã¯ `admin`
+* äŸåé¢ä¿ã¯ `get_token_header`
+* ã¬ã¹ãã³ã¹ã¯ `418` ðµ
+
+ãã ããããã¯ãã®ã¢ããªå
ã®ãã® `APIRouter` ã«ã®ã¿åœ±é¿ããããã䜿çšããä»ã®ã³ãŒãã«ã¯åœ±é¿ããŸããã
+
+äŸãã°ãä»ã®ãããžã§ã¯ãã§ã¯åã `APIRouter` ãå¥ã®èªèšŒæ¹åŒã§äœ¿ãããšãã§ããŸãã
+
+### *path operation* ã远å { #include-a-path-operation }
+
+`FastAPI` ã¢ããªã« *path operations* ãçŽæ¥è¿œå ããããšãã§ããŸãã
+
+ããã§ã¯ïŒã§ããããšã瀺ãããã ãã«ïŒè¿œå ããŸã ð€·:
+
+{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[21:23] title["app/main.py"] *}
+
+ãããŠã`app.include_router()` ã§è¿œå ããã»ãã® *path operations* ãšäžç·ã«æ£ããåäœããŸãã
+
+/// info | éåžžã«æè¡çãªè©³çް
+
+泚èš: ããã¯éåžžã«æè¡çãªè©³çްã§ã**èªã¿é£ã°ããŠæ§ããŸãã**ã
+
+---
+
+`APIRouter` ã¯ãããŠã³ãããããŠããããã¢ããªã±ãŒã·ã§ã³ã®ä»éšåããåé¢ãããŠããŸããã
+
+ããã¯ããããã® *path operations* ã OpenAPI ã¹ããŒãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã«å«ãããããã§ãã
+
+å®å
šã«åé¢ããŠç¬ç«ã«ãããŠã³ããã§ããªãããã*path operations* ã¯çŽæ¥åã蟌ãŸããã®ã§ã¯ãªããã¯ããŒã³ïŒåäœæïŒããããŸãã
+
+///
+
+## èªåAPIããã¥ã¡ã³ãã®ç¢ºèª { #check-the-automatic-api-docs }
+
+ã¢ããªãå®è¡ããŸã:
+
+<div class="termy">
+
+```console
+$ fastapi dev app/main.py
+
+<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+</div>
+
+ãã㊠<a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> ãéããŸãã
+
+ãã¹ãŠã®ãµãã¢ãžã¥ãŒã«ç±æ¥ã®ãã¹ãå«ãèªå API ããã¥ã¡ã³ãã衚瀺ãããæ£ãããã¹ïŒããã³ prefixïŒãšæ£ããã¿ã°ã䜿ãããŠããã®ãåãããŸã:
+
+<img src="/img/tutorial/bigger-applications/image01.png">
+
+## åãã«ãŒã¿ãŒãç°ãªã `prefix` ã§è€æ°ååã蟌ã { #include-the-same-router-multiple-times-with-different-prefix }
+
+åãã«ãŒã¿ãŒã«å¯ŸããŠãç°ãªã prefix ã§ `.include_router()` ãè€æ°å䜿ãããšãã§ããŸãã
+
+äŸãã°ãåã API ã `/api/v1` ãš `/api/latest` ã®ããã«ç°ãªã prefix ã§å
¬éããå Žåã«åœ¹ç«ã¡ãŸãã
+
+é«åºŠãªäœ¿ãæ¹ãªã®ã§äžèŠãããããŸããããå¿
èŠãªå Žåã«åããŠçšæãããŠããŸãã
+
+## `APIRouter` ãå¥ã® `APIRouter` ã«åã蟌ã { #include-an-apirouter-in-another }
+
+`APIRouter` ã `FastAPI` ã¢ããªã±ãŒã·ã§ã³ã«åã蟌ããã®ãšåãããã«ã`APIRouter` ãå¥ã® `APIRouter` ã«åã蟌ãããšãã§ããŸã:
+
+```Python
+router.include_router(other_router)
+```
+
+`router` ã `FastAPI` ã¢ããªã«åã蟌ãåã«ãããå®è¡ããŠã`other_router` ã® *path operations* ãå«ãŸããããã«ããŠãã ããã
q: str | None = None
```
-ãŸãã¯Python 3.10以äžã§ã¯:
-
-```Python
-q: Union[str, None] = None
-```
-
äŸãã°:
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
以äžã®ããã«:
-{* ../../docs_src/body_nested_models/tutorial008_py39.py hl[13] *}
+{* ../../docs_src/body_nested_models/tutorial008_py310.py hl[13] *}
## ããããå Žæã§ã®ãšãã£ã¿ãµããŒã { #editor-support-everywhere }
ãã®å Žåã`int`ã®ããŒãš`float`ã®å€ãæã€ãã®ã§ããã°ãã©ããª`dict`ã§ãåãå
¥ããããšãã§ããŸã:
-{* ../../docs_src/body_nested_models/tutorial009_py39.py hl[7] *}
+{* ../../docs_src/body_nested_models/tutorial009_py310.py hl[7] *}
/// tip | è±ç¥è
ãŸãšãããšãéšåçãªæŽæ°ãé©çšããã«ã¯ã次ã®ããã«ããŸã:
-* (ãªãã·ã§ã³ã§)`PUT`ã®ä»£ããã«`PATCH`ã䜿çšããŸãã
+* (ãªãã·ã§ã³ã§)`PATCH`ã®ä»£ããã«`PUT`ã䜿çšããŸãã
* ä¿åãããŠããããŒã¿ãååŸããŸãã
* ãã®ããŒã¿ãPydanticã¢ãã«ã«ãããŸãã
* å
¥åã¢ãã«ããããã©ã«ãå€ãå«ãŸãªã`dict`ãçæããŸãïŒ`exclude_unset`ã䜿çšããŸãïŒã
* åãåã£ãããŒã¿ããã©ã¡ãŒã¿ `item` ã«æž¡ããŸãã
* 颿°å
ã§ `Item` åãšããŠå®£èšããããããã¹ãŠã®å±æ§ãšãã®åã«ã€ããŠããšãã£ã¿ãµããŒãïŒè£å®ãªã©ïŒãå©çšã§ããŸãã
* ã¢ãã«åãã® <a href="https://json-schema.org" class="external-link" target="_blank">JSON Schema</a> å®çŸ©ãçæããŸãããããžã§ã¯ãã«ãšã£ãŠæå³ããããªããä»ã®å Žæã§ã奜ããªããã«å©çšã§ããŸãã
-* ãããã®ã¹ããŒãã¯çæãããOpenAPIã¹ããŒãã®äžéšãšãªããèªåããã¥ã¡ã³ãã® <abbr title="User Interfaces">UIs</abbr> ã§äœ¿çšãããŸãã
+* ãããã®ã¹ããŒãã¯çæãããOpenAPIã¹ããŒãã®äžéšãšãªããèªåããã¥ã¡ã³ãã® <abbr title="User Interfaces - ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹">UIs</abbr> ã§äœ¿çšãããŸãã
## èªåããã¥ã¡ã³ã { #automatic-docs }
FastAPIã¯ãããã©ã«ãå€ `= None` ãããããã`q` ã®å€ãå¿
é ã§ã¯ãªãããšãèªèããŸãã
-`str | None`ïŒPython 3.10+ïŒã `Union[str, None]`ïŒPython 3.9+ïŒã® `Union` ã¯ãå€ãå¿
é ã§ã¯ãªãããšã倿ããããã«FastAPIã§ã¯äœ¿çšãããŸããã`= None` ãšããããã©ã«ãå€ããããããå¿
é ã§ã¯ãªãããšãèªèããŸãã
+`str | None` ã¯ãå€ãå¿
é ã§ã¯ãªãããšã倿ããããã«FastAPIã§ã¯äœ¿çšãããŸããã`= None` ãšããããã©ã«ãå€ããããããå¿
é ã§ã¯ãªãããšãèªèããŸãã
ããããåã¢ãããŒã·ã§ã³ã远å ãããšããšãã£ã¿ãããè¯ããµããŒããæäŸãããšã©ãŒãæ€åºã§ããããã«ãªããŸãã
ç¹å®ã®ïŒããŸãäžè¬çã§ã¯ãªããããããªãïŒã±ãŒã¹ã§ãåãä»ããã¯ãããŒã**å¶é**ããå¿
èŠããããããããŸããã
-ããªãã®APIã¯ç¬èªã® <abbr title="念ã®ããã§ãããããã¯ãžã§ãŒã¯ã§ããã¯ãããŒåæãšã¯é¢ä¿ãããŸããããAPIã§ããäžé©åãªã¯ãããŒãæåŠã§ãããšã¯æå¿«ã§ãããã¯ãããŒã§ãé£ã¹ãŠãã ãããðª ïŒåæ: This is a joke, just in case. It has nothing to do with cookie consents, but it's funny that even the API can now reject the poor cookies. Have a cookie. ðªïŒ">ã¯ãããŒåæ</abbr> ã管çããèœåãæã£ãŠããŸãã ð€ªðª
+ããªãã®APIã¯ç¬èªã® <dfn title="念ã®ããã§ãããããã¯ãžã§ãŒã¯ã§ããã¯ãããŒåæãšã¯é¢ä¿ãããŸããããAPIã§ããä»ãããããããªã¯ãããŒãæåŠã§ããã®ã¯é¢çœãã§ãããã¯ãããŒã§ãã©ãããðª">ã¯ãããŒåæ</dfn> ã管çããèœåãæã£ãŠããŸãã ð€ªðª
Pydanticã®ã¢ãã«ã® Configuration ãå©çšããŠã `extra` ãã£ãŒã«ãã `forbid` ãšããããšãã§ããŸãã
ããã¯ã©ã€ã¢ã³ãã**äœåãªã¯ãããŒ**ãéãããšãããšã**ãšã©ãŒ**ã¬ã¹ãã³ã¹ãè¿ãããŸãã
-<abbr title="ããããžã§ãŒã¯ã§ããæ°ã«ããªãã§ãã ãããã¯ãããŒã®ãäŸã«ã³ãŒããŒã§ã飲ãã§ãã ãããâ ïŒåæ: This is another joke. Don't pay attention to me. Have some coffee for your cookie. âïŒ">ã©ããAPIã«æåŠãããã®ã«</abbr>ããªãã®åæãåŸãããšç²Ÿäžæ¯åªåããå¯åæ³ãªã¯ãããŒãããŒãã¡... ðª
+<dfn title="ããããžã§ãŒã¯ã§ããæ°ã«ããªãã§ãã ãããã¯ãããŒã®ãäŸã«ã³ãŒããŒã§ãã©ãããâ">ã©ããAPIã«æåŠãããã®ã«</dfn>ããªãã®åæãåŸãããšç²Ÿäžæ¯åªåããå¯åæ³ãªã¯ãããŒãããŒãã¡... ðª
-äŸãã°ãã¯ã©ã€ã¢ã³ããã¯ãã㌠`santa_tracker` ã `good-list-please` ãšããå€ã§éãããšãããšã`santa_tracker` ãšãã <abbr title="ãµã³ã¿ã¯ã¯ãããŒäžè¶³ãè¯ããšã¯ããªãã§ããããð
ã¯ããã¯ãããŒãžã§ãŒã¯ã¯ããæ¢ããŠãããŸããïŒåæ: Santa disapproves the lack of cookies. ð
Okay, no more cookie jokes.ïŒ">ã¯ãããŒãèš±å¯ãããŠããªã</abbr> ããšãéç¥ãã**ãšã©ãŒ**ã¬ã¹ãã³ã¹ãè¿ãããŸã:
+äŸãã°ãã¯ã©ã€ã¢ã³ããã¯ãã㌠`santa_tracker` ã `good-list-please` ãšããå€ã§éãããšãããšã`santa_tracker` ãšãã <dfn title="ãµã³ã¿ã¯ã¯ãããŒäžè¶³ãè¯ããšããŸãããð
ã¯ããã¯ãããŒãžã§ãŒã¯ã¯ããã§ãããŸãã">ã¯ãããŒãèš±å¯ãããŠããªã</dfn> ããšãéç¥ãã**ãšã©ãŒ**ã¬ã¹ãã³ã¹ãè¿ãããŸã:
```json
{
## ãŸãšã { #summary }
-**FastAPI**ã§ã¯ã<abbr title="åž°ã£ãŠããŸãåã«æåŸã®ã¯ãããŒãã©ãããðª ïŒåæ: Have a last cookie before you go. ðªïŒ">**ã¯ãããŒ**</abbr>ã宣èšããããã«ã**Pydanticã¢ãã«**ã䜿çšã§ããŸããð
+**FastAPI**ã§ã¯ã<dfn title="åž°ãåã«æåŸã®ã¯ãããŒãã©ãããðª">**ã¯ãããŒ**</dfn>ã宣èšããããã«ã**Pydanticã¢ãã«**ã䜿çšã§ããŸããð
* ç¹å®ã®HTTPã¡ãœãã (`POST`ã`PUT`) ãŸãã¯ã¯ã€ã«ãã«ãŒã `"*"` ã䜿çšããŠãã¹ãŠèš±å¯ã
* ç¹å®ã®HTTPããããŒããŸãã¯ã¯ã€ã«ãã«ãŒã `"*"`ã䜿çšããŠãã¹ãŠèš±å¯ã
-{* ../../docs_src/cors/tutorial001_py39.py hl[2,6:11,13:19] *}
+{* ../../docs_src/cors/tutorial001_py310.py hl[2,6:11,13:19] *}
`CORSMiddleware` å®è£
ã§äœ¿çšãããããã©ã«ãã®ãã©ã¡ãŒã¿ã¯ããã©ã«ãã§å¶éãå³ããããããã©ãŠã¶ãã¯ãã¹ãã¡ã€ã³ã®ã³ã³ããã¹ãã§ãããã䜿çšã§ããããã«ããã«ã¯ãç¹å®ã®ãªãªãžã³ãã¡ãœããããŸãã¯ããããŒãæç€ºçã«æå¹ã«ããå¿
èŠããããŸãã
FastAPIã¢ããªã±ãŒã·ã§ã³äžã§ã`uvicorn` ãçŽæ¥ã€ã³ããŒãããŠå®è¡ããŸã:
-{* ../../docs_src/debugging/tutorial001_py39.py hl[1,15] *}
+{* ../../docs_src/debugging/tutorial001_py310.py hl[1,15] *}
### `__name__ == "__main__"` ã«ã€ã㊠{ #about-name-main }
äžã®ã³ãŒãã§ã¯`CommonQueryParams`ãïŒåæžããŠããããšã«æ³šç®ããŠãã ãã:
-//// tab | Python 3.9+
+//// tab | Python 3.10+
```Python
commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)]
////
-//// tab | Python 3.9+ 泚éãªã
+//// tab | Python 3.10+ 泚éãªã
/// tip | è±ç¥è
ãã®å Žåã以äžã«ããæåã®`CommonQueryParams`:
-//// tab | Python 3.9+
+//// tab | Python 3.10+
```Python
commons: Annotated[CommonQueryParams, ...
////
-//// tab | Python 3.9+ 泚éãªã
+//// tab | Python 3.10+ 泚éãªã
/// tip | è±ç¥è
å®éã«ã¯ä»¥äžã®ããã«æžãã°ããã ãã§ã:
-//// tab | Python 3.9+
+//// tab | Python 3.10+
```Python
commons: Annotated[Any, Depends(CommonQueryParams)]
////
-//// tab | Python 3.9+ 泚éãªã
+//// tab | Python 3.10+ 泚éãªã
/// tip | è±ç¥è
ããããããã§ã¯`CommonQueryParams`ãïŒåæžããšããã³ãŒãã®ç¹°ãè¿ããçºçããŠããããšãããããŸã:
-//// tab | Python 3.9+
+//// tab | Python 3.10+
```Python
commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)]
////
-//// tab | Python 3.9+ 泚éãªã
+//// tab | Python 3.10+ 泚éãªã
/// tip | è±ç¥è
以äžã®ããã«æžã代ããã«:
-//// tab | Python 3.9+
+//// tab | Python 3.10+
```Python
commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)]
////
-//// tab | Python 3.9+ 泚éãªã
+//// tab | Python 3.10+ 泚éãªã
/// tip | è±ç¥è
...以äžã®ããã«æžããŸã:
-//// tab | Python 3.9+
+//// tab | Python 3.10+
```Python
commons: Annotated[CommonQueryParams, Depends()]
////
-//// tab | Python 3.9+ 泚éãªã
+//// tab | Python 3.10+ 泚éãªã
/// tip | è±ç¥è
ããã¯`Depends()`ã®`list`ã§ããã¹ãã§ã:
-{* ../../docs_src/dependencies/tutorial006_an_py39.py hl[19] *}
+{* ../../docs_src/dependencies/tutorial006_an_py310.py hl[19] *}
ãããã®äŸåé¢ä¿ã¯ãéåžžã®äŸåé¢ä¿ãšåæ§ã«å®è¡ã»è§£æ±ºãããŸãããããããããã®å€ïŒäœããè¿ãå ŽåïŒã¯*path operation 颿°*ã«ã¯æž¡ãããŸããã
ãããã¯ãªã¯ãšã¹ãã®èŠä»¶ïŒããããŒã®ãããªãã®ïŒããã®ä»ã®ãµãäŸåé¢ä¿ã宣èšã§ããŸã:
-{* ../../docs_src/dependencies/tutorial006_an_py39.py hl[8,13] *}
+{* ../../docs_src/dependencies/tutorial006_an_py310.py hl[8,13] *}
### äŸå€ã®çºç { #raise-exceptions }
ãããã®äŸåé¢ä¿ã¯ãéåžžã®äŸåé¢ä¿ãšåãããã«äŸå€ã`raise`ã§ããŸã:
-{* ../../docs_src/dependencies/tutorial006_an_py39.py hl[10,15] *}
+{* ../../docs_src/dependencies/tutorial006_an_py310.py hl[10,15] *}
### æ»ãå€ { #return-values }
ã€ãŸãããã§ã«ã©ããã§äœ¿ã£ãŠããéåžžã®äŸåé¢ä¿ïŒå€ãè¿ããã®ïŒãåå©çšã§ããå€ã¯äœ¿ãããªããŠãäŸåé¢ä¿ã¯å®è¡ãããŸã:
-{* ../../docs_src/dependencies/tutorial006_an_py39.py hl[11,16] *}
+{* ../../docs_src/dependencies/tutorial006_an_py310.py hl[11,16] *}
## *path operation*ã®ã°ã«ãŒãã«å¯ŸããäŸåé¢ä¿ { #dependencies-for-a-group-of-path-operations }
# `yield`ãæã€äŸåé¢ä¿ { #dependencies-with-yield }
-FastAPIã¯ãããã€ãã®<abbr title='sometimes also called "exit code", "cleanup code", "teardown code", "closing code", "context manager exit code", etc. â ãexit codeããcleanup codeããteardown codeããclosing codeããcontext manager exit codeããªã©ãšåŒã°ããããšããããŸãã'>çµäºåŸã®è¿œå ã®ã¹ããã</abbr>ãè¡ãäŸåé¢ä¿ããµããŒãããŠããŸãã
+FastAPIã¯ãããã€ãã®<dfn title="ãçµäºã³ãŒãããã¯ãªãŒã³ã¢ããã³ãŒããããã£ã¢ããŠã³ã³ãŒãããã¯ããŒãºã³ãŒãããã³ã³ããã¹ããããŒãžã£ã®çµäºã³ãŒãããªã©ãšåŒã°ããããšããããŸã">çµäºåŸã®è¿œå ã®ã¹ããã</dfn>ãè¡ãäŸåé¢ä¿ããµããŒãããŠããŸãã
ãããè¡ãã«ã¯ã`return`ã®ä»£ããã«`yield`ã䜿ãããã®åŸã«è¿œå ã®ã¹ãããïŒã³ãŒãïŒãæžããŸãã
ã¬ã¹ãã³ã¹ãäœæããåã«ã`yield`æããåã®ã³ãŒãïŒããã³`yield`æãå«ãïŒãå®è¡ãããŸã:
-{* ../../docs_src/dependencies/tutorial007_py39.py hl[2:4] *}
+{* ../../docs_src/dependencies/tutorial007_py310.py hl[2:4] *}
çæãããå€ã¯ã*path operations*ãä»ã®äŸåé¢ä¿ã«æ³šå
¥ããããã®ã§ã:
-{* ../../docs_src/dependencies/tutorial007_py39.py hl[4] *}
+{* ../../docs_src/dependencies/tutorial007_py310.py hl[4] *}
`yield`æã«ç¶ãã³ãŒãã¯ãã¬ã¹ãã³ã¹ã®åŸã«å®è¡ãããŸã:
-{* ../../docs_src/dependencies/tutorial007_py39.py hl[5:6] *}
+{* ../../docs_src/dependencies/tutorial007_py310.py hl[5:6] *}
/// tip | è±ç¥è
åæ§ã«ã`finally`ãçšããŠäŸå€ããã£ããã©ããã«ããããããçµäºã¹ãããã確å®ã«å®è¡ããããšãã§ããŸãã
-{* ../../docs_src/dependencies/tutorial007_py39.py hl[3,5] *}
+{* ../../docs_src/dependencies/tutorial007_py310.py hl[3,5] *}
## `yield`ãæã€ãµãäŸåé¢ä¿ { #sub-dependencies-with-yield }
äŸãã°ã`dependency_c`ã¯`dependency_b`ã«ããããŠ`dependency_b`ã¯`dependency_a`ã«äŸåããããšãã§ããŸã:
-{* ../../docs_src/dependencies/tutorial008_an_py39.py hl[6,14,22] *}
+{* ../../docs_src/dependencies/tutorial008_an_py310.py hl[6,14,22] *}
ãããŠããããã¯ãã¹ãŠ`yield`ã䜿çšããããšãã§ããŸãã
ãããŠã`dependency_b`ã¯`dependency_a`ïŒããã§ã¯`dep_a`ãšããååïŒã®å€ãçµäºã³ãŒãã§å©çšã§ããããã«ããå¿
èŠããããŸãã
-{* ../../docs_src/dependencies/tutorial008_an_py39.py hl[18:19,26:27] *}
+{* ../../docs_src/dependencies/tutorial008_an_py310.py hl[18:19,26:27] *}
åæ§ã«ã`yield`ãæã€äŸåé¢ä¿ãš`return`ãæã€ä»ã®äŸåé¢ä¿ãããã€ãæã¡ããããã®äžéšãä»ã®äžéšã«äŸåããããã«ãã§ããŸãã
///
-{* ../../docs_src/dependencies/tutorial008b_an_py39.py hl[18:22,31] *}
+{* ../../docs_src/dependencies/tutorial008b_an_py310.py hl[18:22,31] *}
äŸå€ããã£ããããŠãããã«åºã¥ããŠã«ã¹ã¿ã ã¬ã¹ãã³ã¹ãäœæãããå Žåã¯ã[ã«ã¹ã¿ã äŸå€ãã³ãã©](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}ãäœæããŠãã ããã
`yield`ãæã€äŸåé¢ä¿ã§`except`ã䜿ã£ãŠäŸå€ããã£ãããããããå床raiseããªãïŒãŸãã¯æ°ããäŸå€ãraiseããªãïŒå Žåãéåžžã®Pythonãšåãããã«ãFastAPIã¯äŸå€ããã£ãããšã«æ°ã¥ããŸãã:
-{* ../../docs_src/dependencies/tutorial008c_an_py39.py hl[15:16] *}
+{* ../../docs_src/dependencies/tutorial008c_an_py310.py hl[15:16] *}
ãã®å ŽåãïŒ`HTTPException`ãããã«é¡ãããã®ãraiseããŠããªãããïŒã¯ã©ã€ã¢ã³ãã«ã¯é©åã«*HTTP 500 Internal Server Error*ã¬ã¹ãã³ã¹ãè¿ããŸããããµãŒããŒã«ã¯**ãã°ãäžåæ®ãã**ãäœããšã©ãŒã ã£ãã®ãã瀺ãä»ã®æãããããããŸããã ð±
`raise`ã䜿ããšåãäŸå€ãåraiseã§ããŸã:
-{* ../../docs_src/dependencies/tutorial008d_an_py39.py hl[17] *}
+{* ../../docs_src/dependencies/tutorial008d_an_py310.py hl[17] *}
ããã§ã¯ã©ã€ã¢ã³ãã¯åã*HTTP 500 Internal Server Error*ã¬ã¹ãã³ã¹ãåãåããŸããããµãŒããŒã®ãã°ã«ã¯ã«ã¹ã¿ã ã®`InternalError`ãæ®ããŸãã ð
ãããã*path operation 颿°*ããreturnããåŸã«äŸåé¢ä¿ã䜿ãå¿
èŠããªããšåãã£ãŠããå Žåã¯ã`Depends(scope="function")`ã䜿ã£ãŠã**ã¬ã¹ãã³ã¹ãéä¿¡ãããå**ã«ã*path operation 颿°*ã®returnåŸã«äŸåé¢ä¿ãéããã¹ãã ãšFastAPIã«äŒããããŸãã
-{* ../../docs_src/dependencies/tutorial008e_an_py39.py hl[12,16] *}
+{* ../../docs_src/dependencies/tutorial008e_an_py310.py hl[12,16] *}
`Depends()`ã¯ã以äžã®ãããããåã`scope`ãã©ã¡ãŒã¿ãåãåããŸã:
ãŸããäŸå颿°ã®äžã§`with`ã`async with`æã䜿çšããããšã«ãã£ãŠ`yield`ãæã€ **FastAPI** ã®äŸåé¢ä¿ã®äžã§ãããã䜿çšããããšãã§ããŸã:
-{* ../../docs_src/dependencies/tutorial010_py39.py hl[1:9,13] *}
+{* ../../docs_src/dependencies/tutorial010_py310.py hl[1:9,13] *}
/// tip | è±ç¥è
--- /dev/null
+# ã°ããŒãã«ãªäŸåé¢ä¿ { #global-dependencies }
+
+ã¢ããªã±ãŒã·ã§ã³ã®çš®é¡ã«ãã£ãŠã¯ãã¢ããªå
šäœã«äŸåé¢ä¿ã远å ãããå ŽåããããŸãã
+
+[`dependencies` ã path operation ã®ãã³ã¬ãŒã¿ã«è¿œå ](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}ã§ããã®ãšåæ§ã«ã`FastAPI` ã¢ããªã±ãŒã·ã§ã³èªäœã«ã远å ã§ããŸãã
+
+ãã®å Žåãã¢ããªã±ãŒã·ã§ã³å
ã®ãã¹ãŠã® path operation ã«é©çšãããŸã:
+
+{* ../../docs_src/dependencies/tutorial012_an_py310.py hl[17] *}
+
+ãŸãã[`dependencies` ã path operation ã®ãã³ã¬ãŒã¿ã«è¿œå ](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}ããç¯ã§èª¬æããèãæ¹ã¯ãã¹ãŠåŒãç¶ãåœãŠã¯ãŸããŸããããã®å Žåã¯ã¢ããªå
ã®ãã¹ãŠã® path operation ã«å¯ŸããŠé©çšãããŸãã
+
+## path operation ã®ã°ã«ãŒãã«å¯ŸããäŸåé¢ä¿ { #dependencies-for-groups-of-path-operations }
+
+åŸã§ãè€æ°ãã¡ã€ã«ãå«ãå€§èŠæš¡ã¢ããªã±ãŒã·ã§ã³ã®æ§ææ¹æ³ïŒ[å€§èŠæš¡ã¢ããªã±ãŒã·ã§ã³ - è€æ°ãã¡ã€ã«](../../tutorial/bigger-applications.md){.internal-link target=_blank}ïŒãèªããšãpath operation ã®ã°ã«ãŒãã«å¯Ÿã㊠1 ã€ã® `dependencies` ãã©ã¡ãŒã¿ã宣èšããæ¹æ³ãåŠã³ãŸãã
# äŸåé¢ä¿ { #dependencies }
-**FastAPI** ã¯éåžžã«åŒ·åã§ãããªããçŽæç㪠**<abbr title="also known as components, resources, providers, services, injectables">Dependency Injection</abbr>** ã·ã¹ãã ãæã£ãŠããŸãã
+**FastAPI** ã¯éåžžã«åŒ·åã§ãããªããçŽæç㪠**<dfn title="å¥å: ã³ã³ããŒãã³ãããªãœãŒã¹ããããã€ãããµãŒãã¹ãã€ã³ãžã§ã¯ã¿ãã«">äŸåæ§æ³šå
¥</dfn>** ã·ã¹ãã ãæã£ãŠããŸãã
ããã¯éåžžã«ã·ã³ãã«ã«äœ¿çšã§ããããã«èšèšãããŠãããéçºè
ãä»ã®ã³ã³ããŒãã³ã **FastAPI** ãšçµ±åããã®ãéåžžã«ç°¡åã«ãªãããã«èšèšãããŠããŸãã
äŸåé¢ä¿ã®1ã€ãåã*path operation*ã«å¯ŸããŠè€æ°å宣èšãããŠããå ŽåãäŸãã°ãè€æ°ã®äŸåé¢ä¿ãå
±éã®ãµãäŸåé¢ä¿ãæã£ãŠããå Žåã**FastAPI** ã¯ãªã¯ãšã¹ãããšã«1åã ããã®ãµãäŸåé¢ä¿ãåŒã³åºããŸãã
-ãããŠãè¿ãããå€ã<abbr title="A utility/system to store computed/generated values, to reuse them instead of computing them again. â èšç®/çæãããå€ãä¿åããåèšç®ãã代ããã«åå©çšããããã®ãŠãŒãã£ãªãã£/ã·ã¹ãã ã">ããã£ãã·ã¥ã</abbr>ã«ä¿åããåããªã¯ãšã¹ãã«å¯ŸããŠäŸåé¢ä¿ãäœåºŠãåŒã³åºã代ããã«ããã®ç¹å®ã®ãªã¯ãšã¹ãã§ãããå¿
èŠãšããå
šãŠã®ãäŸåãã«æž¡ãããšã«ãªããŸãã
+ãããŠãè¿ãããå€ã<dfn title="èšç®/çæãããå€ãä¿åããåèšç®ãã代ããã«åå©çšããããã®ãŠãŒãã£ãªãã£/ã·ã¹ãã ">ããã£ãã·ã¥ã</dfn>ã«ä¿åããåããªã¯ãšã¹ãã«å¯ŸããŠäŸåé¢ä¿ãäœåºŠãåŒã³åºã代ããã«ããã®ç¹å®ã®ãªã¯ãšã¹ãã§ãããå¿
èŠãšããå
šãŠã®ãäŸåãã«æž¡ãããšã«ãªããŸãã
é«åºŠãªã·ããªãªã§ã¯ãããã£ãã·ã¥ããããå€ã䜿ãã®ã§ã¯ãªããåããªã¯ãšã¹ãã®åã¹ãããïŒããããè€æ°åïŒã§äŸåé¢ä¿ãåŒã³åºãå¿
èŠãããããšãããã£ãŠããå Žåã`Depends`ã䜿çšããéã«ã`use_cache=False`ãšãããã©ã¡ãŒã¿ãèšå®ããããšãã§ããŸã:
-//// tab | Python 3.9+
+//// tab | Python 3.10+
```Python hl_lines="1"
async def needy_dependency(fresh_value: Annotated[str, Depends(get_value, use_cache=False)]):
////
-//// tab | Python 3.9+ éAnnotated
+//// tab | Python 3.10+ éAnnotated
/// tip | è±ç¥è
-# Extra Models { #extra-models }
+# 远å ã®ã¢ãã« { #extra-models }
å
ã»ã©ã®äŸã«ç¶ããè€æ°ã®é¢é£ã¢ãã«ãæã€ããšã¯äžè¬çã§ãã
* **åºåã¢ãã«**ã¯ãã¹ã¯ãŒãããã€ã¹ãã§ã¯ãããŸããã
* **ããŒã¿ããŒã¹ã¢ãã«**ã¯ããããããã·ã¥åããããã¹ã¯ãŒããå¿
èŠã«ãªãã§ãããã
-/// danger
+/// danger | èŠå
ãŠãŒã¶ãŒã®å¹³æã®ãã¹ã¯ãŒãã¯çµ¶å¯Ÿã«ä¿åããªãã§ãã ãããåžžã«æ€èšŒã§ãããå®å
šãªããã·ã¥ããä¿åããŠãã ããã
///
-## Multiple models { #multiple-models }
+## è€æ°ã®ã¢ãã« { #multiple-models }
ããã§ã¯ããã¹ã¯ãŒããã£ãŒã«ãããã€ã¢ãã«ãã©ã®ããã«èŠããã®ãããŸããã©ãã§äœ¿ãããã®ãã倧ãŸããªã€ã¡ãŒãžã玹ä»ããŸã:
{* ../../docs_src/extra_models/tutorial001_py310.py hl[7,9,14,20,22,27:28,31:33,38:39] *}
-### About `**user_in.model_dump()` { #about-user-in-model-dump }
+### `**user_in.model_dump()` ã«ã€ã㊠{ #about-user-in-model-dump }
#### Pydanticã®`.model_dump()` { #pydantics-model-dump }
)
```
-/// warning
+/// warning | 泚æ
远å ã®ãµããŒã颿°`fake_password_hasher`ãš`fake_save_user`ã¯ãããŒã¿ã®å¯èœãªæµãããã¢ããã ãã§ããããã¡ããæ¬åœã®ã»ãã¥ãªãã£ãæäŸããŠããããã§ã¯ãããŸããã
///
-## Reduce duplication { #reduce-duplication }
+## éè€ã®åæž { #reduce-duplication }
ã³ãŒãã®éè€ãæžããããšã¯ã**FastAPI**ã®äžæ žçãªã¢ã€ãã¢ã®ïŒã€ã§ãã
{* ../../docs_src/extra_models/tutorial002_py310.py hl[7,13:14,17:18,21:22] *}
-## `Union` or `anyOf` { #union-or-anyof }
+## `Union` ãŸã㯠`anyOf` { #union-or-anyof }
ã¬ã¹ãã³ã¹ã2ã€ä»¥äžã®åã®`Union`ãšããŠå®£èšã§ããŸããã€ãŸãããã®ã¬ã¹ãã³ã¹ã¯ãããã®ããããã«ãªããŸãã
ããããããã代å
¥ã§`response_model=PlaneItem | CarItem`ã®ããã«æžããšãPythonã¯ãããåã¢ãããŒã·ã§ã³ãšããŠè§£éããã®ã§ã¯ãªãã`PlaneItem`ãš`CarItem`ã®éã§**ç¡å¹ãªæäœ**ãè¡ãããšããŠããŸãããããšã©ãŒã«ãªããŸãã
-## List of models { #list-of-models }
+## ã¢ãã«ã®ãªã¹ã { #list-of-models }
åãããã«ããªããžã§ã¯ãã®ãªã¹ãã®ã¬ã¹ãã³ã¹ã宣èšã§ããŸãã
-ãã®ããã«ã¯ãæšæºã®Pythonã®`typing.List`ïŒãŸãã¯Python 3.9以éã§ã¯åã«`list`ïŒã䜿çšããŸã:
+ãã®ããã«ã¯ãæšæºã®Pythonã®`list`ã䜿çšããŸã:
-{* ../../docs_src/extra_models/tutorial004_py39.py hl[18] *}
+{* ../../docs_src/extra_models/tutorial004_py310.py hl[18] *}
-## Response with arbitrary `dict` { #response-with-arbitrary-dict }
+## ä»»æã®`dict`ã«ããã¬ã¹ãã³ã¹ { #response-with-arbitrary-dict }
ãŸããPydanticã¢ãã«ã䜿çšããã«ãããŒãšå€ã®åã ããå®çŸ©ããä»»æã®`dict`ã䜿ã£ãŠã¬ã¹ãã³ã¹ã宣èšããããšãã§ããŸãã
ããã¯ãæå¹ãªãã£ãŒã«ãã»å±æ§åïŒPydanticã¢ãã«ã«å¿
èŠãªãã®ïŒãäºåã«ç¥ããªãå Žåã«äŸ¿å©ã§ãã
-ãã®å Žåã`typing.Dict`ïŒãŸãã¯Python 3.9以éã§ã¯åã«`dict`ïŒã䜿çšã§ããŸã:
+ãã®å Žåã`dict`ã䜿çšã§ããŸã:
-{* ../../docs_src/extra_models/tutorial005_py39.py hl[6] *}
+{* ../../docs_src/extra_models/tutorial005_py310.py hl[6] *}
-## Recap { #recap }
+## ãŸãšã { #recap }
è€æ°ã®Pydanticã¢ãã«ã䜿çšããã±ãŒã¹ããšã«èªç±ã«ç¶æ¿ããŸãã
æãã·ã³ãã«ãªFastAPIãã¡ã€ã«ã¯ä»¥äžã®ããã«ãªããŸã:
-{* ../../docs_src/first_steps/tutorial001_py39.py *}
+{* ../../docs_src/first_steps/tutorial001_py310.py *}
ããã`main.py`ã«ã³ããŒããŸãã
#### OpenAPIããã³JSONã¹ããŒã { #openapi-and-json-schema }
-OpenAPIã\81¯APIã\81®ã\81\9fã\82\81ã\81®APIã\82¹ã\82Âã\83΋\83\9eã\82\92å®\9a矩ã\81\97ã\81Ÿã\81\99ã\80\82ã\81\9dã\81\97ã\81Šã\80\81ã\81\9dã\81®ã\82¹ã\82Âã\83΋\83\9eã\81¯**JSONã\83\87ã\83΋\82¿ã\82¹ã\82Âã\83΋\83\9e**ã\81®Êš\99ʺ\96ڊ\8fÊ Œã\81«Êº\96Ê\8b ã\81\97ã\81\9fJSONã\82¹ã\82Âã\83΋\83\9eãå©çšããAPIã«ãã£ãŠéåãããããŒã¿ã®å®çŸ©ïŒãŸãã¯ãã¹ããŒããïŒãå«ãã§ããŸãã
+OpenAPIã\81¯APIã\81®ã\81\9fã\82\81ã\81®APIã\82¹ã\82Âã\83΋\83\9eã\82\92å®\9a矩ã\81\97ã\81Ÿã\81\99ã\80\82ã\81\9dã\81\97ã\81Šã\80\81ã\81\9dã\81®ã\82¹ã\82Âã\83΋\83\9eã\81¯**JSONã\83\87ã\83΋\82¿ã\82¹ã\82Âã\83΋\83\9e**ã\81®Êš\99ʺ\96ڊ\8fÊ Œã\81§ã\81\82ã\82\8b**JSON Schema**ãå©çšããAPIã«ãã£ãŠéåãããããŒã¿ã®å®çŸ©ïŒãŸãã¯ãã¹ããŒããïŒãå«ãã§ããŸãã
#### `openapi.json`ãç¢ºèª { #check-the-openapi-json }
### Step 1: `FastAPI`ãã€ã³ããŒã { #step-1-import-fastapi }
-{* ../../docs_src/first_steps/tutorial001_py39.py hl[1] *}
+{* ../../docs_src/first_steps/tutorial001_py310.py hl[1] *}
`FastAPI`ã¯ãAPIã®ãã¹ãŠã®æ©èœãæäŸããPythonã¯ã©ã¹ã§ãã
### Step 2: `FastAPI`ã®ãã€ã³ã¹ã¿ã³ã¹ããçæ { #step-2-create-a-fastapi-instance }
-{* ../../docs_src/first_steps/tutorial001_py39.py hl[3] *}
+{* ../../docs_src/first_steps/tutorial001_py310.py hl[3] *}
ããã§ã`app`倿°ã`FastAPI`ã¯ã©ã¹ã®ãã€ã³ã¹ã¿ã³ã¹ãã«ãªããŸãã
ãããããã¹ãŠã®APIãäœæããããã®äž»èŠãªãã€ã³ãã«ãªããŸãã
#### *path operation ãã³ã¬ãŒã¿*ãå®çŸ© { #define-a-path-operation-decorator }
-{* ../../docs_src/first_steps/tutorial001_py39.py hl[6] *}
+{* ../../docs_src/first_steps/tutorial001_py310.py hl[6] *}
`@app.get("/")`ã¯çŽäžã®é¢æ°ãäžèšã®ãªã¯ãšã¹ãã®åŠçãæ
åœããããšã**FastAPI**ã«äŒããŸã:
* ãã¹ `/`
-* <abbr title="an HTTP GET method"><code>get</code> ãªãã¬ãŒã·ã§ã³</abbr>
+* <dfn title="HTTP GET ã¡ãœãã"><code>get</code> ãªãã¬ãŒã·ã§ã³</dfn>
/// info | `@decorator` Info
* **ãªãã¬ãŒã·ã§ã³**: ã¯`get`ã§ãã
* **颿°**: ããã³ã¬ãŒã¿ãã®çŽäžã«ãã颿° (`@app.get("/")`ã®çŽäž) ã§ãã
-{* ../../docs_src/first_steps/tutorial001_py39.py hl[7] *}
+{* ../../docs_src/first_steps/tutorial001_py310.py hl[7] *}
ããã¯ãPythonã®é¢æ°ã§ãã
`async def`ã®ä»£ããã«éåžžã®é¢æ°ãšããŠå®çŸ©ããããšãã§ããŸã:
-{* ../../docs_src/first_steps/tutorial003_py39.py hl[7] *}
+{* ../../docs_src/first_steps/tutorial003_py310.py hl[7] *}
/// note | åè
### Step 5: ã³ã³ãã³ãã®è¿ä¿¡ { #step-5-return-the-content }
-{* ../../docs_src/first_steps/tutorial001_py39.py hl[8] *}
+{* ../../docs_src/first_steps/tutorial001_py310.py hl[8] *}
`dict`ã`list`ã`str`ã`int`ãªã©ã®åäžã®å€ãè¿ãããšãã§ããŸãã
### `HTTPException`ã®ã€ã³ããŒã { #import-httpexception }
-{* ../../docs_src/handling_errors/tutorial001_py39.py hl[1] *}
+{* ../../docs_src/handling_errors/tutorial001_py310.py hl[1] *}
### ã³ãŒãå
ã§ã®`HTTPException`ã®çºç { #raise-an-httpexception-in-your-code }
ãã®äŸã§ã¯ãã¯ã©ã€ã¢ã³ããååšããªãIDã§ã¢ã€ãã ãèŠæ±ããå Žåã`404`ã®ã¹ããŒã¿ã¹ã³ãŒããæã€äŸå€ãçºçãããŸã:
-{* ../../docs_src/handling_errors/tutorial001_py39.py hl[11] *}
+{* ../../docs_src/handling_errors/tutorial001_py310.py hl[11] *}
### ã¬ã¹ãã³ã¹çµæ { #the-resulting-response }
ããããé«åºŠãªã·ããªãªã®ããã«å¿
èŠãªå Žåã«ã¯ãã«ã¹ã¿ã ããããŒã远å ããããšãã§ããŸã:
-{* ../../docs_src/handling_errors/tutorial002_py39.py hl[14] *}
+{* ../../docs_src/handling_errors/tutorial002_py310.py hl[14] *}
## ã«ã¹ã¿ã äŸå€ãã³ãã©ã®ã€ã³ã¹ããŒã« { #install-custom-exception-handlers }
ã«ã¹ã¿ã äŸå€ãã³ãã©ã`@app.exception_handler()`ã§è¿œå ããããšãã§ããŸã:
-{* ../../docs_src/handling_errors/tutorial003_py39.py hl[5:7,13:18,24] *}
+{* ../../docs_src/handling_errors/tutorial003_py310.py hl[5:7,13:18,24] *}
ããã§ã`/unicorns/yolo`ããªã¯ãšã¹ããããšã*path operation*ã¯`UnicornException`ã`raise`ããŸãã
ãã®äŸå€ãã³ãã©ã¯`Request`ãšäŸå€ãåãåããŸãã
-{* ../../docs_src/handling_errors/tutorial004_py39.py hl[2,14:19] *}
+{* ../../docs_src/handling_errors/tutorial004_py310.py hl[2,14:19] *}
ããã§ã`/items/foo`ã«ã¢ã¯ã»ã¹ãããšã以äžã®ããã©ã«ãã®JSONãšã©ãŒã®ä»£ããã«:
äŸãã°ããããã®ãšã©ãŒã«å¯ŸããŠã¯ãJSONã§ã¯ãªããã¬ãŒã³ããã¹ããè¿ãããã«ããããšãã§ããŸã:
-{* ../../docs_src/handling_errors/tutorial004_py39.py hl[3:4,9:11,25] *}
+{* ../../docs_src/handling_errors/tutorial004_py310.py hl[3:4,9:11,25] *}
/// note | æè¡è©³çް
ã¢ããªéçºäžã«ããã£ã®ãã°ãåã£ãŠãããã°ãããããŠãŒã¶ãŒã«è¿ããããªã©ã«äœ¿çšããããšãã§ããŸãã
-{* ../../docs_src/handling_errors/tutorial005_py39.py hl[14] *}
+{* ../../docs_src/handling_errors/tutorial005_py310.py hl[14] *}
ããã§ã以äžã®ãããªç¡å¹ãªé
ç®ãéä¿¡ããŠã¿ãŠãã ãã:
**FastAPI** ããåãããã©ã«ãã®äŸå€ãã³ãã©ãšäžç·ã«äŸå€ã䜿çšãããå Žåã¯ã`fastapi.exception_handlers`ããããã©ã«ãã®äŸå€ãã³ãã©ãã€ã³ããŒãããŠåå©çšã§ããŸã:
-{* ../../docs_src/handling_errors/tutorial006_py39.py hl[2:5,15,21] *}
+{* ../../docs_src/handling_errors/tutorial006_py310.py hl[2:5,15,21] *}
ãã®äŸã§ã¯ãéåžžã«è¡šçŸåã®ããã¡ãã»ãŒãžã§ãšã©ãŒã`print`ããŠããã ãã§ãããèŠç¹ã¯çè§£ã§ããã¯ãã§ããäŸå€ã䜿çšãããã®åŸããã©ã«ãã®äŸå€ãã³ãã©ãåå©çšã§ããŸãã
--- /dev/null
+# ããããŒãã©ã¡ãŒã¿ã®ã¢ãã« { #header-parameter-models }
+
+é¢é£ãã**ããããŒãã©ã¡ãŒã¿**ãäžåŒããå Žåããããã宣èšããããã®**Pydantic ã¢ãã«**ãäœæã§ããŸãã
+
+ããã«ãããã¢ãã«ã**è€æ°ç®æ**ã§**åå©çš**ã§ããããã«ãã¹ãŠã®ãã©ã¡ãŒã¿ã«å¯ŸããããªããŒã·ã§ã³ãã¡ã¿ããŒã¿ãäžæ¬ã§å®£èšã§ããŸããð
+
+/// note | åè
+
+ãã㯠FastAPI ããŒãžã§ã³ `0.115.0` 以éã§ãµããŒããããŠããŸããð€
+
+///
+
+## Pydantic ã¢ãã«ã«ããããããŒãã©ã¡ãŒã¿ { #header-parameters-with-a-pydantic-model }
+
+å¿
èŠãª**ããããŒãã©ã¡ãŒã¿**ã**Pydantic ã¢ãã«**å
ã§å®£èšãã颿°åŒæ°ã§ã¯ãã®ãã©ã¡ãŒã¿ã `Header` ãšããŠå®£èšããŸã:
+
+{* ../../docs_src/header_param_models/tutorial001_an_py310.py hl[9:14,18] *}
+
+**FastAPI** ã¯ãªã¯ãšã¹ãã®**ããããŒ**ãã**åãã£ãŒã«ã**ã®å€ã**æœåº**ããå®çŸ©ãã Pydantic ã¢ãã«ãšããŠæž¡ããŸãã
+
+## ããã¥ã¡ã³ãã®ç¢ºèª { #check-the-docs }
+
+`/docs` ã®ããã¥ã¡ã³ã UI ã§å¿
èŠãªããããŒã確èªã§ããŸã:
+
+<div class="screenshot">
+<img src="/img/tutorial/header-param-models/image01.png">
+</div>
+
+## äœåãªããããŒãçŠæ¢ { #forbid-extra-headers }
+
+ç¹æ®ãªãŠãŒã¹ã±ãŒã¹ïŒããŸãäžè¬çã§ã¯ãããŸããïŒã§ã¯ãåãä»ããããããŒã**å¶é**ãããå ŽåããããŸãã
+
+Pydantic ã®ã¢ãã«èšå®ã§ `extra` ãã£ãŒã«ãã `forbid` ã«ããŠçŠæ¢ã§ããŸã:
+
+{* ../../docs_src/header_param_models/tutorial002_an_py310.py hl[10] *}
+
+ã¯ã©ã€ã¢ã³ãã**äœåãªããããŒ**ãéä¿¡ããããšãããšã**ãšã©ãŒ**ã¬ã¹ãã³ã¹ãè¿ãããŸãã
+
+äŸãã°ãã¯ã©ã€ã¢ã³ããå€ `plumbus` ã® `tool` ããããŒãéãããšãããšãããããŒãã©ã¡ãŒã¿ `tool` ã¯èš±å¯ãããŠããªãæšã®**ãšã©ãŒ**ã¬ã¹ãã³ã¹ãè¿ãããŸã:
+
+```json
+{
+ "detail": [
+ {
+ "type": "extra_forbidden",
+ "loc": ["header", "tool"],
+ "msg": "Extra inputs are not permitted",
+ "input": "plumbus",
+ }
+ ]
+}
+```
+
+## ã¢ã³ããŒã¹ã³ã¢å€æã®ç¡å¹å { #disable-convert-underscores }
+
+éåžžã®ããããŒãã©ã¡ãŒã¿ãšåæ§ã«ããã©ã¡ãŒã¿åã«ã¢ã³ããŒã¹ã³ã¢ãããå Žåã¯**èªåçã«ãã€ãã³ã«å€æ**ãããŸãã
+
+äŸãã°ãã³ãŒãäžã§ããããŒãã©ã¡ãŒã¿ `save_data` ãå®çŸ©ãããšãæ³å®ããã HTTP ããããŒã¯ `save-data` ãšãªããããã¥ã¡ã³ãäžã«ããã®ããã«è¡šç€ºãããŸãã
+
+äœããã®çç±ã§ãã®èªå倿ãç¡å¹åããå¿
èŠãããå ŽåãããããŒãã©ã¡ãŒã¿çšã® Pydantic ã¢ãã«ã§ãç¡å¹åã§ããŸãã
+
+{* ../../docs_src/header_param_models/tutorial003_an_py310.py hl[19] *}
+
+/// warning | 泚æ
+
+`convert_underscores` ã `False` ã«èšå®ããåã«ãã¢ã³ããŒã¹ã³ã¢ãå«ãããããŒã®äœ¿çšãçŠæ¢ããŠãã HTTP ãããã·ããµãŒããŒãããããšã«çæããŠãã ããã
+
+///
+
+## ãŸãšã { #summary }
+
+**Pydantic ã¢ãã«**ã䜿ã£ãŠ **FastAPI** ã§ **ããããŒ**ã宣èšã§ããŸããð
以äžã®ããã«èšå®ã§ããŸã:
-{* ../../docs_src/metadata/tutorial001_py39.py hl[3:16, 19:32] *}
+{* ../../docs_src/metadata/tutorial001_py310.py hl[3:16, 19:32] *}
/// tip | è±ç¥è
äŸ:
-{* ../../docs_src/metadata/tutorial001_1_py39.py hl[31] *}
+{* ../../docs_src/metadata/tutorial001_1_py310.py hl[31] *}
## ã¿ã°ã®ã¡ã¿ããŒã¿ { #metadata-for-tags }
ã¿ã°ã®ã¡ã¿ããŒã¿ãäœæããããã `openapi_tags` ãã©ã¡ãŒã¿ã«æž¡ããŸã:
-{* ../../docs_src/metadata/tutorial004_py39.py hl[3:16,18] *}
+{* ../../docs_src/metadata/tutorial004_py310.py hl[3:16,18] *}
説æã®äžã§Markdownã䜿çšã§ããããšã«æ³šæããŠãã ãããããšãã°ãloginãã¯å€ªå (**login**) ã§è¡šç€ºããããfancyãã¯æäœ (_fancy_) ã§è¡šç€ºãããŸãã
*path operation*ïŒããã³ `APIRouter`ïŒã® `tags` ãã©ã¡ãŒã¿ã䜿çšããŠãããããç°ãªãã¿ã°ã«å²ãåœãŠãŸã:
-{* ../../docs_src/metadata/tutorial004_py39.py hl[21,26] *}
+{* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *}
/// info | æ
å ±
ããšãã°ã`/api/v1/openapi.json` ã§æäŸãããããã«èšå®ããã«ã¯:
-{* ../../docs_src/metadata/tutorial002_py39.py hl[3] *}
+{* ../../docs_src/metadata/tutorial002_py310.py hl[3] *}
OpenAPIã¹ããŒããå®å
šã«ç¡å¹ã«ããå Žåã¯ã`openapi_url=None` ãèšå®ã§ããŸããããã«ãããããã䜿çšããããã¥ã¡ã³ãUIãç¡å¹ã«ãªããŸãã
ããšãã°ã`/documentation` ã§Swagger UIãæäŸãããããã«èšå®ããReDocãç¡å¹ã«ããã«ã¯:
-{* ../../docs_src/metadata/tutorial003_py39.py hl[3] *}
+{* ../../docs_src/metadata/tutorial003_py310.py hl[3] *}
* 次ã«ã察å¿ãã*path operation*ã«ãã£ãŠçæããã `response` ãè¿ããŸãã
* ãã®åŸã`response` ãè¿ãåã«ããã« `response` ã倿Žããããšãã§ããŸãã
-{* ../../docs_src/middleware/tutorial001_py39.py hl[8:9,11,14] *}
+{* ../../docs_src/middleware/tutorial001_py310.py hl[8:9,11,14] *}
/// tip | è±ç¥è
äŸãã°ããªã¯ãšã¹ãã®åŠçãšã¬ã¹ãã³ã¹ã®çæã«ããã£ãç§æ°ãå«ãã«ã¹ã¿ã ããã㌠`X-Process-Time` ã远å ã§ããŸã:
-{* ../../docs_src/middleware/tutorial001_py39.py hl[10,12:13] *}
+{* ../../docs_src/middleware/tutorial001_py310.py hl[10,12:13] *}
/// tip | è±ç¥è
ä»ã®ããã«ãŠã§ã¢ã®è©³çްã«ã€ããŠã¯ã[é«åºŠãªãŠãŒã¶ãŒã¬ã€ã: é«åºŠãªããã«ãŠã§ã¢](../advanced/middleware.md){.internal-link target=_blank}ãåç
§ããŠãã ããã
-次ã®ã»ã¯ã·ã§ã³ã§ã¯ãããã«ãŠã§ã¢ã䜿çšã㊠<abbr title="Cross-Origin Resource Sharing">CORS</abbr> ãåŠçããæ¹æ³ã«ã€ããŠèª¬æããŸãã
+次ã®ã»ã¯ã·ã§ã³ã§ã¯ãããã«ãŠã§ã¢ã䜿çšã㊠<abbr title="Cross-Origin Resource Sharing - ã¯ãã¹ãªãªãžã³ãªãœãŒã¹å
±æ">CORS</abbr> ãåŠçããæ¹æ³ã«ã€ããŠèª¬æããŸãã
**FastAPI** ã¯ããã¬ãŒã³ãªæååã®å Žåãšåãæ¹æ³ã§ããããµããŒãããŠããŸã:
-{* ../../docs_src/path_operation_configuration/tutorial002b_py39.py hl[1,8:10,13,18] *}
+{* ../../docs_src/path_operation_configuration/tutorial002b_py310.py hl[1,8:10,13,18] *}
## æŠèŠãšèª¬æ { #summary-and-description }
## docstringãçšãã説æ { #description-from-docstring }
-説ææã¯é·ããŠè€æ°è¡ã«ããã¶åŸåãããã®ã§ã颿°<abbr title="a multi-line string as the first expression inside a function (not assigned to any variable) used for documentation â ããã¥ã¡ã³ãã«äœ¿çšããã颿°å
ã®æåã®åŒïŒå€æ°ã«ä»£å
¥ãããŠããªãïŒãšããŠã®è€æ°è¡ã®æåå">docstring</abbr>å
ã«*path operation*ã®èª¬ææã宣èšã§ããŸãããããšã**FastAPI** ã¯èª¬ææãèªã¿èŸŒãã§ãããŸãã
+説ææã¯é·ããŠè€æ°è¡ã«ããã¶åŸåãããã®ã§ã颿°<dfn title="颿°å
ã®æåã®åŒïŒã©ã®å€æ°ã«ã代å
¥ãããªãïŒãšããŠèšè¿°ããããããã¥ã¡ã³ãçšã®è€æ°è¡ã®æåå">docstring</dfn>å
ã«*path operation*ã®èª¬ææã宣èšã§ããŸãããããšã**FastAPI** ã¯èª¬ææãèªã¿èŸŒãã§ãããŸãã
docstringã«<a href="https://en.wikipedia.org/wiki/Markdown" class="external-link" target="_blank">Markdown</a>ãèšè¿°ããã°ãæ£ããè§£éãããŠè¡šç€ºãããŸããïŒdocstringã®ã€ã³ãã³ããèæ
®ããŠïŒ
## *path operation*ãéæšå¥šã«ãã { #deprecate-a-path-operation }
-*path operation*ã<abbr title="obsolete, recommended not to use it â éæšå¥šã䜿ããªãæ¹ããã">deprecated</abbr>ãšããŠããŒã¯ããå¿
èŠããããããããåé€ããªãå Žåã¯ã`deprecated`ãã©ã¡ãŒã¿ãæž¡ããŸã:
+*path operation*ã<dfn title="éæšå¥šã䜿çšããªãããšãæšå¥š">deprecated</dfn>ãšããŠããŒã¯ããå¿
èŠããããããããåé€ããªãå Žåã¯ã`deprecated`ãã©ã¡ãŒã¿ãæž¡ããŸã:
-{* ../../docs_src/path_operation_configuration/tutorial006_py39.py hl[16] *}
+{* ../../docs_src/path_operation_configuration/tutorial006_py310.py hl[16] *}
察話çããã¥ã¡ã³ãã§ã¯éæšå¥šãšæèšãããŸã:
ãã®ããã以äžã®ããã«é¢æ°ã宣èšããããšãã§ããŸã:
-{* ../../docs_src/path_params_numeric_validations/tutorial002_py39.py hl[7] *}
+{* ../../docs_src/path_params_numeric_validations/tutorial002_py310.py hl[7] *}
ãã ãã`Annotated`ã䜿ãå Žåã¯ãã®åé¡ã¯èµ·ããªãããšãèŠããŠãããŠãã ããã`Query()`ã`Path()`ã«é¢æ°ãã©ã¡ãŒã¿ã®ããã©ã«ãå€ã䜿ããªãããã§ãã
-{* ../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py *}
+{* ../../docs_src/path_params_numeric_validations/tutorial002_an_py310.py *}
## å¿
èŠã«å¿ããŠãã©ã¡ãŒã¿ãäžŠã³æ¿ããããªã㯠{ #order-the-parameters-as-you-need-tricks }
颿°ã®æåã®ãã©ã¡ãŒã¿ãšããŠ`*`ãæž¡ããŸãã
-Pythonã¯ãã®`*`ã§äœããããããšã¯ãããŸãããããã以éã®ãã¹ãŠã®ãã©ã¡ãŒã¿ãããŒã¯ãŒãåŒæ°ïŒããŒãšå€ã®ãã¢ïŒãšããŠåŒã°ããã¹ããã®ã§ãããšç¥ã£ãŠããã§ããããããã¯<abbr title="From: K-ey W-ord Arg-uments"><code>kwargs</code></abbr>ãšããŠãç¥ãããŠããŸããããšãããã©ã«ãå€ããªããŠãã
+Pythonã¯ãã®`*`ã§äœããããããšã¯ãããŸãããããã以éã®ãã¹ãŠã®ãã©ã¡ãŒã¿ãããŒã¯ãŒãåŒæ°ïŒããŒãšå€ã®ãã¢ïŒãšããŠåŒã°ããã¹ããã®ã§ãããšç¥ã£ãŠããã§ããããããã¯<abbr title="From: K-ey W-ord Arg-uments - ããŒã¯ãŒãåŒæ°"><code>kwargs</code></abbr>ãšããŠãç¥ãããŠããŸããããšãããã©ã«ãå€ããªããŠãã
-{* ../../docs_src/path_params_numeric_validations/tutorial003_py39.py hl[7] *}
+{* ../../docs_src/path_params_numeric_validations/tutorial003_py310.py hl[7] *}
### `Annotated`ã®ã»ãããã { #better-with-annotated }
`Annotated`ã䜿ãå Žåã¯ã颿°ãã©ã¡ãŒã¿ã®ããã©ã«ãå€ã䜿ããªãããããã®åé¡ã¯èµ·ããããããã`*`ã䜿ãå¿
èŠããããŸããã
-{* ../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py hl[10] *}
+{* ../../docs_src/path_params_numeric_validations/tutorial003_an_py310.py hl[10] *}
## æ°å€ã®æ€èšŒ: ä»¥äž { #number-validations-greater-than-or-equal }
ããã§ã`ge=1`ã®å Žåã`item_id`ã¯`1`ããã倧ãã`g`ããåã`e`ãæŽæ°ã§ãªããã°ãªããŸããã
-{* ../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py hl[10] *}
+{* ../../docs_src/path_params_numeric_validations/tutorial004_an_py310.py hl[10] *}
## æ°å€ã®æ€èšŒ: ãã倧ãããšå°ãªãã€ã³ãŒã« { #number-validations-greater-than-and-less-than-or-equal }
* `gt`: `g`reater `t`han
* `le`: `l`ess than or `e`qual
-{* ../../docs_src/path_params_numeric_validations/tutorial005_an_py39.py hl[10] *}
+{* ../../docs_src/path_params_numeric_validations/tutorial005_an_py310.py hl[10] *}
## æ°å€ã®æ€èšŒ: æµ®åå°æ°ç¹ã 倧ãªãå°ãªã { #number-validations-floats-greater-than-and-less-than }
ããã¯<abbr title="less than â ããå°ãã"><code>lt</code></abbr>ãåãã§ãã
-{* ../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py hl[13] *}
+{* ../../docs_src/path_params_numeric_validations/tutorial006_an_py310.py hl[13] *}
## ãŸãšã { #recap }
Pythonã®formatæååãšåæ§ã®ã·ã³ã¿ãã¯ã¹ã§ããã¹ãã©ã¡ãŒã¿ããããã¹å€æ°ãã宣èšã§ããŸã:
-{* ../../docs_src/path_params/tutorial001_py39.py hl[6:7] *}
+{* ../../docs_src/path_params/tutorial001_py310.py hl[6:7] *}
ãã¹ãã©ã¡ãŒã¿ `item_id` ã®å€ã¯ãåŒæ° `item_id` ãšããŠé¢æ°ã«æž¡ãããŸãã
æšæºã®Pythonã®åã¢ãããŒã·ã§ã³ã䜿çšããŠã颿°å
ã®ãã¹ãã©ã¡ãŒã¿ã®åã宣èšã§ããŸã:
-{* ../../docs_src/path_params/tutorial002_py39.py hl[7] *}
+{* ../../docs_src/path_params/tutorial002_py310.py hl[7] *}
ããã§ã¯ã `item_id` 㯠`int` ãšããŠå®£èšãããŠããŸãã
///
-## ããŒã¿<abbr title="å¥å: serialization, parsing, marshalling">倿</abbr> { #data-conversion }
+## ããŒã¿<dfn title="å¥å: ã·ãªã¢ã©ã€ãºãããŒã¹ãããŒã·ã£ãªã³ã°">倿</dfn> { #data-conversion }
ãã®äŸãå®è¡ãããã©ãŠã¶ã§ <a href="http://127.0.0.1:8000/items/3" class="external-link" target="_blank">http://127.0.0.1:8000/items/3</a> ãéããšã次ã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸã:
颿°ãåãåã£ãïŒããã³è¿ããïŒå€ã¯ãæååã® `"3"` ã§ã¯ãªããPythonã® `int` ãšããŠã® `3` ã§ããããšã«æ³šæããŠãã ããã
-ãããã£ãŠããã®å宣èšã䜿ããšã**FastAPI**ã¯èªåãªã¯ãšã¹ã <abbr title="HTTPãªã¯ãšã¹ãã§åãåã£ãæååãPythonããŒã¿ãžå€æãã">"è§£æ"</abbr> ãè¡ããŸãã
+ãããã£ãŠããã®å宣èšã䜿ããšã**FastAPI**ã¯èªåãªã¯ãšã¹ã <dfn title="HTTPãªã¯ãšã¹ãããåãåã£ãæååãPythonã®ããŒã¿ã«å€æãã">"è§£æ"</dfn> ãè¡ããŸãã
///
*path operations* ã¯é ã«è©äŸ¡ãããã®ã§ã `/users/me` ã `/users/{user_id}` ãããå
ã«å®£èšãããŠããã確èªããå¿
èŠããããŸã:
-{* ../../docs_src/path_params/tutorial003_py39.py hl[6,11] *}
+{* ../../docs_src/path_params/tutorial003_py310.py hl[6,11] *}
ãã以å€ã®å Žåã `/users/{user_id}` 㯠`/users/me` ãšããŠããããããŸããå€ã `"me"` ã§ãããã©ã¡ãŒã¿ `user_id` ãåãåããšãèãããŸãã
åæ§ã«ãpath operation ãåå®çŸ©ããããšã¯ã§ããŸãã:
-{* ../../docs_src/path_params/tutorial003b_py39.py hl[6,11] *}
+{* ../../docs_src/path_params/tutorial003b_py310.py hl[6,11] *}
ãã¹ã¯æåã«ããããããã®ãåžžã«äœ¿ããããããæåã®ãã®ãåžžã«äœ¿çšãããŸãã
ãããŠãåºå®å€ã®ã¯ã©ã¹å±æ§ãäœããŸãããããšããã®å€ã䜿çšå¯èœãªå€ãšãªããŸã:
-{* ../../docs_src/path_params/tutorial005_py39.py hl[1,6:9] *}
+{* ../../docs_src/path_params/tutorial005_py310.py hl[1,6:9] *}
/// tip | è±ç¥è
-"AlexNet"ã"ResNet"ãããŠ"LeNet"ã¯æ©æ¢°åŠç¿<abbr title="Technically, Deep Learning model architectures">ã¢ãã«</abbr>ã®ååã§ãã
+"AlexNet"ã"ResNet"ãããŠ"LeNet"ã¯æ©æ¢°åŠç¿<dfn title="å³å¯ã«ã¯ãDeep Learning ã®ã¢ãã«ã¢ãŒããã¯ãã£">ã¢ãã«</dfn>ã®ååã§ãã
///
次ã«ãäœæããenumã¯ã©ã¹ã§ãã`ModelName`ã䜿çšããåã¢ãããŒã·ã§ã³ããã€*ãã¹ãã©ã¡ãŒã¿*ãäœæããŸã:
-{* ../../docs_src/path_params/tutorial005_py39.py hl[16] *}
+{* ../../docs_src/path_params/tutorial005_py310.py hl[16] *}
### ããã¥ã¡ã³ãã®ç¢ºèª { #check-the-docs }
ããã¯ãäœæããåæå `ModelName` ã®*åæåã¡ã³ã*ãšæ¯èŒã§ããŸã:
-{* ../../docs_src/path_params/tutorial005_py39.py hl[17] *}
+{* ../../docs_src/path_params/tutorial005_py310.py hl[17] *}
#### *åæå€*ã®ååŸ { #get-the-enumeration-value }
`model_name.value` ããããã¯äžè¬ã«ã `your_enum_member.value` ã䜿çšããŠå®éã®å€ (ãã®å Žå㯠`str`) ãååŸã§ããŸãã
-{* ../../docs_src/path_params/tutorial005_py39.py hl[20] *}
+{* ../../docs_src/path_params/tutorial005_py310.py hl[20] *}
/// tip | è±ç¥è
ãããã¯ã¯ã©ã€ã¢ã³ãã«è¿ãããåã«é©åãªå€ (ãã®å Žåã¯æåå) ã«å€æãããŸãã
-{* ../../docs_src/path_params/tutorial005_py39.py hl[18,21,23] *}
+{* ../../docs_src/path_params/tutorial005_py310.py hl[18,21,23] *}
ã¯ã©ã€ã¢ã³ãã¯ä»¥äžã®æ§ãªJSONã¬ã¹ãã³ã¹ãåŸãŸã:
ãããã£ãŠã以äžã®æ§ã«äœ¿çšã§ããŸã:
-{* ../../docs_src/path_params/tutorial004_py39.py hl[6] *}
+{* ../../docs_src/path_params/tutorial004_py310.py hl[6] *}
/// tip | è±ç¥è
ç°¡æœã§ãæ¬è³ªçã§ãæšæºçãªPythonã®å宣èšã䜿çšããããšã§ã**FastAPI**ã¯ä»¥äžãè¡ããŸã:
* ãšãã£ã¿ãŒãµããŒã: ãšã©ãŒãã§ãã¯ãèªåè£å®ããªã©
-* ããŒã¿ã<abbr title="HTTPãªã¯ãšã¹ãã§åãåã£ãæååãPythonããŒã¿ãžå€æãã">è§£æ</abbr>ã
+* ããŒã¿ã<dfn title="HTTPãªã¯ãšã¹ãããåãåã£ãæååãPythonã®ããŒã¿ã«å€æãã">è§£æ</dfn>ã
* ããŒã¿ããªããŒã·ã§ã³
* APIã¢ãããŒã·ã§ã³ãšèªåããã¥ã¡ã³ãçæ
次ã®åã¢ãããŒã·ã§ã³ããããŸãã:
-//// tab | Python 3.10+
-
```Python
q: str | None = None
```
-////
-
-//// tab | Python 3.9+
-
-```Python
-q: Union[str, None] = None
-```
-
-////
-
ããã `Annotated` ã§å
ãã§ã次ã®ããã«ããŸã:
-//// tab | Python 3.10+
-
```Python
q: Annotated[str | None] = None
```
-////
-
-//// tab | Python 3.9+
-
-```Python
-q: Annotated[Union[str, None]] = None
-```
-
-////
-
ã©ã¡ããåãæå³ã§ã`q` 㯠`str` ãŸã㯠`None` ã«ãªãåŸããã©ã¡ãŒã¿ã§ãããã©ã«ãã§ã¯ `None` ã§ãã
ã§ã¯ãé¢çœããšããã«é²ã¿ãŸãããã ð
## 代æ¿ïŒå€ãæ¹æ³ïŒ: ããã©ã«ãå€ãšããŠã® `Query` { #alternative-old-query-as-the-default-value }
-FastAPI ã®ä»¥åã®ããŒãžã§ã³ïŒ<abbr title="before 2023-03">0.95.0</abbr> ããåïŒã§ã¯ããã©ã¡ãŒã¿ã®ããã©ã«ãå€ãšã㊠`Query` ã䜿ãå¿
èŠãããã`Annotated` ã®äžã«å
¥ããã®ã§ã¯ãããŸããã§ãããããã䜿ã£ãã³ãŒããèŠãããå¯èœæ§ãé«ãã®ã§ã説æããŸãã
+FastAPI ã®ä»¥åã®ããŒãžã§ã³ïŒ<dfn title="2023-03 ããå">0.95.0</dfn> ããåïŒã§ã¯ããã©ã¡ãŒã¿ã®ããã©ã«ãå€ãšã㊠`Query` ã䜿ãå¿
èŠãããã`Annotated` ã®äžã«å
¥ããã®ã§ã¯ãããŸããã§ãããããã䜿ã£ãã³ãŒããèŠãããå¯èœæ§ãé«ãã®ã§ã説æããŸãã
/// tip | è±ç¥è
## æ£èŠè¡šçŸã®è¿œå { #add-regular-expressions }
-ãã©ã¡ãŒã¿ãäžèŽããã¹ã <abbr title="A regular expression, regex or regexp is a sequence of characters that define a search pattern for strings.">æ£èŠè¡šçŸ</abbr> `pattern` ãå®çŸ©ããããšãã§ããŸã:
+ãã©ã¡ãŒã¿ãäžèŽããã¹ã <dfn title="æ£èŠè¡šçŸãregexãregexp ã¯ãæååã«å¯Ÿããæ€çŽ¢ãã¿ãŒã³ãå®çŸ©ããæåã®äžŠã³ã§ãã">æ£èŠè¡šçŸ</dfn> `pattern` ãå®çŸ©ããããšãã§ããŸã:
{* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *}
ã¯ãšãªãã©ã¡ãŒã¿ `q` ã® `min_length` ã `3` ãšããããã©ã«ãå€ã `"fixedquery"` ãšããŠå®£èšããããšããŸã:
-{* ../../docs_src/query_params_str_validations/tutorial005_an_py39.py hl[9] *}
+{* ../../docs_src/query_params_str_validations/tutorial005_an_py310.py hl[9] *}
/// note | åè
ãã®ããã`Query` ã䜿ããªããå€ãå¿
é ãšããŠå®£èšãããå Žåã¯ãåã«ããã©ã«ãå€ã宣èšããŸãã:
-{* ../../docs_src/query_params_str_validations/tutorial006_an_py39.py hl[9] *}
+{* ../../docs_src/query_params_str_validations/tutorial006_an_py310.py hl[9] *}
### å¿
é ã`None` ã«ã§ãã { #required-can-be-none }
ãŸããå€ãæå®ãããŠããªãå Žåã¯ããã©ã«ãã® `list` ãå®çŸ©ããããšãã§ããŸãã
-{* ../../docs_src/query_params_str_validations/tutorial012_an_py39.py hl[9] *}
+{* ../../docs_src/query_params_str_validations/tutorial012_an_py310.py hl[9] *}
以äžã«ã¢ã¯ã»ã¹ãããš:
`list[str]` ã®ä»£ããã«çŽæ¥ `list` ã䜿ãããšãã§ããŸã:
-{* ../../docs_src/query_params_str_validations/tutorial013_an_py39.py hl[9] *}
+{* ../../docs_src/query_params_str_validations/tutorial013_an_py310.py hl[9] *}
/// note | åè
ããŠããã®ãã©ã¡ãŒã¿ãæ°ã«å
¥ããªããªã£ããšããŸãããã
-ããã䜿ã£ãŠããã¯ã©ã€ã¢ã³ããããã®ã§ããã°ããã¯æ®ããŠããå¿
èŠããããŸãããããã¥ã¡ã³ãã«ã¯<abbr title="obsolete, recommended not to use it">deprecated</abbr>ãšæèšããŠããããã§ãã
+ããã䜿ã£ãŠããã¯ã©ã€ã¢ã³ããããã®ã§ããã°ããã¯æ®ããŠããå¿
èŠããããŸãããããã¥ã¡ã³ãã«ã¯<abbr title="obsolete, recommended not to use it - 廿¢äºå®ã䜿çšã¯æšå¥šãããŸãã">deprecated</abbr>ãšæèšããŠããããã§ãã
ãã®å Žåã`Query`ã«ãã©ã¡ãŒã¿`deprecated=True`ãæž¡ããŸã:
///
-äŸãã°ããã®ã«ã¹ã¿ã ããªããŒã¿ã¯ã<abbr title="ISBN means International Standard Book Number â åœéæšæºå³æžçªå·">ISBN</abbr> ã®æžç±çªå·ãªã item ID ã `isbn-` ã§å§ãŸãããšã<abbr title="IMDB (Internet Movie Database) is a website with information about movies â IMDBïŒInternet Movie DatabaseïŒã¯æ ç»ã«é¢ããæ
å ±ãæ²èŒããWebãµã€ãã§ã">IMDB</abbr> ã® movie URL ID ãªã `imdb-` ã§å§ãŸãããšããã§ãã¯ããŸã:
+äŸãã°ããã®ã«ã¹ã¿ã ããªããŒã¿ã¯ã<abbr title="International Standard Book Number - åœéæšæºå³æžçªå·">ISBN</abbr> ã®æžç±çªå·ãªã item ID ã `isbn-` ã§å§ãŸãããšã<abbr title="Internet Movie Database - ã€ã³ã¿ãŒãããã»ã ãŒããŒã»ããŒã¿ããŒã¹: æ ç»ã«é¢ããæ
å ±ãæ²èŒãã Web ãµã€ã">IMDB</abbr> ã® movie URL ID ãªã `imdb-` ã§å§ãŸãããšããã§ãã¯ããŸã:
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
#### ã©ã³ãã ãªã¢ã€ãã { #a-random-item }
-`data.items()` ã§ãèŸæžã®åã¢ã€ãã ã®ããŒãšå€ãå«ãã¿ãã«ãæã€ <abbr title="Something we can iterate on with a for loop, like a list, set, etc.">å埩å¯èœãªããžã§ã¯ã</abbr> ãååŸããŸãã
+`data.items()` ã§ãèŸæžã®åã¢ã€ãã ã®ããŒãšå€ãå«ãã¿ãã«ãæã€ <dfn title="for ã«ãŒãã§ç¹°ãè¿ãåŠçã§ãããã®ïŒlistãset ãªã©ïŒ">å埩å¯èœãªããžã§ã¯ã</dfn> ãååŸããŸãã
ãã®å埩å¯èœãªããžã§ã¯ãã `list(data.items())` ã§é©å㪠`list` ã«å€æããŸãã
ãã¹ãã©ã¡ãŒã¿ã§ã¯ãªã颿°ãã©ã¡ãŒã¿ã宣èšãããšããããã¯èªåçã«ãã¯ãšãªããã©ã¡ãŒã¿ãšããŠè§£éãããŸãã
-{* ../../docs_src/query_params/tutorial001_py39.py hl[9] *}
+{* ../../docs_src/query_params/tutorial001_py310.py hl[9] *}
ã¯ãšãªã¯URLå
ã§ `?` ã®åŸã«ç¶ãããŒãšããªã¥ãŒã®çµã§ã `&` ã§åºåãããŠããŸãã
ãã¹ãã©ã¡ãŒã¿ã«é©çšãããåŠçãšå®å
šã«åæ§ãªåŠçãã¯ãšãªãã©ã¡ãŒã¿ã«ãæœãããŸã:
* ãšãã£ã¿ãŒãµããŒã (æããã«)
-* ããŒã¿ <abbr title="converting the string that comes from an HTTP request into Python data">ãè§£æã</abbr>
+* ããŒã¿ <dfn title="HTTP ãªã¯ãšã¹ãããæ¥ãæååã Python ã®ããŒã¿ã«å€æããããš">ãè§£æã</dfn>
* ããŒã¿ããªããŒã·ã§ã³
* èªåããã¥ã¡ã³ãçæ
ãããã¯ãšãªãã©ã¡ãŒã¿ãå¿
é ã«ãããå Žåã¯ããã ããã©ã«ãå€ã宣èšããªããã°ããã§ã:
-{* ../../docs_src/query_params/tutorial005_py39.py hl[6:7] *}
+{* ../../docs_src/query_params/tutorial005_py310.py hl[6:7] *}
ããã§ãã¯ãšãªãã©ã¡ãŒã¿ `needy` 㯠`str` åã®å¿
é ã®ã¯ãšãªãã©ã¡ãŒã¿ã§ãã
--- /dev/null
+# ãªã¯ãšã¹ããã¡ã€ã« { #request-files }
+
+`File` ã䜿ã£ãŠãã¯ã©ã€ã¢ã³ããã¢ããããŒããããã¡ã€ã«ãå®çŸ©ã§ããŸãã
+
+/// info | æ
å ±
+
+ã¢ããããŒãããããã¡ã€ã«ãåãåãã«ã¯ããŸã <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a> ãã€ã³ã¹ããŒã«ããŸãã
+
+[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank}ãäœæããŠæå¹åããæ¬¡ã®ããã«ã€ã³ã¹ããŒã«ããŠãã ãã:
+
+```console
+$ pip install python-multipart
+```
+
+ã¢ããããŒãããããã¡ã€ã«ã¯ãform dataããšããŠéä¿¡ãããããã§ãã
+
+///
+
+## `File` ãã€ã³ããŒã { #import-file }
+
+`fastapi` ãã `File` ãš `UploadFile` ãã€ã³ããŒãããŸã:
+
+{* ../../docs_src/request_files/tutorial001_an_py310.py hl[3] *}
+
+## `File` ãã©ã¡ãŒã¿ã®å®çŸ© { #define-file-parameters }
+
+`Body` ã `Form` ãšåæ§ã®æ¹æ³ã§ãã¡ã€ã«ã®ãã©ã¡ãŒã¿ãäœæããŸã:
+
+{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
+
+/// info | æ
å ±
+
+`File` 㯠`Form` ãçŽæ¥ç¶æ¿ããã¯ã©ã¹ã§ãã
+
+ãã ãã`fastapi` ãã `Query`ã`Path`ã`File` ãªã©ãã€ã³ããŒããããšãããããã¯å®éã«ã¯ç¹æ®ãªã¯ã©ã¹ãè¿ã颿°ã§ããããšã«æ³šæããŠãã ããã
+
+///
+
+/// tip | è±ç¥è
+
+ãã¡ã€ã«ã®ããã£ã宣èšããã«ã¯ `File` ã䜿ãå¿
èŠããããŸããããããªããšããã©ã¡ãŒã¿ã¯ã¯ãšãªãã©ã¡ãŒã¿ãããã£ïŒJSONïŒãã©ã¡ãŒã¿ãšããŠè§£éãããŸãã
+
+///
+
+ãã¡ã€ã«ã¯ãform dataããšããŠã¢ããããŒããããŸãã
+
+*path operation 颿°* ã®ãã©ã¡ãŒã¿ã®åã `bytes` ãšããŠå®£èšãããšã**FastAPI** ããã¡ã€ã«ãèªã¿åããå
容ã `bytes` ãšããŠåãåããŸãã
+
+ããã¯å
容å
šäœãã¡ã¢ãªã«ä¿æãããããšãæå³ããŸããå°ããªãã¡ã€ã«ã«ã¯æå¹ã§ãã
+
+ããããå€ãã®å Žå㯠`UploadFile` ãäœ¿ãæ¹ãæå©ã§ãã
+
+## `UploadFile` ã«ãããã¡ã€ã«ãã©ã¡ãŒã¿ { #file-parameters-with-uploadfile }
+
+åã `UploadFile` ã«ããŠãã¡ã€ã«ãã©ã¡ãŒã¿ãå®çŸ©ããŸã:
+
+{* ../../docs_src/request_files/tutorial001_an_py310.py hl[14] *}
+
+`UploadFile` ã䜿ãããšã«ã¯ `bytes` ã«å¯Ÿããæ¬¡ã®å©ç¹ããããŸã:
+
+- ãã©ã¡ãŒã¿ã®ããã©ã«ãå€ã« `File()` ã䜿ãå¿
èŠããããŸããã
+- ãspooledããã¡ã€ã«ã䜿ããŸã:
+ - æå€§ãµã€ãºãŸã§ã¯ã¡ã¢ãªã«ä¿æãããããè¶
ãããšãã£ã¹ã¯ã«æ ŒçŽããããã¡ã€ã«ã§ãã
+- ãã®ãããç»åã»åç»ã»å€§ããªãã€ããªãªã©ã®å€§ããªãã¡ã€ã«ã§ããã¡ã¢ãªã䜿ãæããããšãªãããŸãåäœããŸãã
+- ã¢ããããŒãããããã¡ã€ã«ããã¡ã¿ããŒã¿ãååŸã§ããŸãã
+- <a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">file-like</a> 㪠`async` ã€ã³ã¿ãŒãã§ãŒã¹ãæã¡ãŸãã
+- å®éã® Python ã® <a href="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile" class="external-link" target="_blank">`SpooledTemporaryFile`</a> ãªããžã§ã¯ããå
¬éããŠãããfile-like ãªããžã§ã¯ããæåŸ
ããä»ã®ã©ã€ãã©ãªã«ãã®ãŸãŸæž¡ããŸãã
+
+### `UploadFile` { #uploadfile }
+
+`UploadFile` ã«ã¯æ¬¡ã®å±æ§ããããŸã:
+
+- `filename`: ã¢ããããŒãæã®å
ã®ãã¡ã€ã«åã衚ã `str`ïŒäŸ: `myimage.jpg`ïŒ
+- `content_type`: ã³ã³ãã³ãã¿ã€ãïŒMIME ã¿ã€ã / ã¡ãã£ã¢ã¿ã€ãïŒã衚ã `str`ïŒäŸ: `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">file-like</a> ãªãªããžã§ã¯ãïŒãããã¯å®éã® Python ã®ãã¡ã€ã«ãªããžã§ã¯ãã§ããfile-likeããªããžã§ã¯ããæåŸ
ãã颿°ãã©ã€ãã©ãªã«çŽæ¥æž¡ããŸãã
+
+`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` ã® *path operation 颿°* å
ã§ã¯æ¬¡ã®ããã«å
容ãååŸã§ããŸã:
+
+```Python
+contents = await myfile.read()
+```
+
+éåžžã® `def` ã® *path operation 颿°* å
ã«ããå Žåã¯ã`UploadFile.file` ã«çŽæ¥ã¢ã¯ã»ã¹ã§ããŸããäŸãã°:
+
+```Python
+contents = myfile.file.read()
+```
+
+/// note | `async` ã®æè¡è©³çް
+
+`async` ã¡ãœããã䜿ããšã**FastAPI** ã¯ãã¡ã€ã«ã¡ãœãããã¹ã¬ããããŒã«ã§å®è¡ãããã®å®äºãåŸ
æ©ããŸãã
+
+///
+
+/// note | Starlette ã®æè¡è©³çް
+
+**FastAPI** ã® `UploadFile` 㯠**Starlette** ã® `UploadFile` ãçŽæ¥ç¶æ¿ããŠããŸããã**Pydantic** ã FastAPI ã®ä»ã®éšåãšäºæã«ããããã«å¿
èŠãªèŠçŽ ã远å ããŠããŸãã
+
+///
+
+## ãForm Dataããšã¯ { #what-is-form-data }
+
+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"><abbr title="Mozilla Developer Network - Mozilla éçºè
ãããã¯ãŒã¯">MDN</abbr> Web Docs ã® <code>POST</code></a> ãåç
§ããŠãã ããã
+
+///
+
+/// warning | 泚æ
+
+1 ã€ã® *path operation* ã«è€æ°ã® `File` ããã³ `Form` ãã©ã¡ãŒã¿ã宣èšã§ããŸãããåæã« JSON ãšããŠåãåãããšãæåŸ
ãã `Body` ãã£ãŒã«ãã宣èšããããšã¯ã§ããŸããããªã¯ãšã¹ãã®ããã£ã¯ `application/json` ã§ã¯ãªã `multipart/form-data` ã§ãšã³ã³ãŒããããããã§ãã
+
+ãã㯠**FastAPI** ã®å¶éã§ã¯ãªããHTTP ãããã³ã«ã®ä»æ§ã§ãã
+
+///
+
+## ä»»æã®ãã¡ã€ã«ã¢ããããŒã { #optional-file-upload }
+
+æšæºã®åã¢ãããŒã·ã§ã³ã䜿ããããã©ã«ãå€ã `None` ã«èšå®ããããšã§ããã¡ã€ã«ãä»»æã«ã§ããŸã:
+
+{* ../../docs_src/request_files/tutorial001_02_an_py310.py hl[9,17] *}
+
+## 远å ã¡ã¿ããŒã¿ã€ãã® `UploadFile` { #uploadfile-with-additional-metadata }
+
+äŸãã°è¿œå ã®ã¡ã¿ããŒã¿ãèšå®ããããã«ã`UploadFile` ãšäœµã㊠`File()` ã䜿ãããšãã§ããŸã:
+
+{* ../../docs_src/request_files/tutorial001_03_an_py310.py hl[9,15] *}
+
+## è€æ°ãã¡ã€ã«ã®ã¢ããããŒã { #multiple-file-uploads }
+
+åæã«è€æ°ã®ãã¡ã€ã«ãã¢ããããŒãã§ããŸãã
+
+ãããã¯ãform dataãã§éä¿¡ãããåãããã©ãŒã ãã£ãŒã«ããã«é¢é£ä»ããããŸãã
+
+ãã®ããã«ã¯ã`bytes` ãŸã㯠`UploadFile` ã®ãªã¹ãã宣èšããŸã:
+
+{* ../../docs_src/request_files/tutorial002_an_py310.py hl[10,15] *}
+
+宣èšã©ããã`bytes` ãŸã㯠`UploadFile` ã® `list` ãåãåããŸãã
+
+/// note | æè¡è©³çް
+
+`from starlette.responses import HTMLResponse` ã䜿ãããšãã§ããŸãã
+
+**FastAPI** ã¯å©äŸ¿æ§ã®ããã`starlette.responses` ãšåããã®ã `fastapi.responses` ãšããŠæäŸããŠããŸãããã ããå©çšå¯èœãªã¬ã¹ãã³ã¹ã®å€ã㯠Starlette ããçŽæ¥æäŸãããŠããŸãã
+
+///
+
+### 远å ã¡ã¿ããŒã¿ã€ãã®è€æ°ãã¡ã€ã«ã¢ããããŒã { #multiple-file-uploads-with-additional-metadata }
+
+å
ã»ã©ãšåæ§ã«ã`UploadFile` ã«å¯ŸããŠã `File()` ã䜿ã£ãŠè¿œå ã®ãã©ã¡ãŒã¿ãèšå®ã§ããŸã:
+
+{* ../../docs_src/request_files/tutorial003_an_py310.py hl[11,18:20] *}
+
+## ãŸãšã { #recap }
+
+ãªã¯ãšã¹ãã§ãã©ãŒã ããŒã¿ãšããŠéä¿¡ãããã¢ããããŒããã¡ã€ã«ã宣èšããã«ã¯ã`File`ã`bytes`ã`UploadFile` ã䜿ããŸãã
--- /dev/null
+# ãã©ãŒã ã¢ãã« { #form-models }
+
+FastAPI ã§ã¯ããã©ãŒã ãã£ãŒã«ãã宣èšããããã« Pydantic ã¢ãã«ã䜿çšã§ããŸãã
+
+/// info | æ
å ±
+
+ãã©ãŒã ã䜿ãã«ã¯ããŸã <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a> ãã€ã³ã¹ããŒã«ããŸãã
+
+ãŸã [ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank} ãäœæããŠæå¹åãããã®ããã§ã€ã³ã¹ããŒã«ããŠãã ãããäŸãã°:
+
+```console
+$ pip install python-multipart
+```
+
+///
+
+/// note | åè
+
+ãã㯠FastAPI ããŒãžã§ã³ `0.113.0` 以éã§ãµããŒããããŠããŸããð€
+
+///
+
+## ãã©ãŒã çšã® Pydantic ã¢ãã« { #pydantic-models-for-forms }
+
+åãåããããã£ãŒã«ãã **ãã©ãŒã ãã£ãŒã«ã** ãšããŠæã€ **Pydantic ã¢ãã«** ã宣èšãããã©ã¡ãŒã¿ã `Form` ãšããŠå®£èšããã ãã§ã:
+
+{* ../../docs_src/request_form_models/tutorial001_an_py310.py hl[9:11,15] *}
+
+**FastAPI** ã¯ãªã¯ãšã¹ãã® **ãã©ãŒã ããŒã¿** ãã **åãã£ãŒã«ã** ã®ããŒã¿ã **æœåº** ããå®çŸ©ãã Pydantic ã¢ãã«ãšããŠæž¡ããŸãã
+
+## ããã¥ã¡ã³ãã§ç¢ºèª { #check-the-docs }
+
+`/docs` ã®ããã¥ã¡ã³ã UI ã§ç¢ºèªã§ããŸã:
+
+<div class="screenshot">
+<img src="/img/tutorial/request-form-models/image01.png">
+</div>
+
+## 远å ã®ãã©ãŒã ãã£ãŒã«ããçŠæ¢ { #forbid-extra-form-fields }
+
+äžéšã®ç¹æ®ãªãŠãŒã¹ã±ãŒã¹ïŒããããããŸãäžè¬çã§ã¯ãããŸããïŒã§ã¯ããã©ãŒã ãã£ãŒã«ãã Pydantic ã¢ãã«ã§å®£èšãããã®ã®ã¿ã«**å¶é**ãã**远å **ã®ãã£ãŒã«ãã**çŠæ¢**ãããå ŽåããããŸãã
+
+/// note | åè
+
+ãã㯠FastAPI ããŒãžã§ã³ `0.114.0` 以éã§ãµããŒããããŠããŸããð€
+
+///
+
+Pydantic ã®ã¢ãã«èšå®ã§ã`extra` ãã£ãŒã«ãã `forbid` ã«ã§ããŸã:
+
+{* ../../docs_src/request_form_models/tutorial002_an_py310.py hl[12] *}
+
+ã¯ã©ã€ã¢ã³ããäœåãªããŒã¿ãéä¿¡ããããšãããšã**ãšã©ãŒ**ã®ã¬ã¹ãã³ã¹ãåãåããŸãã
+
+äŸãã°ãã¯ã©ã€ã¢ã³ããæ¬¡ã®ãã©ãŒã ãã£ãŒã«ããéãããšããå Žå:
+
+- `username`: `Rick`
+- `password`: `Portal Gun`
+- `extra`: `Mr. Poopybutthole`
+
+ãã£ãŒã«ã `extra` ã¯èš±å¯ãããŠããªãæšã®ãšã©ãŒã¬ã¹ãã³ã¹ãè¿ãããŸã:
+
+```json
+{
+ "detail": [
+ {
+ "type": "extra_forbidden",
+ "loc": ["body", "extra"],
+ "msg": "Extra inputs are not permitted",
+ "input": "Mr. Poopybutthole"
+ }
+ ]
+}
+```
+
+## ãŸãšã { #summary }
+
+FastAPI ã§ãã©ãŒã ãã£ãŒã«ãã宣èšããããã« Pydantic ã¢ãã«ã䜿çšã§ããŸããð
## `File`ãš`Form`ã®ã€ã³ããŒã { #import-file-and-form }
-{* ../../docs_src/request_forms_and_files/tutorial001_an_py39.py hl[3] *}
+{* ../../docs_src/request_forms_and_files/tutorial001_an_py310.py hl[3] *}
## `File`ãš`Form`ã®ãã©ã¡ãŒã¿ã®å®çŸ© { #define-file-and-form-parameters }
ãã¡ã€ã«ããã©ãŒã ã®ãã©ã¡ãŒã¿ã¯`Body`ã`Query`ã®å Žåãšåãããã«äœæããŸã:
-{* ../../docs_src/request_forms_and_files/tutorial001_an_py39.py hl[10:12] *}
+{* ../../docs_src/request_forms_and_files/tutorial001_an_py310.py hl[10:12] *}
ãã¡ã€ã«ãšãã©ãŒã ãã£ãŒã«ãããã©ãŒã ããŒã¿ãšããŠã¢ããããŒãããããã¡ã€ã«ãšãã©ãŒã ãã£ãŒã«ããåãåããŸãã
`fastapi`ãã`Form`ãã€ã³ããŒãããŸã:
-{* ../../docs_src/request_forms/tutorial001_an_py39.py hl[3] *}
+{* ../../docs_src/request_forms/tutorial001_an_py310.py hl[3] *}
## `Form`ã®ãã©ã¡ãŒã¿ã®å®çŸ© { #define-form-parameters }
`Body`ã`Query`ã®å Žåãšåãããã«ãã©ãŒã ãã©ã¡ãŒã¿ãäœæããŸã:
-{* ../../docs_src/request_forms/tutorial001_an_py39.py hl[9] *}
+{* ../../docs_src/request_forms/tutorial001_an_py310.py hl[9] *}
äŸãã°ãOAuth2仿§ã䜿çšã§ããæ¹æ³ã®ïŒã€ïŒããã¹ã¯ãŒããããŒããšåŒã°ããïŒã§ã¯ããã©ãŒã ãã£ãŒã«ããšããŠ`username`ãš`password`ãéä¿¡ããå¿
èŠããããŸãã
-<abbr title="specification â 仿§">spec</abbr>ã§ã¯ããã£ãŒã«ãã®ååã`username`ãš`password`ã§ããããšãšãJSONã§ã¯ãªããã©ãŒã ãã£ãŒã«ããšããŠéä¿¡ãããããšãèŠæ±ããŠããŸãã
+<dfn title="仿§">仿§</dfn>ã§ã¯ããã£ãŒã«ãã®ååãæ£ç¢ºã«`username`ãš`password`ã§ããããšãšãJSONã§ã¯ãªããã©ãŒã ãã£ãŒã«ããšããŠéä¿¡ãããããšãèŠæ±ããŠããŸãã
`Form`ã§ã¯`Body`ïŒããã³`Query`ã`Path`ã`Cookie`ïŒãšåãèšå®ã宣èšããããšãã§ããŸããããã«ã¯ãããªããŒã·ã§ã³ãäŸããšã€ãªã¢ã¹ïŒäŸãã°`username`ã®ä»£ããã«`user-name`ïŒãªã©ãå«ãŸããŸãã
ãããããã©ãŒã ããã¡ã€ã«ãå«ãå Žåã¯ã`multipart/form-data`ãšããŠãšã³ã³ãŒããããŸãããã¡ã€ã«ã®æ±ãã«ã€ããŠã¯æ¬¡ã®ç« ã§èª¬æããŸãã
-ãããã®ãšã³ã³ãŒãã£ã³ã°ããã©ãŒã ãã£ãŒã«ãã®è©³çްã«ã€ããŠã¯ã<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network">MDN</abbr>ã®<code>POST</code></a>ã®ãŠã§ãããã¥ã¡ã³ããåç
§ããŠãã ããã
+ãããã®ãšã³ã³ãŒãã£ã³ã°ããã©ãŒã ãã£ãŒã«ãã®è©³çްã«ã€ããŠã¯ã<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network - Mozilla éçºè
ãããã¯ãŒã¯">MDN</abbr>ã®<code>POST</code></a>ã®ãŠã§ãããã¥ã¡ã³ããåç
§ããŠãã ããã
///
/// warning | 泚æ
-*path operation*ã§è€æ°ã®`Form`ãã©ã¡ãŒã¿ã宣èšããããšãã§ããŸãããJSONãšããŠåãåãããšãæåŸ
ããŠãã`Body`ãã£ãŒã«ãã宣èšããããšã¯ã§ããŸããããªããªãããªã¯ãšã¹ãã¯`application/json`ã®ä»£ããã«`application/x-www-form-urlencoded`ã䜿ã£ãŠããã£ããšã³ã³ãŒãããããã§ãã
+*path operation*ã§è€æ°ã®`Form`ãã©ã¡ãŒã¿ã宣èšããããšãã§ããŸãããJSONãšããŠåãåãããšãæåŸ
ããŠãã`Body`ãã£ãŒã«ãã宣èšããããšã¯ã§ããŸããããªããªãããªã¯ãšã¹ãã¯`application/x-www-form-urlencoded`ã®ä»£ããã«`application/json`ã䜿ã£ãŠããã£ããšã³ã³ãŒãããããã§ãã
ãã㯠**FastAPI**ã®å¶éã§ã¯ãªããHTTPãããã³ã«ã®äžéšã§ãã
/// note | åè
-`response_model`ã\81¯ã\80\8cã\83\87ã\82³ã\83‹\83΋\82¿ã\80\8dã\83¡ã\82ϋ\83\83ã\83\89ïŒ\88`get`ã\80\81`post`ã\81ªã\81©ïŒ\89ã\81®ã\83\91ã\83©ã\83¡ã\83΋\82¿ã\81§ã\81\82ã\82\8bã\81\93ã\81šã\81«Ê³šÊ\84\8fã\81\97ã\81Šã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\81\99ã\81¹ã\81Šã\81®ã\83\91ã\83©ã\83¡ã\83΋\82¿ã\82\84ã\83\9cã\83\87ã\82£ã\81®ã\82\88ã\81\86ã\81«ã\80\81*path operation é\96¢Ê\95°* ã®ãã©ã¡ãŒã¿ã§ã¯ãããŸããã
+`response_model`ã\81¯ã\80\8cã\83\87ã\82³ã\83‹\83΋\82¿ã\80\8dã\83¡ã\82ϋ\83\83ã\83\89ïŒ\88`get`ã\80\81`post`ã\81ªã\81©ïŒ\89ã\81®ã\83\91ã\83©ã\83¡ã\83΋\82¿ã\81§ã\81\99ã\80\82é\96¢Ê\95°ã\81®ã\83\91ã\83©ã\83¡ã\83΋\82¿ã\82\84ã\83\9cã\83\87ã\82£ã\81ªã\81©ã\81šã\81¯é\81\95ã\81\84ã\80\81*path operation é\96¢Ê\95°*ã®ãã©ã¡ãŒã¿ã§ã¯ãããŸããã
///
æãäžè¬çãªã±ãŒã¹ã¯ã[é«åºŠãªããã¥ã¡ã³ãã§åŸè¿°ãããResponseãçŽæ¥è¿ãã](../advanced/response-directly.md){.internal-link target=_blank}å Žåã§ãã
-{* ../../docs_src/response_model/tutorial003_02_py39.py hl[8,10:11] *}
+{* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *}
ãã®ã·ã³ãã«ãªã±ãŒã¹ã¯ãæ»ãå€ã®åã¢ãããŒã·ã§ã³ã `Response` ã®ã¯ã©ã¹ïŒãŸãã¯ãµãã¯ã©ã¹ïŒã§ãããããFastAPIãèªåçã«åŠçããŸãã
åã¢ãããŒã·ã§ã³ã§ `Response` ã®ãµãã¯ã©ã¹ã䜿ãããšãã§ããŸã:
-{* ../../docs_src/response_model/tutorial003_03_py39.py hl[8:9] *}
+{* ../../docs_src/response_model/tutorial003_03_py310.py hl[8:9] *}
ãã㯠`RedirectResponse` ã `Response` ã®ãµãã¯ã©ã¹ã§ãããFastAPIããã®ã·ã³ãã«ãªã±ãŒã¹ãèªååŠçãããããåæ§ã«åäœããŸãã
ããããPydanticåãšããŠæå¹ã§ã¯ãªãå¥ã®ä»»æã®ãªããžã§ã¯ãïŒäŸ: ããŒã¿ããŒã¹ãªããžã§ã¯ãïŒãè¿ãã颿°ã§ãã®ããã«ã¢ãããŒã·ã§ã³ãããšãFastAPIã¯ãã®åã¢ãããŒã·ã§ã³ããPydanticã¬ã¹ãã³ã¹ã¢ãã«ãäœæããããšããŠå€±æããŸãã
-åæ§ã«ã<abbr title='è€æ°ã®åã®unionã¯ããããã®åã®ããããããæå³ããŸãã'>union</abbr>ã®ããã«ãè€æ°ã®åã®ãã¡1ã€ä»¥äžãPydanticåãšããŠæå¹ã§ãªããã®ãå«ãå Žåãèµ·ãããŸããäŸãã°æ¬¡ã¯å€±æããŸã ð¥:
+åæ§ã«ã<dfn title="è€æ°ã®åã®ãŠããªã³ã¯ããããã®åã®ããããããæå³ããŸãã">ãŠããªã³</dfn>ã®ããã«ãè€æ°ã®åã®ãã¡1ã€ä»¥äžãPydanticåãšããŠæå¹ã§ãªããã®ãå«ãå Žåãèµ·ãããŸããäŸãã°æ¬¡ã¯å€±æããŸã ð¥:
{* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *}
* `@app.delete()`
* etc.
-{* ../../docs_src/response_status_code/tutorial001_py39.py hl[6] *}
+{* ../../docs_src/response_status_code/tutorial001_py310.py hl[6] *}
/// note | åè
å
ã»ã©ã®äŸãããäžåºŠèŠãŠã¿ãŸããã:
-{* ../../docs_src/response_status_code/tutorial001_py39.py hl[6] *}
+{* ../../docs_src/response_status_code/tutorial001_py310.py hl[6] *}
`201`ã¯ãäœæå®äºãã®ããã®ã¹ããŒã¿ã¹ã³ãŒãã§ãã
`fastapi.status`ã®äŸ¿å©ãªå€æ°ãå©çšããããšãã§ããŸãã
-{* ../../docs_src/response_status_code/tutorial002_py39.py hl[1,6] *}
+{* ../../docs_src/response_status_code/tutorial002_py310.py hl[1,6] *}
ãããã¯åãªã䟿å©ãªãã®ã§ãããåãçªå·ãä¿æããŠããŸãããããããã®æ¹æ³ã§ã¯ãšãã£ã¿ã®èªåè£å®ã䜿çšããŠããããèŠã€ããããšãã§ããŸãã
ãã®å Žåãexamplesã¯ãã®ããã£ããŒã¿ã®å
éš**JSON Schema**ã®äžéšã«ãªããŸãã
-ããã§ãã<abbr title="2023-08-26">å·çæç¹</abbr>ã§ã¯ãããã¥ã¡ã³ãUIã®è¡šç€ºãæ
åœããããŒã«ã§ããSwagger UIã¯ã**JSON Schema**å
ã®ããŒã¿ã«å¯ŸããŠè€æ°ã®äŸã衚瀺ããããšããµããŒãããŠããŸãããããããåé¿çã«ã€ããŠã¯ä»¥äžãèªãã§ãã ããã
+ããã§ãã<dfn title="2023-08-26">å·çæç¹</dfn>ã§ã¯ãããã¥ã¡ã³ãUIã®è¡šç€ºãæ
åœããããŒã«ã§ããSwagger UIã¯ã**JSON Schema**å
ã®ããŒã¿ã«å¯ŸããŠè€æ°ã®äŸã衚瀺ããããšããµããŒãããŠããŸãããããããåé¿çã«ã€ããŠã¯ä»¥äžãèªãã§ãã ããã
### OpenAPIåºæã®`examples` { #openapi-specific-examples }
`main.py`ã«ãäžèšã®äŸãã³ããŒããŸã:
-{* ../../docs_src/security/tutorial001_an_py39.py *}
+{* ../../docs_src/security/tutorial001_an_py310.py *}
## å®è¡ { #run-it }
`OAuth2PasswordBearer` ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããæã«ããã©ã¡ãŒã¿ãŒ`tokenUrl`ãæž¡ããŸãããã®ãã©ã¡ãŒã¿ãŒã«ã¯ãã¯ã©ã€ã¢ã³ã (ãŠãŒã¶ãŒã®ãã©ãŠã¶ã§åäœããããã³ããšã³ã) ãããŒã¯ã³ãååŸããããã«`username`ãš`password`ãéä¿¡ããURLãæå®ããŸãã
-{* ../../docs_src/security/tutorial001_an_py39.py hl[8] *}
+{* ../../docs_src/security/tutorial001_an_py310.py hl[8] *}
/// tip | è±ç¥è
/// info | æ
å ±
-éåžžã«å³æ ŒãªãPythonistaãã§ããã°ããã©ã¡ãŒã¿ãŒåã®ã¹ã¿ã€ã«ã`token_url`ã§ã¯ãªã`tokenUrl`ã§ããããšãæ°ã«å
¥ããªããããããŸããã
+éåžžã«å³æ ŒãªãPythonistaãã§ããã°ããã©ã¡ãŒã¿ãŒåã®ã¹ã¿ã€ã«ã`tokenUrl`ã§ã¯ãªã`token_url`ã§ããããšãæ°ã«å
¥ããªããããããŸããã
ããã¯OpenAPI仿§ãšåãååã䜿çšããŠããããã§ãããã®ããããããã®ã»ãã¥ãªãã£ã¹ããŒã ã«ã€ããŠãã£ãšèª¿ã¹ãå¿
èŠãããå Žåã¯ããããã³ããŒããŠè²Œãä»ããã°ãããã«ã€ããŠã®è©³çŽ°ãªæ
å ±ãèŠã€ããããšãã§ããŸãã
ããã§`oauth2_scheme`ã`Depends`ã§äŸåé¢ä¿ã«æž¡ãããšãã§ããŸãã
-{* ../../docs_src/security/tutorial001_an_py39.py hl[12] *}
+{* ../../docs_src/security/tutorial001_an_py310.py hl[12] *}
ãã®äŸåé¢ä¿ã¯ã*path operation 颿°*ã®ãã©ã¡ãŒã¿ãŒ`token`ã«ä»£å
¥ããã`str`ãæäŸããŸãã
äžã€åã®ç« ã§ã¯ãïŒäŸåæ§æ³šå
¥ã·ã¹ãã ã«åºã¥ããïŒã»ãã¥ãªãã£ã·ã¹ãã ã¯ã *path operation 颿°* ã« `str` ãšã㊠`token` ãäžããŠããŸãã:
-{* ../../docs_src/security/tutorial001_an_py39.py hl[12] *}
+{* ../../docs_src/security/tutorial001_an_py310.py hl[12] *}
ããããããã¯ãŸã ãããªã«æçšã§ã¯ãããŸããã
-# ã»ãã¥ãªãã£å
¥é
+# ã»ãã¥ãªãã£å
¥é { #security }
ã»ãã¥ãªãã£ãèªèšŒãèªå¯ãæ±ãã«ã¯å€ãã®æ¹æ³ããããŸãã
ãããããã®åã«ãããã€ãã®å°ããªæŠå¿µã確èªããŸãããã
-## ãæ¥ãã§ããïŒ
+## ãæ¥ãã§ããïŒ { #in-a-hurry }
ããããããã®çšèªã«èå³ããªãããŠãŒã¶ãŒåãšãã¹ã¯ãŒãã«åºã¥ãèªèšŒã§ã»ãã¥ãªãã£ã**ä»ãã**確ä¿ããå¿
èŠãããå Žåã¯ã次ã®ç« ã«é²ãã§ãã ããã
-## OAuth2
+## OAuth2 { #oauth2 }
OAuth2ã¯ãèªèšŒãšèªå¯ãåŠçããããã®ããã€ãã®æ¹æ³ãå®çŸ©ãã仿§ã§ãã
ãããããFacebookãGoogleãX (Twitter)ãGitHubã䜿ã£ãŠãã°ã€ã³ãã䜿çšãããã¹ãŠã®ã·ã¹ãã ã®èåŸã§äœ¿ãããŠããä»çµã¿ã§ãã
-### OAuth 1
+### OAuth 1 { #oauth-1 }
OAuth 1ãšãããã®ããããŸããããããã¯OAuth2ãšã¯å
šãç°ãªããéä¿¡ãã©ã®ããã«æå·åããããšãã仿§ãçŽæ¥çã«å«ãŸããŠãããããè€éãªãã®ãšãªã£ãŠããŸãã
///
-## OpenID Connect
+## OpenID Connect { #openid-connect }
OpenID Connectã¯ã**OAuth2**ãããŒã¹ã«ããå¥ã®ä»æ§ã§ãã
ããããFacebookã®ãã°ã€ã³ã¯OpenID ConnectããµããŒãããŠããŸãããOAuth2ãç¬èªã«ã¢ã¬ã³ãžããŠããŸãã
-### OpenID (ãOpenID Connectãã§ã¯ãªã)
+### OpenID (ãOpenID Connectãã§ã¯ãªã) { #openid-not-openid-connect }
ãŸãããOpenIDããšãã仿§ããããŸãããããã¯ã**OpenID Connect**ãšåãããšã解決ããããšãããã®ã§ãããOAuth2ã«åºã¥ããŠããããã§ã¯ãããŸããã§ããã
çŸåšã§ã¯ããŸãæ®åããŠããŸãããã䜿ãããŠãããŸããã
-## OpenAPI
+## OpenAPI { #openapi }
OpenAPIïŒä»¥åã¯SwaggerãšããŠç¥ãããŠããŸããïŒã¯ãAPIãæ§ç¯ããããã®ãªãŒãã³ãªä»æ§ã§ãïŒçŸåšã¯Linux Foundationã®äžéšã«ãªã£ãŠããŸãïŒã
///
-## **FastAPI** ãŠãŒãã£ãªãã£
+## **FastAPI** ãŠãŒãã£ãªã㣠{ #fastapi-utilities }
FastAPI㯠`fastapi.security` ã¢ãžã¥ãŒã«ã®äžã§ããããã®ã»ãã¥ãªãã£ã¹ããŒã ããšã«ããã€ãã®ããŒã«ãæäŸãããããã®ã»ãã¥ãªãã£ã¡ã«ããºã ãç°¡åã«äœ¿çšã§ããããã«ããŸãã
# ãã¹ã¯ãŒãïŒããã³ããã·ã¥åïŒã«ããOAuth2ãJWTããŒã¯ã³ã«ããBearer { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens }
-ããã§ã»ãã¥ãªãã£ã®æµããå
šãŠããã£ãã®ã§ã<abbr title="JSON Web Tokens">JWT</abbr>ããŒã¯ã³ãšå®å
šãªãã¹ã¯ãŒãã®ããã·ã¥åã䜿çšããŠãå®éã«ã¢ããªã±ãŒã·ã§ã³ãå®å
šã«ããŠã¿ãŸãããã
+ããã§ã»ãã¥ãªãã£ã®æµããå
šãŠããã£ãã®ã§ã<abbr title="JSON Web Tokens - JSON Web Token">JWT</abbr>ããŒã¯ã³ãšå®å
šãªãã¹ã¯ãŒãã®ããã·ã¥åã䜿çšããŠãå®éã«ã¢ããªã±ãŒã·ã§ã³ãå®å
šã«ããŠã¿ãŸãããã
ãã®ã³ãŒãã¯ãã¢ããªã±ãŒã·ã§ã³ã§å®éã«äœ¿çšãããããã¹ã¯ãŒãããã·ã¥ãããŒã¿ããŒã¹ã«ä¿åãããšãã£ãçšéã«å©çšã§ããŸãã
ããã«ããŠãŒã¶ãŒãèªèšŒããŠè¿ã颿°ãäœæããŸãã
-{* ../../docs_src/security/tutorial004_an_py310.py hl[8,49,56:57,60:61,70:76] *}
+{* ../../docs_src/security/tutorial004_an_py310.py hl[8,49,51,58:59,62:63,72:79] *}
+
+`authenticate_user` ãããŒã¿ããŒã¹ã«ååšããªããŠãŒã¶ãŒåã§åŒã³åºãããå Žåã§ãããããŒã®ããã·ã¥ã䜿ã£ãŠ `verify_password` ãå®è¡ããŸãã
+
+ããã«ããããŠãŒã¶ãŒåãæå¹ãã©ããã«é¢ããããšã³ããã€ã³ãã®å¿çæéãããããåãã«ãªããæ¢åã®ãŠãŒã¶ãŒåãåæããããã«æªçšãããããã¿ã€ãã³ã°æ»æãã鲿¢ã§ããŸãã
/// note | åè
æ°ããã¢ã¯ã»ã¹ããŒã¯ã³ãçæãããŠãŒãã£ãªãã£é¢æ°ãäœæããŸãã
-{* ../../docs_src/security/tutorial004_an_py310.py hl[4,7,13:15,29:31,79:87] *}
+{* ../../docs_src/security/tutorial004_an_py310.py hl[4,7,13:15,29:31,82:90] *}
## äŸåé¢ä¿ã®æŽæ° { #update-the-dependencies }
ããŒã¯ã³ãç¡å¹ãªå Žåã¯ãããã«HTTPãšã©ãŒãè¿ããŸãã
-{* ../../docs_src/security/tutorial004_an_py310.py hl[90:107] *}
+{* ../../docs_src/security/tutorial004_an_py310.py hl[93:110] *}
## `/token` *path operation* ã®æŽæ° { #update-the-token-path-operation }
å®éã®JWTã¢ã¯ã»ã¹ããŒã¯ã³ãäœæãããããè¿ããŸãã
-{* ../../docs_src/security/tutorial004_an_py310.py hl[118:133] *}
+{* ../../docs_src/security/tutorial004_an_py310.py hl[121:136] *}
### JWTã®ãsubjectã`sub` ã«ã€ããŠã®æè¡çãªè©³çް { #technical-details-about-the-jwt-subject-sub }
--- /dev/null
+# ãã¹ã¯ãŒããšBearerã«ããã·ã³ãã«ãªOAuth2 { #simple-oauth2-with-password-and-bearer }
+
+åç« ããçºå±ãããŠãå®å
šãªã»ãã¥ãªãã£ãããŒã«å¿
èŠãªäžè¶³éšåã远å ããŠãããŸãã
+
+## `username` ãš `password` ãååŸãã { #get-the-username-and-password }
+
+`username` ãš `password` ãååŸããããã« **FastAPI** ã®ã»ãã¥ãªãã£ãŠãŒãã£ãªãã£ã䜿ããŸãã
+
+OAuth2 ã§ã¯ããpassword flowãïŒããã§äœ¿çšãããããŒïŒã䜿ãå Žåãã¯ã©ã€ã¢ã³ã/ãŠãŒã¶ãŒã¯ãã©ãŒã ããŒã¿ãšã㊠`username` ãš `password` ãã£ãŒã«ããéä¿¡ããå¿
èŠããããŸãã
+
+ãããããã£ãŒã«ãåã¯ãã®éãã§ãªããã°ãªããŸãããã€ãŸãã`user-name` ã `email` ã§ã¯åäœããŸããã
+
+ãã ããããã³ããšã³ãã§æçµãŠãŒã¶ãŒã«ã©ã衚瀺ãããã¯èªç±ã§ãã
+
+ãŸããããŒã¿ããŒã¹ã®ã¢ãã«ã§ã¯ä»»æã®å¥åã䜿ã£ãŠæ§ããŸããã
+
+ãããããã°ã€ã³çšã® path operation ã§ã¯ã仿§ãšã®äºææ§ãä¿ã€ïŒããšãã°çµã¿èŸŒã¿ã®APIããã¥ã¡ã³ãã·ã¹ãã ã䜿ããããã«ããïŒããã«ããããã®ååã䜿ãå¿
èŠããããŸãã
+
+ãŸãã仿§ã§ã¯ `username` ãš `password` ã¯ãã©ãŒã ããŒã¿ãšããŠéããªããã°ãªããªãïŒã€ãŸããããã§ã¯JSONã¯äœ¿ããªãïŒããšãå®ããããŠããŸãã
+
+### `scope` { #scope }
+
+仿§ã§ã¯ãã¯ã©ã€ã¢ã³ãã¯è¿œå ã®ãã©ãŒã ãã£ãŒã«ãã`scope`ããéãããšãã§ãããšãæžãããŠããŸãã
+
+ãã©ãŒã ãã£ãŒã«ãå㯠`scope`ïŒåæ°åœ¢ïŒã§ããã宿
ã¯ã¹ããŒã¹åºåãã®ãã¹ã³ãŒããæååã䞊ã¹ãé·ãæååã§ãã
+
+åãã¹ã³ãŒããã¯ïŒã¹ããŒã¹ãå«ãŸãªãïŒåãªãæååã§ãã
+
+éåžžãç¹å®ã®ã»ãã¥ãªãã£æš©éã宣èšããããã«äœ¿ãããŸããäŸãã°:
+
+- `users:read` ã `users:write` ã¯ããããäŸã§ãã
+- `instagram_basic` 㯠Facebook / Instagram ã§äœ¿ãããŸãã
+- `https://www.googleapis.com/auth/drive` 㯠Google ã§äœ¿ãããŸãã
+
+/// info | æ
å ±
+
+OAuth2 ã«ããããã¹ã³ãŒããã¯ãèŠæ±ãããç¹å®ã®æš©éã衚ãåãªãæååã§ãã
+
+`:` ã®ãããªä»ã®æåãå«ãã§ããŠããURL ã§ãã£ãŠãæ§ããŸããã
+
+ãããã®è©³çްã¯å®è£
äŸåã§ãã
+
+OAuth2 ã«ãšã£ãŠã¯åãªãæååã§ãã
+
+///
+
+## `username` ãš `password` ãååŸããã³ãŒã { #code-to-get-the-username-and-password }
+
+ã§ã¯ããããåŠçããããã« **FastAPI** ãæäŸãããŠãŒãã£ãªãã£ã䜿ããŸãããã
+
+### `OAuth2PasswordRequestForm` { #oauth2passwordrequestform }
+
+ãŸãã`OAuth2PasswordRequestForm` ãã€ã³ããŒããã`/token` ã® path operation ã« `Depends` ã§äŸåé¢ä¿ãšããŠäœ¿ããŸã:
+
+{* ../../docs_src/security/tutorial003_an_py310.py hl[4,78] *}
+
+`OAuth2PasswordRequestForm` ã¯æ¬¡ã®ãã©ãŒã ããã£ã宣èšããã¯ã©ã¹äŸåé¢ä¿ã§ã:
+
+- `username`
+- `password`
+- ã¹ããŒã¹åºåãã®æååã§æ§æãããããªãã·ã§ã³ã® `scope` ãã£ãŒã«ã
+- ãªãã·ã§ã³ã® `grant_type`
+
+/// tip | è±ç¥è
+
+OAuth2 ã®ä»æ§ã§ã¯ãåºå®å€ `password` ãæã€ãã£ãŒã«ã `grant_type` ãå®éã«ã¯å¿
é ã§ããã`OAuth2PasswordRequestForm` ã¯ããã匷å¶ããŸããã
+
+匷å¶ãããå Žåã¯ã`OAuth2PasswordRequestForm` ã®ä»£ããã« `OAuth2PasswordRequestFormStrict` ã䜿ã£ãŠãã ããã
+
+///
+
+- ãªãã·ã§ã³ã® `client_id`ïŒãã®äŸã§ã¯äžèŠïŒ
+- ãªãã·ã§ã³ã® `client_secret`ïŒãã®äŸã§ã¯äžèŠïŒ
+
+/// info | æ
å ±
+
+`OAuth2PasswordRequestForm` ã¯ã`OAuth2PasswordBearer` ã®ããã« **FastAPI** ã«ãšã£ãŠç¹å¥ãªã¯ã©ã¹ã§ã¯ãããŸããã
+
+`OAuth2PasswordBearer` 㯠**FastAPI** ã«ã»ãã¥ãªãã£ã¹ããŒã ã§ããããšãèªèãããŸãããã®ãã OpenAPI ã«ãã®ããã«è¿œå ãããŸãã
+
+äžæ¹ã`OAuth2PasswordRequestForm` ã¯ãããªãèªèº«ã§ãæžãããããªåãªãã¯ã©ã¹äŸåé¢ä¿ã§ãããçŽæ¥ `Form` ãã©ã¡ãŒã¿ã宣èšããããšãã§ããŸãã
+
+ãã ãäžè¬çãªãŠãŒã¹ã±ãŒã¹ãªã®ã§ãç°¡åã«äœ¿ãããã **FastAPI** ãçŽæ¥æäŸããŠããŸãã
+
+///
+
+### ãã©ãŒã ããŒã¿ã®å©çš { #use-the-form-data }
+
+/// tip | è±ç¥è
+
+äŸåé¢ä¿ã¯ã©ã¹ `OAuth2PasswordRequestForm` ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãã¹ããŒã¹åºåãã®é·ãæååãæã€ `scope` 屿§ã¯æã¡ãŸããã代ããã«ãéãããŠããåã¹ã³ãŒãã®å®éã®æååãªã¹ããæ ŒçŽãã `scopes` 屿§ãæã¡ãŸãã
+
+ãã®äŸã§ã¯ `scopes` ã¯äœ¿ããŸããããå¿
èŠãªããã®æ©èœãå©çšã§ããŸãã
+
+///
+
+次ã«ããã©ãŒã ãã£ãŒã«ãã® `username` ã䜿ã£ãŠïŒç䌌ã®ïŒããŒã¿ããŒã¹ãããŠãŒã¶ãŒããŒã¿ãååŸããŸãã
+
+ãã®ãŠãŒã¶ãŒãååšããªãå Žåã¯ããIncorrect username or passwordããšãããšã©ãŒãè¿ããŸãã
+
+ãšã©ãŒã«ã¯ `HTTPException` äŸå€ã䜿ããŸã:
+
+{* ../../docs_src/security/tutorial003_an_py310.py hl[3,79:81] *}
+
+### ãã¹ã¯ãŒãã®ãã§ã㯠{ #check-the-password }
+
+ãã®æç¹ã§ããŒã¿ããŒã¹ãããŠãŒã¶ãŒããŒã¿ã¯ååŸã§ããŸãããããŸã ãã¹ã¯ãŒãã確èªããŠããŸããã
+
+ãŸãããã®ããŒã¿ã Pydantic ã® `UserInDB` ã¢ãã«ã«å
¥ããŸãã
+
+ãã¬ãŒã³ããã¹ãã®ãã¹ã¯ãŒããä¿åããŠã¯ãããªãã®ã§ãïŒç䌌ã®ïŒãã¹ã¯ãŒãããã·ã¥åã·ã¹ãã ã䜿ããŸãã
+
+ãã¹ã¯ãŒããäžèŽããªããã°ãåããšã©ãŒãè¿ããŸãã
+
+#### ãã¹ã¯ãŒãããã·ã¥å { #password-hashing }
+
+ãããã·ã¥åããšã¯ãããå
容ïŒããã§ã¯ãã¹ã¯ãŒãïŒããä¹±éã«èŠãããã€ãåïŒåãªãæååïŒã«å€æããããšãæããŸãã
+
+ãŸã£ããåãå
容ïŒãŸã£ããåããã¹ã¯ãŒãïŒãæž¡ããšãæ¯åãŸã£ããåãä¹±éãªæååãåŸãããŸãã
+
+ãããããã®ä¹±éãªæååããå
ã®ãã¹ã¯ãŒãã«æ»ãããšã¯ã§ããŸããã
+
+##### ãªããã¹ã¯ãŒããããã·ã¥åããã®ã { #why-use-password-hashing }
+
+ããããŒã¿ããŒã¹ãçãŸããŠããçãã åŽãæã«ããã®ã¯ãŠãŒã¶ãŒã®ãã¬ãŒã³ããã¹ãã®ãã¹ã¯ãŒãã§ã¯ãªããããã·ã¥ã ãã§ãã
+
+ãããã£ãŠãçãã åŽã¯åããã¹ã¯ãŒããå¥ã®ã·ã¹ãã ã§è©Šãããšãã§ããŸããïŒå€ãã®ãŠãŒã¶ãŒãããããå Žæã§åããã¹ã¯ãŒãã䜿ã£ãŠãããããããã¯å±éºã«ãªãåŸãŸãïŒã
+
+{* ../../docs_src/security/tutorial003_an_py310.py hl[82:85] *}
+
+#### `**user_dict` ã«ã€ã㊠{ #about-user-dict }
+
+`UserInDB(**user_dict)` ã¯æ¬¡ãæå³ããŸã:
+
+`user_dict` ã®ããŒãšå€ãããã®ãŸãŸããŒã¯ãŒãåŒæ°ãšããŠæž¡ããŸããã€ãŸã次ãšåçã§ã:
+
+```Python
+UserInDB(
+ username = user_dict["username"],
+ email = user_dict["email"],
+ full_name = user_dict["full_name"],
+ disabled = user_dict["disabled"],
+ hashed_password = user_dict["hashed_password"],
+)
+```
+
+/// info | æ
å ±
+
+`**user_dict` ã®ããå®å
šãªè§£èª¬ã¯ã[**远å ã¢ãã«**ã®ããã¥ã¡ã³ã](../extra-models.md#about-user-in-dict){.internal-link target=_blank}ãåç
§ããŠãã ããã
+
+///
+
+## ããŒã¯ã³ãè¿ã { #return-the-token }
+
+`token` ãšã³ããã€ã³ãã®ã¬ã¹ãã³ã¹ã¯ JSON ãªããžã§ã¯ãã§ãªããã°ãªããŸããã
+
+`token_type` ãå«ããå¿
èŠããããŸããããã§ã¯ãBearerãããŒã¯ã³ã䜿ãã®ã§ãããŒã¯ã³ã¿ã€ãã¯ã`bearer`ãã§ãã
+
+ãã㊠`access_token` ãå«ãããã®äžã«ã¢ã¯ã»ã¹ããŒã¯ã³ã®æååãå
¥ããŸãã
+
+ãã®åçŽãªäŸã§ã¯ãå®å
šã«å®å
šã§ã¯ãããŸããããããŒã¯ã³ãšããŠåã `username` ããã®ãŸãŸè¿ããŸãã
+
+/// tip | è±ç¥è
+
+次ã®ç« ã§ã¯ããã¹ã¯ãŒãããã·ã¥åãš <abbr title="JSON Web Tokens - JSON Web Token">JWT</abbr> ããŒã¯ã³ã䜿ã£ãæ¬åœã«å®å
šãªå®è£
ãèŠãŸãã
+
+ãããä»ã¯ãå¿
èŠãªç¹å®ã®è©³çްã«éäžããŸãããã
+
+///
+
+{* ../../docs_src/security/tutorial003_an_py310.py hl[87] *}
+
+/// tip | è±ç¥è
+
+仿§ã«åŸããšããã®äŸãšåãã `access_token` ãš `token_type` ãå«ã JSON ãè¿ãå¿
èŠããããŸãã
+
+ããã¯ããªãèªèº«ã®ã³ãŒãã§å®è£
ããå¿
èŠãããããããã®JSONããŒã䜿ã£ãŠããããšã確èªããŠãã ããã
+
+仿§ã«æºæ ããããã«ãããªãèªèº«ãæ£ããèŠããŠå®è£
ãã¹ãããšã¯ãã»ãŒããã ãã§ãã
+
+ãã以å€ã¯ **FastAPI** ãé¢åãèŠãŠãããŸãã
+
+///
+
+## äŸåé¢ä¿ã®æŽæ° { #update-the-dependencies }
+
+ããã§äŸåé¢ä¿ãæŽæ°ããŸãã
+
+ã¢ã¯ãã£ããªãŠãŒã¶ãŒã®å Žåã«ã®ã¿ `current_user` ãååŸããããšããŸãã
+
+ããã§ã`get_current_user` ãäŸåé¢ä¿ãšããŠå©çšãã远å ã®äŸåé¢ä¿ `get_current_active_user` ãäœæããŸãã
+
+ããã2ã€ã®äŸåé¢ä¿ã¯ããŠãŒã¶ãŒãååšããªãããŸãã¯éã¢ã¯ãã£ãã§ããå Žåã«ãHTTPãšã©ãŒãè¿ãã ãã§ãã
+
+ãããã£ãŠããšã³ããã€ã³ãã§ã¯ããŠãŒã¶ãŒãååšããæ£ããèªèšŒããããã€ã¢ã¯ãã£ãã§ããå Žåã«ã®ã¿ããŠãŒã¶ãŒãååŸããŸã:
+
+{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
+
+/// info | æ
å ±
+
+ããã§è¿ããŠããå€ã `Bearer` ã®è¿œå ããã㌠`WWW-Authenticate` ã仿§ã®äžéšã§ãã
+
+HTTPïŒãšã©ãŒïŒã¹ããŒã¿ã¹ã³ãŒã 401ãUNAUTHORIZEDãã¯ã`WWW-Authenticate` ããããŒãè¿ãããšã«ãªã£ãŠããŸãã
+
+ãã¢ã©ãŒããŒã¯ã³ïŒä»åã®ã±ãŒã¹ïŒã®å Žåããã®ããããŒã®å€ã¯ `Bearer` ã§ããã¹ãã§ãã
+
+å®éã®ãšããããã®è¿œå ããããŒãçç¥ããŠãåäœã¯ããŸãã
+
+ãããã仿§ã«æºæ ããããã«ããã§ã¯ä»äžããŠããŸãã
+
+ãŸããïŒä»ãŸãã¯å°æ¥ïŒãããæ³å®ããŠå©çšããããŒã«ãããããããããããªãããŠãŒã¶ãŒã«ãšã£ãŠæçšã«ãªãå¯èœæ§ããããŸãã
+
+ãããæšæºã®å©ç¹ã§ãâŠã
+
+///
+
+## åäœç¢ºèª { #see-it-in-action }
+
+ã€ã³ã¿ã©ã¯ãã£ãããã¥ã¡ã³ããéããŸã: <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>ã
+
+### èªèšŒ { #authenticate }
+
+ãAuthorizeããã¿ã³ãã¯ãªãã¯ããŸãã
+
+次ã®èªèšŒæ
å ±ã䜿ããŸã:
+
+User: `johndoe`
+
+Password: `secret`
+
+<img src="/img/tutorial/security/image04.png">
+
+ã·ã¹ãã ã§èªèšŒããããšã次ã®ããã«è¡šç€ºãããŸã:
+
+<img src="/img/tutorial/security/image05.png">
+
+### èªåã®ãŠãŒã¶ãŒããŒã¿ãååŸ { #get-your-own-user-data }
+
+`GET` ã® path `/users/me` ã䜿ããŸãã
+
+次ã®ãããªãŠãŒã¶ãŒããŒã¿ãååŸã§ããŸã:
+
+```JSON
+{
+ "username": "johndoe",
+ "email": "johndoe@example.com",
+ "full_name": "John Doe",
+ "disabled": false,
+ "hashed_password": "fakehashedsecret"
+}
+```
+
+<img src="/img/tutorial/security/image06.png">
+
+é åã¢ã€ã³ã³ãã¯ãªãã¯ããŠãã°ã¢ãŠãããåãæäœãå床詊ããšã次ã®ãã㪠HTTP 401 ãšã©ãŒã«ãªããŸã:
+
+```JSON
+{
+ "detail": "Not authenticated"
+}
+```
+
+### éã¢ã¯ãã£ããŠãŒã¶ãŒ { #inactive-user }
+
+ä»åºŠã¯éã¢ã¯ãã£ããªãŠãŒã¶ãŒã§è©ŠããŠã¿ãŸããæ¬¡ã§èªèšŒããŠãã ãã:
+
+User: `alice`
+
+Password: `secret2`
+
+ãã㊠`GET` ã® path `/users/me` ã䜿ããŸãã
+
+次ã®ãããªãInactive userããšã©ãŒã«ãªããŸã:
+
+```JSON
+{
+ "detail": "Inactive user"
+}
+```
+
+## ãŸãšã { #recap }
+
+ããã§ãAPI ã®ããã« `username` ãš `password` ã«åºã¥ãå®å
šãªã»ãã¥ãªãã£ã·ã¹ãã ãå®è£
ããããã®éå
·ãæããŸããã
+
+ãããã®éå
·ã䜿ãã°ãä»»æã®ããŒã¿ããŒã¹ãä»»æã®ãŠãŒã¶ãŒ/ããŒã¿ã¢ãã«ãšäºææ§ã®ããã»ãã¥ãªãã£ã·ã¹ãã ãæ§ç¯ã§ããŸãã
+
+ãã ããå®éã«ã¯ãŸã ãå®å
šãã§ã¯ãããŸããã
+
+次ã®ç« ã§ã¯ãå®å
šãªãã¹ã¯ãŒãããã·ã¥ã©ã€ãã©ãªãš <abbr title="JSON Web Tokens - JSON Web Token">JWT</abbr> ããŒã¯ã³ã®äœ¿ãæ¹ãèŠãŠãããŸãã
--- /dev/null
+# SQLïŒãªã¬ãŒã·ã§ãã«ïŒããŒã¿ããŒã¹ { #sql-relational-databases }
+
+FastAPI 㯠SQLïŒãªã¬ãŒã·ã§ãã«ïŒããŒã¿ããŒã¹ã®äœ¿çšãå¿
é ã«ã¯ããŸãããå¿
èŠã§ããã°ãä»»æã®ããŒã¿ããŒã¹ã䜿çšã§ããŸãã
+
+ããã§ã¯ <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel</a> ã䜿ã£ãäŸãèŠãŠãããŸãã
+
+SQLModel 㯠<a href="https://www.sqlalchemy.org/" class="external-link" target="_blank">SQLAlchemy</a> ãš Pydantic ã®äžã«æ§ç¯ãããŠããŸããFastAPI ãšåãäœè
ã«ãããSQL ããŒã¿ããŒã¹ã䜿ãå¿
èŠããã FastAPI ã¢ããªã«æé©ã«ãªãããã«äœãããŠããŸãã
+
+/// tip | è±ç¥è
+
+ä»ã®ä»»æã® SQL ããã㯠NoSQL ã®ããŒã¿ããŒã¹ã©ã€ãã©ãªïŒå Žåã«ãã£ãŠã¯ <abbr title="Object Relational Mapper - ãªããžã§ã¯ãé¢ä¿ããããŒ: ããã€ãã®ã¯ã©ã¹ã SQL ããŒãã«ã衚ãããã®ã€ã³ã¹ã¿ã³ã¹ããããã®ããŒãã«ã®è¡ã衚ãã©ã€ãã©ãªãæãå°éçšèª">"ORMs"</abbr> ãšåŒã°ããŸãïŒã䜿ãããšãã§ããŸããFastAPI ã¯äœã匷å¶ããŸãããð
+
+///
+
+SQLModel 㯠SQLAlchemy ãããŒã¹ã«ããŠãããããSQLAlchemy ããµããŒãããä»»æã®ããŒã¿ããŒã¹ïŒSQLModel ããããµããŒããããŸãïŒãç°¡åã«äœ¿ããŸããäŸãã°:
+
+* PostgreSQL
+* MySQL
+* SQLite
+* Oracle
+* Microsoft SQL Server ãªã©
+
+ãã®äŸã§ã¯ãåäžãã¡ã€ã«ã§åäœããPython ã«çµ±åãµããŒãããããããSQLite ã䜿ããŸããã€ãŸãããã®äŸããã®ãŸãŸã³ããŒããŠå®è¡ã§ããŸãã
+
+æ¬çªã¢ããªã§ã¯ãPostgreSQL ã®ãããªããŒã¿ããŒã¹ãµãŒããŒã䜿ããããªããããããŸããã
+
+/// tip | è±ç¥è
+
+ããã³ããšã³ãããã®ä»ã®ããŒã«ãå«ããFastAPI ãš PostgreSQL ã®å
¬åŒãããžã§ã¯ããžã§ãã¬ãŒã¿ãŒããããŸã: <a href="https://github.com/fastapi/full-stack-fastapi-template" class="external-link" target="_blank">https://github.com/fastapi/full-stack-fastapi-template</a>
+
+///
+
+ããã¯ãšãŠãã·ã³ãã«ã§çããã¥ãŒããªã¢ã«ã§ããããŒã¿ããŒã¹ã SQLãããé«åºŠãªæ©èœã«ã€ããŠåŠã³ããå Žåã¯ã<a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel ã®ããã¥ã¡ã³ã</a>ãã芧ãã ããã
+
+## `SQLModel` ã®ã€ã³ã¹ããŒã« { #install-sqlmodel }
+
+ãŸã㯠[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank} ãäœæã»æå¹åãã`sqlmodel` ãã€ã³ã¹ããŒã«ããŸã:
+
+<div class="termy">
+
+```console
+$ pip install sqlmodel
+---> 100%
+```
+
+</div>
+
+## åäžã¢ãã«ã§ã¢ããªäœæ { #create-the-app-with-a-single-model }
+
+ãŸãã¯æãç°¡åãªãåäžã® SQLModel ã¢ãã«ã ãã䜿ãããŒãžã§ã³ãäœããŸãã
+
+åŸã§ãäžèšã®ãšããè€æ°ã¢ãã«ã«ããŠã»ãã¥ãªãã£ãšæ±çšæ§ãé«ããŸããð€
+
+### ã¢ãã«ã®äœæ { #create-models }
+
+`SQLModel` ãã€ã³ããŒãããŠããŒã¿ããŒã¹ã¢ãã«ãäœæããŸã:
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[1:11] hl[7:11] *}
+
+`Hero` ã¯ã©ã¹ã¯ Pydantic ã¢ãã«ã«ãã䌌ãŠããŸãïŒå®éã«ã¯å
éšçã« Pydantic ã¢ãã«ã§ããããŸãïŒã
+
+ããã€ãã®éãããããŸã:
+
+* `table=True` 㯠SQLModel ã«å¯ŸããŠãããã¯ããŒãã«ã¢ãã«ã§ãããSQL ããŒã¿ããŒã¹ã®ããŒãã«ã衚ããåãªãããŒã¿ã¢ãã«ïŒéåžžã® Pydantic ã¯ã©ã¹ïŒã§ã¯ãªãããšäŒããŸãã
+
+* `Field(primary_key=True)` 㯠`id` ã SQL ããŒã¿ããŒã¹ã®ãã©ã€ããªããŒã§ããããšã SQLModel ã«äŒããŸãïŒSQL ã®ãã©ã€ããªããŒã«ã€ããŠã¯ SQLModel ããã¥ã¡ã³ããåç
§ããŠãã ããïŒã
+
+ 泚: ãã©ã€ããªããŒã®ãã£ãŒã«ãã«ã¯ `int | None` ã䜿ã£ãŠããŸãããã㯠Python ã³ãŒãå
ã§ `id=None` ã®ããã«ã`id` ãªãã§ãªããžã§ã¯ããäœæãããä¿åæã«ããŒã¿ããŒã¹ãçæããããšãæ³å®ããããã§ããSQLModel ã¯ããŒã¿ããŒã¹ã `id` ãæäŸããããšãçè§£ããã¹ããŒãã§ã¯ãNULL äžå¯ã® `INTEGER` åããå®çŸ©ããŸãã詳现㯠<a href="https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id" class="external-link" target="_blank">SQLModel ã®ãã©ã€ããªããŒã«é¢ããããã¥ã¡ã³ã</a> ãåç
§ããŠãã ããã
+
+* `Field(index=True)` ã¯ããã®åã«å¯Ÿã㊠SQL ã®ã€ã³ããã¯ã¹ãäœæãããã SQLModel ã«æç€ºããŸããããã«ããããã®åã§ãã£ã«ã¿ããŠããŒã¿ãèªãå Žåã«æ€çŽ¢ãé«éã«ãªããŸãã
+
+ `str` ãšå®£èšããããã®ã¯ãSQL ã® `TEXT`ïŒããŒã¿ããŒã¹ã«ãã£ãŠã¯ `VARCHAR`ïŒåã®åã«ãªãããšã SQLModel ã¯çè§£ããŸãã
+
+### Engine ã®äœæ { #create-an-engine }
+
+SQLModel ã® `engine`ïŒå
éšçã«ã¯ SQLAlchemy ã® `engine`ïŒã¯ãããŒã¿ããŒã¹ãžã®æ¥ç¶ãä¿æããŸãã
+
+åãããŒã¿ããŒã¹ã«æ¥ç¶ããããã«ãã³ãŒãå
šäœã§ 1 ã€ã® `engine` ãªããžã§ã¯ããå
±æããŸãã
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[14:18] hl[14:15,17:18] *}
+
+`check_same_thread=False` ã䜿ããšãFastAPI ãç°ãªãã¹ã¬ããã§åã SQLite ããŒã¿ããŒã¹ã䜿ããããã«ãªããŸããããã¯ãäŸåé¢ä¿ãªã©ã«ãã 1 ã€ã®ãªã¯ãšã¹ããè€æ°ã¹ã¬ããã䜿ãå¯èœæ§ããããããå¿
èŠã§ãã
+
+å¿é
ã¯ãããŸããããã®ã³ãŒãã®æ§æã§ã¯ãåŸã§ã1 ãªã¯ãšã¹ãã«ã€ã 1 ã€ã® SQLModel ã»ãã·ã§ã³ãã確å®ã«äœ¿ãããã«ããŸããå®éã`check_same_thread` ã¯ãããå®çŸããããšããŠããŸãã
+
+### ããŒãã«ã®äœæ { #create-the-tables }
+
+`SQLModel.metadata.create_all(engine)` ã䜿ã£ãŠããã¹ãŠã®ããŒãã«ã¢ãã«ã®ããŒãã«ãäœæãã颿°ã远å ããŸãã
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[21:22] hl[21:22] *}
+
+### Session äŸåé¢ä¿ã®äœæ { #create-a-session-dependency }
+
+`Session` ã¯ãã¡ã¢ãªäžã§ãªããžã§ã¯ããä¿æããŠå€æŽã远跡ãã`engine` ã䜿ã£ãŠããŒã¿ããŒã¹ãšéä¿¡ããŸãã
+
+åãªã¯ãšã¹ãããšã«æ°ãã `Session` ãæäŸããã`yield` ã䜿ã£ã FastAPI ã®äŸåé¢ä¿ãäœæããŸããããã«ããã1 ãªã¯ãšã¹ãã«ã€ã 1 ã€ã®ã»ãã·ã§ã³ã䜿ãããšãä¿èšŒãããŸããð€
+
+ç¶ããŠããã®äŸåé¢ä¿ã䜿ãã³ãŒããç°¡æœã«ããããã«ã`Annotated` ã«ããäŸåé¢ä¿ `SessionDep` ãäœæããŸãã
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[25:30] hl[25:27,30] *}
+
+### èµ·åæã«ããŒãã«ãäœæ { #create-database-tables-on-startup }
+
+ã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«ããŒã¿ããŒã¹ã®ããŒãã«ãäœæããŸãã
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[32:37] hl[35:37] *}
+
+ããã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¹ã¿ãŒãã¢ããã€ãã³ãã§ããŒãã«ãäœæããŠããŸãã
+
+æ¬çªã§ã¯ãã¢ããªãèµ·åããåã«ãã€ã°ã¬ãŒã·ã§ã³ã¹ã¯ãªãããå®è¡ããã®ãäžè¬çã§ããããð€
+
+/// tip | è±ç¥è
+
+SQLModel 㯠Alembic ãã©ãããããã€ã°ã¬ãŒã·ã§ã³ãŠãŒãã£ãªãã£ãæäŸäºå®ã§ãããçŸæç¹ã§ã¯ <a href="https://alembic.sqlalchemy.org/en/latest/" class="external-link" target="_blank">Alembic</a> ãçŽæ¥äœ¿ããŸãã
+
+///
+
+### Hero ã®äœæ { #create-a-hero }
+
+å SQLModel ã¢ãã«ã¯ Pydantic ã¢ãã«ã§ããããããPydantic ã¢ãã«ãšåãããã«åã¢ãããŒã·ã§ã³ã§äœ¿ããŸãã
+
+äŸãã°ã`Hero` åã®ãã©ã¡ãŒã¿ã宣èšãããšãJSON ããã£ããèªã¿èŸŒãŸããŸãã
+
+åæ§ã«ã颿°ã®æ»ãå€ã®åãšããŠå®£èšãããšããã®ããŒã¿åœ¢ç¶ãèªå API ããã¥ã¡ã³ãã® UI ã«è¡šç€ºãããŸãã
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[40:45] hl[40:45] *}
+
+ããã§ã¯ `SessionDep` äŸåé¢ä¿ïŒ`Session`ïŒã䜿ã£ãŠãæ°ãã `Hero` ã `Session` ã€ã³ã¹ã¿ã³ã¹ã«è¿œå ããããŒã¿ããŒã¹ã«ã³ããããã`hero` ã®ããŒã¿ããªãã¬ãã·ã¥ããŠããè¿ããŸãã
+
+### Hero ã®ååŸ { #read-heroes }
+
+`select()` ã䜿ã£ãŠããŒã¿ããŒã¹ãã `Hero` ãååŸã§ããŸããçµæã®ããŒãžããŒã·ã§ã³ã®ããã« `limit` ãš `offset` ãå«ããããŸãã
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[48:55] hl[51:52,54] *}
+
+### åäžã® Hero ãååŸ { #read-one-hero }
+
+åäžã® `Hero` ãååŸã§ããŸãã
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[58:63] hl[60] *}
+
+### Hero ã®åé€ { #delete-a-hero }
+
+`Hero` ãåé€ããããšãã§ããŸãã
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[66:73] hl[71] *}
+
+### ã¢ããªã®èµ·å { #run-the-app }
+
+ã¢ããªãèµ·åããŸã:
+
+<div class="termy">
+
+```console
+$ fastapi dev main.py
+
+<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+</div>
+
+ãã®åŸ `/docs` ã® UI ã«ã¢ã¯ã»ã¹ãããšãFastAPI ããããã®ã¢ãã«ã䜿ã£ãŠ API ãããã¥ã¡ã³ãåããåæã«ããŒã¿ã®ã·ãªã¢ã©ã€ãºãšããªããŒã·ã§ã³ã«ã䜿ã£ãŠããããšãããããŸãã
+
+<div class="screenshot">
+<img src="/img/tutorial/sql-databases/image01.png">
+</div>
+
+## è€æ°ã¢ãã«ã§ã¢ããªãæŽæ° { #update-the-app-with-multiple-models }
+
+ããã§ãå°ããªãã¡ã¯ã¿ãªã³ã°ããŠã»ãã¥ãªãã£ãšæ±çšæ§ãé«ããŸãããã
+
+åã®ã¢ããªã§ã¯ãUI äžã§ã¯ã©ã€ã¢ã³ããäœæãã `Hero` ã® `id` ãèªåã§æ±ºããããŠããŸããŸããð±
+
+ããã¯èš±å¯ãã¹ãã§ã¯ãããŸããããã§ã« DB ã§å²ãåœãŠæžã¿ã® `id` ãäžæžããããå¯èœæ§ããããŸãã`id` ã®æ±ºå®ã¯ã¯ã©ã€ã¢ã³ãã§ã¯ãªããããã¯ãšã³ããŸãã¯ããŒã¿ããŒã¹ãè¡ãã¹ãã§ãã
+
+ããã«ã`secret_name` ãäœã£ãŠããŸãããçŸç¶ã§ã¯ãããã©ãã§ãè¿ããŠããŸã£ãŠããŸããããã§ã¯ããŸããã·ãŒã¯ã¬ãããã§ã¯ãããŸãã... ð
+
+ãããããããã€ãã®è¿œå ã¢ãã«ã§ä¿®æ£ããŸããããã§ SQLModel ã®ç䟡ãçºæ®ãããŸããâš
+
+### è€æ°ã¢ãã«ã®äœæ { #create-multiple-models }
+
+SQLModel ã§ã¯ã`table=True` ã®ããã¢ãã«ã¯ã©ã¹ãããŒãã«ã¢ãã«ã§ãã
+
+`table=True` ã®ãªãã¢ãã«ã¯ã©ã¹ã¯ããŒã¿ã¢ãã«ã§ãå®äœã¯ïŒå°ããªæ©èœãããã€ã远å ãããïŒPydantic ã¢ãã«ã§ããð€
+
+SQLModel ã§ã¯ç¶æ¿ã䜿ã£ãŠãããããã±ãŒã¹ã§ãã£ãŒã«ãã®éè€ãé¿ããããŸãã
+
+#### `HeroBase` - ããŒã¹ã¯ã©ã¹ { #herobase-the-base-class }
+
+ãŸãããã¹ãŠã®ã¢ãã«ã§å
±æããããã£ãŒã«ããæã€ `HeroBase` ã¢ãã«ãäœããŸã:
+
+* `name`
+* `age`
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:9] hl[7:9] *}
+
+#### `Hero` - ããŒãã«ã¢ãã« { #hero-the-table-model }
+
+次ã«ãå®éã®ããŒãã«ã¢ãã«ã§ãã `Hero` ãäœããŸããä»ã®ã¢ãã«ã«ã¯åžžã«å«ãŸããªã远å ãã£ãŒã«ããæã¡ãŸã:
+
+* `id`
+* `secret_name`
+
+`Hero` 㯠`HeroBase` ãç¶æ¿ããŠããããã`HeroBase` ã§å®£èšããããã£ãŒã«ããæã¡ãŸããã€ãŸãã`Hero` ã®å
šãã£ãŒã«ãã¯æ¬¡ã®ãšããã§ã:
+
+* `id`
+* `name`
+* `age`
+* `secret_name`
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:14] hl[12:14] *}
+
+#### `HeroPublic` - å
¬éçšããŒã¿ã¢ãã« { #heropublic-the-public-data-model }
+
+次ã«ãAPI ã®ã¯ã©ã€ã¢ã³ãã«è¿ã `HeroPublic` ã¢ãã«ãäœããŸãã
+
+ãã㯠`HeroBase` ãšåããã£ãŒã«ããæã€ããã`secret_name` ã¯å«ã¿ãŸããã
+
+ããã§ããŒããŒã®æ£äœã¯å®ãããŸãïŒð¥·
+
+ãŸãã`id: int` ãå宣èšããŸããããã«ãããAPI ã¯ã©ã€ã¢ã³ããšã®éã§ãåžžã« `id` ãååšãã`int` ã§ããïŒ`None` ã«ã¯ãªããªãïŒããšããå¥çŽãçµã³ãŸãã
+
+/// tip | è±ç¥è
+
+æ»ãå€ã®ã¢ãã«ã§ãå€ãåžžã«ååšãåžžã« `int`ïŒ`None` ã§ã¯ãªãïŒã§ããããšãä¿èšŒãããšãAPI ã¯ã©ã€ã¢ã³ãåŽã®ã³ãŒãã¯ã¯ããã«ã·ã³ãã«ã«æžããŸãã
+
+å ããŠãèªåçæã¯ã©ã€ã¢ã³ãã®ã€ã³ã¿ãŒãã§ãŒã¹ãç°¡æœã«ãªããããªãã® API ãšããåãããéçºè
äœéšãåäžããŸããð
+
+///
+
+`HeroPublic` ã®ãã£ãŒã«ã㯠`HeroBase` ãšåãã§ã`id` 㯠`int`ïŒ`None` ã§ã¯ãªãïŒãšããŠå®£èšãããŸã:
+
+* `id`
+* `name`
+* `age`
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:18] hl[17:18] *}
+
+#### `HeroCreate` - äœæçšããŒã¿ã¢ãã« { #herocreate-the-data-model-to-create-a-hero }
+
+次ã«ãã¯ã©ã€ã¢ã³ãããã®ããŒã¿ãããªããŒããã `HeroCreate` ã¢ãã«ãäœããŸãã
+
+ãã㯠`HeroBase` ãšåããã£ãŒã«ãã«å ãã`secret_name` ãæã¡ãŸãã
+
+ããã§ãã¯ã©ã€ã¢ã³ããæ°ããããŒããŒãäœæããéã« `secret_name` ãéä¿¡ããããŒã¿ããŒã¹ã«ä¿åãããŸããããã®ã·ãŒã¯ã¬ããå㯠API ã§ã¯ã¯ã©ã€ã¢ã³ãã«è¿ãããŸããã
+
+/// tip | è±ç¥è
+
+ããã¯ãã¹ã¯ãŒããæ±ãéã®æ¹æ³ãšåãã§ããåãåããŸãããAPI ã§ã¯è¿ããŸããã
+
+ãŸããä¿ååã«ãã¹ã¯ãŒãã®å€ã¯ããã·ã¥åããå¹³æã®ãŸãŸä¿åããªãã§ãã ããã
+
+///
+
+`HeroCreate` ã®ãã£ãŒã«ã:
+
+* `name`
+* `age`
+* `secret_name`
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:22] hl[21:22] *}
+
+#### `HeroUpdate` - æŽæ°çšããŒã¿ã¢ãã« { #heroupdate-the-data-model-to-update-a-hero }
+
+åã®ããŒãžã§ã³ã®ã¢ããªã«ã¯ããŒããŒãæŽæ°ããæ¹æ³ããããŸããã§ããããè€æ°ã¢ãã«ã䜿ãã°å¯èœã§ããð
+
+`HeroUpdate` ããŒã¿ã¢ãã«ã¯å°ãç¹æ®ã§ãæ°ããããŒããŒãäœæããã®ã«å¿
èŠãªãã£ãŒã«ããšåããã£ãŒã«ãããã¹ãŠæã¡ãŸããããã¹ãŠã®ãã£ãŒã«ãããªãã·ã§ãã«ïŒããã©ã«ãå€ãæã€ïŒã§ããããã«ãããæŽæ°æã«ã¯å€æŽããããã£ãŒã«ãã ããéããŸãã
+
+ãã¹ãŠã®ãã£ãŒã«ãã®åãå®è³ªçã«å€ããïŒ`None` ãå«ã¿ãããã©ã«ãå€ã `None` ã«ãªãïŒããããã£ãŒã«ãã¯å宣èšããå¿
èŠããããŸãã
+
+ãã¹ãŠã®ãã£ãŒã«ããå宣èšããã®ã§ãå³å¯ã«ã¯ `HeroBase` ãç¶æ¿ããå¿
èŠã¯ãããŸãããäžè²«æ§ã®ããã«ããã§ã¯ç¶æ¿ããŠããŸãããå¿
é ã§ã¯ãããŸããã奜ã¿ã®åé¡ã§ããð€·
+
+`HeroUpdate` ã®ãã£ãŒã«ã:
+
+* `name`
+* `age`
+* `secret_name`
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:28] hl[25:28] *}
+
+### `HeroCreate` ã§äœæã `HeroPublic` ãè¿ã { #create-with-herocreate-and-return-a-heropublic }
+
+è€æ°ã¢ãã«ãçšæã§ããã®ã§ããããã䜿ãããã«ã¢ããªã®éšåãæŽæ°ããŸãã
+
+ãªã¯ãšã¹ãã§ã¯ `HeroCreate` ããŒã¿ã¢ãã«ãåãåãããããã `Hero` ããŒãã«ã¢ãã«ãäœæããŸãã
+
+ãã®æ°ããããŒãã«ã¢ãã« `Hero` ã¯ãã¯ã©ã€ã¢ã³ãããéããããã£ãŒã«ããæã¡ãããŒã¿ããŒã¹ã«ãã£ãŠçæããã `id` ãæã¡ãŸãã
+
+颿°ããã¯ãã®ããŒãã«ã¢ãã« `Hero` ããã®ãŸãŸè¿ããŸããããã `response_model` ã« `HeroPublic` ããŒã¿ã¢ãã«ãæå®ããŠãããããFastAPI ã `HeroPublic` ã䜿ã£ãŠããŒã¿ãããªããŒãã»ã·ãªã¢ã©ã€ãºããŸãã
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[56:62] hl[56:58] *}
+
+/// tip | è±ç¥è
+
+ä»åã¯è¿åŽå€ã®åã¢ãããŒã·ã§ã³ `-> HeroPublic` ã®ä»£ããã« `response_model=HeroPublic` ã䜿ããŸããè¿ããŠããå€ã¯å®éã«ã¯ `HeroPublic` ã§ã¯ãªãããã§ãã
+
+ãã `-> HeroPublic` ãšå®£èšãããšããšãã£ã¿ã Linter ã¯ïŒæ£ããïŒã`HeroPublic` ã§ã¯ãªã `Hero` ãè¿ããŠããããšèŠåããŸãã
+
+`response_model` ã«æå®ããããšã§ãåã¢ãããŒã·ã§ã³ããšãã£ã¿çã®è£å©ã厩ããã«ãFastAPI ã«ã·ãªã¢ã©ã€ãºã®ä»äºãä»»ããããŸãã
+
+///
+
+### `HeroPublic` ã§ Hero ãååŸ { #read-heroes-with-heropublic }
+
+åãšåæ§ã« `Hero` ãååŸã§ããŸããåã³ `response_model=list[HeroPublic]` ã䜿ã£ãŠãããŒã¿ãæ£ããããªããŒãã»ã·ãªã¢ã©ã€ãºãããããšãä¿èšŒããŸãã
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[65:72] hl[65] *}
+
+### `HeroPublic` ã§åäžã® Hero ãååŸ { #read-one-hero-with-heropublic }
+
+åäžã®ããŒããŒãååŸããŸã:
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[75:80] hl[77] *}
+
+### `HeroUpdate` ã§ Hero ãæŽæ° { #update-a-hero-with-heroupdate }
+
+ããŒããŒãæŽæ°ã§ããŸããããã§ã¯ HTTP ã® `PATCH` ã䜿ããŸãã
+
+ã³ãŒãã§ã¯ãã¯ã©ã€ã¢ã³ããéã£ãããŒã¿ã®ã¿ïŒããã©ã«ãå€ãšããŠå
¥ã£ãŠããå€ã¯é€å€ïŒãæã€ `dict` ãååŸããŸããããã«ã¯ `exclude_unset=True` ã䜿ããŸãããããäž»ãªã³ãã§ããðª
+
+ãã®åŸã`hero_db.sqlmodel_update(hero_data)` ã䜿ã£ãŠã`hero_db` ã `hero_data` ã®å
å®¹ã§æŽæ°ããŸãã
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[83:93] hl[83:84,88:89] *}
+
+### å床 Hero ãåé€ { #delete-a-hero-again }
+
+ããŒããŒã®åé€ã¯ã»ãšãã©å€ãããŸããã
+
+ããã¯ãªãã¡ã¯ã¿ãªã³ã°æ¬²æ±ãæºãããªããŸãŸã«ããŠãããŸããð
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[96:103] hl[101] *}
+
+### ã¢ããªã®åèµ·å { #run-the-app-again }
+
+ã¢ããªãå床起åããŸã:
+
+<div class="termy">
+
+```console
+$ fastapi dev main.py
+
+<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+</div>
+
+`/docs` ã® API UI ã«è¡ããšãå
å®¹ãæŽæ°ãããŠãããããŒããŒäœææã«ã¯ã©ã€ã¢ã³ããã `id` ãåãåãããšã¯æåŸ
ãããŠããªãããªã©ã確èªã§ããŸãã
+
+<div class="screenshot">
+<img src="/img/tutorial/sql-databases/image02.png">
+</div>
+
+## ãŸãšã { #recap }
+
+<a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel</a> ã䜿ã£ãŠ SQL ããŒã¿ããŒã¹ãšããåãããããŒã¿ã¢ãã«ãšããŒãã«ã¢ãã«ã§ã³ãŒããç°¡æœã«ã§ããŸãã
+
+ããã«å€ããåŠã¶ã«ã¯ SQLModel ã®ããã¥ã¡ã³ããã芧ãã ããã<a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/" class="external-link" target="_blank">FastAPI ãš SQLModel ã䜿ããã¥ãŒããªã¢ã«</a> ããããŸããð
* `StaticFiles` ãã€ã³ããŒãã
* `StaticFiles()` ã€ã³ã¹ã¿ã³ã¹ãç¹å®ã®ãã¹ã«ãããŠã³ããã
-{* ../../docs_src/static_files/tutorial001_py39.py hl[2,6] *}
+{* ../../docs_src/static_files/tutorial001_py310.py hl[2,6] *}
/// note | æè¡è©³çް
ãã§ãã¯ããã Python ã®æšæºçãªåŒãšå
±ã«ãã·ã³ãã«ã« `assert` æãèšè¿°ããŸã (ããã `pytest` ã®æšæºã§ã)ã
-{* ../../docs_src/app_testing/tutorial001_py39.py hl[2,12,15:18] *}
+{* ../../docs_src/app_testing/tutorial001_py310.py hl[2,12,15:18] *}
/// tip | è±ç¥è
ãã¡ã€ã« `main.py` ã« **FastAPI** ã¢ããªããããŸã:
-{* ../../docs_src/app_testing/app_a_py39/main.py *}
+{* ../../docs_src/app_testing/app_a_py310/main.py *}
### ãã¹ããã¡ã€ã« { #testing-file }
ãã®ãã¡ã€ã«ã¯åãããã±ãŒãžå
ã«ãããããçžå¯Ÿã€ã³ããŒãã䜿ã£ãŠ `main` ã¢ãžã¥ãŒã« (`main.py`) ãããªããžã§ã¯ã `app` ãã€ã³ããŒãã§ããŸã:
-{* ../../docs_src/app_testing/app_a_py39/test_main.py hl[3] *}
+{* ../../docs_src/app_testing/app_a_py310/test_main.py hl[3] *}
...ãããŠããããŸã§ãšåãããã«ãã¹ãã³ãŒããæžããŸãã
## ä»®æ³ç°å¢ã®äœæ { #create-a-virtual-environment }
-Pythonãããžã§ã¯ãã§ã®**åããŠã®**äœæ¥ãéå§ããéã«ã¯ã**<abbr title="there are other options, this is a simple guideline â ä»ã®éžæè¢ããããŸãããããã¯ã·ã³ãã«ãªã¬ã€ãã©ã€ã³ã§ã">ãããžã§ã¯ãå
</abbr>**ã«ä»®æ³ç°å¢ãäœæããŠãã ããã
+Pythonãããžã§ã¯ãã§ã®**åããŠã®**äœæ¥ãéå§ããéã«ã¯ã**<dfn title="ä»ã®éžæè¢ããããŸãããããã¯ã·ã³ãã«ãªã¬ã€ãã©ã€ã³ã§ã">ãããžã§ã¯ãå
</dfn>**ã«ä»®æ³ç°å¢ãäœæããŠãã ããã
/// tip | è±ç¥è
**æ°ããããã±ãŒãž**ãä»®æ³ç°å¢ã«ã€ã³ã¹ããŒã«ãããã³ã«ãç°å¢ãããäžåºŠ**æå¹å**ããŠãã ããã
-ããããããšã§ããã®ããã±ãŒãžãã€ã³ã¹ããŒã«ãã**ã¿ãŒããã«ïŒ<abbr title="command line interface">CLI</abbr>ïŒããã°ã©ã **ã䜿çšããå Žåã«ãä»®æ³ç°å¢å
ã®ãã®ã確å®ã«äœ¿ãããã°ããŒãã«ç°å¢ã«ã€ã³ã¹ããŒã«ãããŠããå¥ã®ãã®ïŒããããå¿
èŠãªãã®ãšã¯ç°ãªãããŒãžã§ã³ïŒã誀ã£ãŠäœ¿çšããããšãé²ããŸãã
+ããããããšã§ããã®ããã±ãŒãžãã€ã³ã¹ããŒã«ãã**ã¿ãŒããã«ïŒ<abbr title="command line interface - ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ãŒã¹">CLI</abbr>ïŒããã°ã©ã **ã䜿çšããå Žåã«ãä»®æ³ç°å¢å
ã®ãã®ã確å®ã«äœ¿ãããã°ããŒãã«ç°å¢ã«ã€ã³ã¹ããŒã«ãããŠããå¥ã®ãã®ïŒããããå¿
èŠãªãã®ãšã¯ç°ãªãããŒãžã§ã³ïŒã誀ã£ãŠäœ¿çšããããšãé²ããŸãã
///