* 翻蚳ãåé¡ãªãã確èªããŸãã
* å¿
èŠã§ããã°ãèšèªåºæããã³ãããgeneral ããã³ããããŸãã¯è±èªããã¥ã¡ã³ããæ¹åããŸãã
* ãã®åŸãç¿»èš³ã«æ®ã£ãŠããåé¡ãæåã§ä¿®æ£ããè¯ã翻蚳ã«ããŸãã
-* è¯ã翻蚳ãçšæããç¶æ
ã§ããäžåºŠç¿»èš³ããŸããçæ³çãªçµæã¯ãLLM ã翻蚳ã«äžå倿Žãå ããªãããšã§ããã€ãŸã general ããã³ãããšèšèªåºæããã³ãããæè¯ã§ããããšãæå³ããŸãïŒæã
ããã€ãã©ã³ãã ã«èŠãã倿Žãè¡ãããšããããŸããçç±ã¯ <a href="https://doublespeak.chat/#/handbook#deterministic-output" class="external-link" target="_blank">LLM ã¯æ±ºå®è«çã¢ã«ãŽãªãºã ã§ã¯ãªã</a> ããã§ãïŒã
+* è¯ã翻蚳ãçšæããç¶æ
ã§ããäžåºŠç¿»èš³ããŸããçæ³çãªçµæã¯ãLLM ã翻蚳ã«äžå倿Žãå ããªãããšã§ããã€ãŸã general ããã³ãããšèšèªåºæããã³ãããæè¯ã§ããããšãæå³ããŸãïŒæã
ããã€ãã©ã³ãã ã«èŠãã倿Žãè¡ãããšããããŸããçç±ã¯ [LLM ã¯æ±ºå®è«çã¢ã«ãŽãªãºã ã§ã¯ãªã](https://doublespeak.chat/#/handbook#deterministic-output) ããã§ãïŒã
ãã¹ãå
容:
...ããã«å¥ã®ã³ã³ãœãŒã«ã®ã³ãŒãäŸã§ã...
```console
-// ãã£ã¬ã¯ã㪠"code" ãäœæ
+// ãã£ã¬ã¯ã㪠"Code" ãäœæ
$ mkdir code
// ãã®ãã£ã¬ã¯ããªã«ç§»å
$ cd code
ãªã³ã¯ã®ããã¹ãã¯ç¿»èš³ãããªã³ã¯å
ã®ã¢ãã¬ã¹ã¯å€æŽããªãã§ãã ãã:
* [äžã®èŠåºããžã®ãªã³ã¯](#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>
+* [å
éšãªã³ã¯](index.md#installation)
+* [å€éšãªã³ã¯](https://sqlmodel.tiangolo.com/)
+* [ã¹ã¿ã€ã«ãžã®ãªã³ã¯](https://fastapi.tiangolo.com/css/styles.css)
+* [ã¹ã¯ãªãããžã®ãªã³ã¯](https://fastapi.tiangolo.com/js/logic.js)
+* [ç»åãžã®ãªã³ã¯](https://fastapi.tiangolo.com/img/foo.jpg)
ãªã³ã¯ã®ããã¹ãã¯ç¿»èš³ãããªã³ã¯å
ã®ã¢ãã¬ã¹ã¯ç¿»èš³çãæãããã«ããŠãã ãã:
-* <a href="https://fastapi.tiangolo.com/ja/" class="external-link" target="_blank">FastAPI ãªã³ã¯</a>
+* [FastAPI ãªã³ã¯](https://fastapi.tiangolo.com/ja/)
////
ã¬ã¹ãã³ã¹ã«æ£ç¢ºã«äœãå«ãããããã¯ã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` ãªã©ã
+- [OpenAPI ã® Responses Object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responses-object)ãããã«ã¯ `Response Object` ãå«ãŸããŸãã
+- [OpenAPI ã® Response Object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#response-object)ã`responses` ãã©ã¡ãŒã¿å
ã®åã¬ã¹ãã³ã¹ã«ãããã§å®çŸ©ãããŠããèŠçŽ ãçŽæ¥å«ããããŸãã`description`ã`headers`ã`content`ïŒããã§ç°ãªãã¡ãã£ã¢ã¿ã€ãã JSON Schema ã宣èšããŸãïŒã`links` ãªã©ã
远å ã®ã¹ããŒã¿ã¹ã³ãŒããšã¬ã¹ãã³ã¹ãçŽæ¥è¿ãå Žåãããã㯠OpenAPI ã¹ããŒãïŒAPI ããã¥ã¡ã³ãïŒã«ã¯å«ãŸããŸãããFastAPI ã«ã¯ãäºåã«äœãè¿ãããããç¥ãæ¹æ³ããªãããã§ãã
-ãããã[远å ã®ã¬ã¹ãã³ã¹](additional-responses.md){.internal-link target=_blank} ã䜿ã£ãŠã³ãŒãå
ã«ããã¥ã¡ã³ãåã§ããŸãã
+ãããã[远å ã®ã¬ã¹ãã³ã¹](additional-responses.md) ã䜿ã£ãŠã³ãŒãå
ã«ããã¥ã¡ã³ãåã§ããŸãã
ãã®ããã«ãããšãã»ãã·ã§ã³ã¯ããŒã¿ããŒã¹æ¥ç¶ãè§£æŸãããããä»ã®ãªã¯ãšã¹ããããã䜿ããããã«ãªããŸãã
-`yield` ãæã€äŸåé¢ä¿ã§æ©æçµäºãå¿
èŠãªå¥ã®ãŠãŒã¹ã±ãŒã¹ãããå Žåã¯ãããªãã®å
·äœçãªãŠãŒã¹ã±ãŒã¹ãšããªã `yield` ãæã€äŸåé¢ä¿ã®æ©æã¯ããŒãºãæçãã説æããŠã<a href="https://github.com/fastapi/fastapi/discussions/new?category=questions" class="external-link" target="_blank">GitHub Discussion ã®è³ªå</a>ãäœæããŠãã ããã
+`yield` ãæã€äŸåé¢ä¿ã§æ©æçµäºãå¿
èŠãªå¥ã®ãŠãŒã¹ã±ãŒã¹ãããå Žåã¯ãããªãã®å
·äœçãªãŠãŒã¹ã±ãŒã¹ãšããªã `yield` ãæã€äŸåé¢ä¿ã®æ©æã¯ããŒãºãæçãã説æããŠã[GitHub Discussion ã®è³ªå](https://github.com/fastapi/fastapi/discussions/new?category=questions)ãäœæããŠãã ããã
`yield` ãæã€äŸåé¢ä¿ã®æ©æã¯ããŒãºã«çŽåŸã§ãããŠãŒã¹ã±ãŒã¹ãããå Žåã¯ãæ©æã¯ããŒãºã«ãªããã€ã³ããæ°ããæ¹æ³ã远å ããããšãæ€èšããŸãã
### ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ãš `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} ã¯ãã§ã«å®è¡æžã¿ã§ããã
+FastAPI 0.106.0 ããåã§ã¯ã`yield` ã®åŸã§äŸå€ãéåºããããšã¯ã§ããŸããã§ããã`yield` ãæã€äŸåé¢ä¿ã®çµäºã³ãŒãã¯ã¬ã¹ãã³ã¹éä¿¡ãåŸãã«å®è¡ãããããã[äŸå€ãã³ãã©](../tutorial/handling-errors.md#install-custom-exception-handlers)ã¯ãã§ã«å®è¡æžã¿ã§ããã
ããã¯äž»ã«ãäŸåé¢ä¿ã "yield" ããåããªããžã§ã¯ããããã¯ã°ã©ãŠã³ãã¿ã¹ã¯å
ã§å©çšã§ããããã«ããããã®èšèšã§ãããçµäºã³ãŒãã¯ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯å®äºåŸã«å®è¡ãããããã§ãã
`TestClient` ã¯ãæšæºã® pytest ã䜿ã£ãŠéåžžã® `def` ã®ãã¹ã颿°ããéåæã® FastAPI ã¢ããªãåŒã³åºãããã®ãããŸããªãããå
éšã§è¡ããŸãããããããã®ãããŸããªããã¯ãã¹ã颿°èªäœãéåæã®å Žåã«ã¯æ©èœããŸããããã¹ããéåæã§å®è¡ãããšããã¹ã颿°å
ã§ `TestClient` ã¯äœ¿ããªããªããŸãã
-`TestClient` 㯠<a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a> ãåºã«äœãããŠããã幞ããªããšã« API ã®ãã¹ãã«ã¯ HTTPX ãçŽæ¥å©çšã§ããŸãã
+`TestClient` 㯠[HTTPX](https://www.python-httpx.org) ãåºã«äœãããŠããã幞ããªããšã« API ã®ãã¹ãã«ã¯ HTTPX ãçŽæ¥å©çšã§ããŸãã
## äŸ { #example }
-ç°¡åãªäŸãšããŠã[倧ããªã¢ããªã±ãŒã·ã§ã³](../tutorial/bigger-applications.md){.internal-link target=_blank} ãš [ãã¹ã](../tutorial/testing.md){.internal-link target=_blank} ã§èª¬æãããã®ã«äŒŒããã¡ã€ã«æ§æãèããŸã:
+ç°¡åãªäŸãšããŠã[倧ããªã¢ããªã±ãŒã·ã§ã³](../tutorial/bigger-applications.md) ãš [ãã¹ã](../tutorial/testing.md) ã§èª¬æãããã®ã«äŒŒããã¡ã€ã«æ§æãèããŸã:
```
.
/// tip | è±ç¥è
-`TestClient` ã䜿ã£ãŠãããšããšç°ãªãããã¹ã颿°ã¯ `def` ã§ã¯ãªã `async def` ã«ãªã£ãŠããç¹ã«æ³šæããŠãã ããã
+`TestClient` ã䜿ã£ãŠãããšããšç°ãªãããã¹ã颿°ã¯ `async def` ã§ã¯ãªã `def` ã«ãªã£ãŠããç¹ã«æ³šæããŠãã ããã
///
/// warning | 泚æ
-ã¢ããªã±ãŒã·ã§ã³ã lifespan ã€ãã³ãã«äŸåããŠããå Žåã`AsyncClient` ã¯ãããã®ã€ãã³ããããªã¬ãŒããŸããã確å®ã«ããªã¬ãŒããã«ã¯ã<a href="https://github.com/florimondmanca/asgi-lifespan#usage" class="external-link" target="_blank">florimondmanca/asgi-lifespan</a> ã® `LifespanManager` ã䜿çšããŠãã ããã
+ã¢ããªã±ãŒã·ã§ã³ã lifespan ã€ãã³ãã«äŸåããŠããå Žåã`AsyncClient` ã¯ãããã®ã€ãã³ããããªã¬ãŒããŸããã確å®ã«ããªã¬ãŒããã«ã¯ã[florimondmanca/asgi-lifespan](https://github.com/florimondmanca/asgi-lifespan#usage) ã® `LifespanManager` ã䜿çšããŠãã ããã
///
/// 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")` ã³ãŒã«ããã¯å
ã§è¡ããŸãã
+ãã¹ãã«éåæé¢æ°åŒã³åºããçµ±åããéã«ïŒäŸ: [MongoDB ã® MotorClient](https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop) äœ¿çšæïŒã`RuntimeError: Task attached to a different loop` ã«ééããå Žåã¯ãã€ãã³ãã«ãŒããå¿
èŠãšãããªããžã§ã¯ãã¯éåæé¢æ°å
ã§ã®ã¿ã€ã³ã¹ã¿ã³ã¹åããããã«ããŠãã ãããäŸãã° `@app.on_event("startup")` ã³ãŒã«ããã¯å
ã§è¡ããŸãã
///
ãããã·ã®ããããŒã¯æ¬¡ã®ãšããã§ã:
-* <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>
+* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For)
+* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto)
+* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host)
///
/// tip | è±ç¥è
-HTTPS ã«ã€ããŠè©³ããç¥ãããå Žåã¯ã[HTTPS ã«ã€ããŠ](../deployment/https.md){.internal-link target=_blank} ãåç
§ããŠãã ããã
+HTTPS ã«ã€ããŠè©³ããç¥ãããå Žåã¯ã[HTTPS ã«ã€ããŠ](../deployment/https.md) ãåç
§ããŠãã ããã
///
ãµãŒããŒïŒ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> ã«ã¢ã¯ã»ã¹ãããšãéåžžã©ããã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸã:
+ãããããã©ãŠã¶ã§ [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app) ã«ã¢ã¯ã»ã¹ãããšãéåžžã©ããã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸã:
```JSON
{
## Traefik ã䜿ã£ãããŒã«ã«æ€èšŒ { #testing-locally-with-traefik }
-<a href="https://docs.traefik.io/" class="external-link" target="_blank">Traefik</a> ã䜿ãã°ããã¹ãã¬ãã£ãã¯ã¹ãåé€ããæ§æãããŒã«ã«ã§ç°¡åã«è©ŠããŸãã
+[Traefik](https://docs.traefik.io/) ã䜿ãã°ããã¹ãã¬ãã£ãã¯ã¹ãåé€ããæ§æãããŒã«ã«ã§ç°¡åã«è©ŠããŸãã
-<a href="https://github.com/containous/traefik/releases" class="external-link" target="_blank">Traefik ãããŠã³ããŒã</a> ããŠãã ãããåäžãã€ããªãªã®ã§ãå§çž®ãã¡ã€ã«ãå±éããŠç«¯æ«ããçŽæ¥å®è¡ã§ããŸãã
+[Traefik ãããŠã³ããŒã](https://github.com/containous/traefik/releases) ããŠãã ãããåäžãã€ããªãªã®ã§ãå§çž®ãã¡ã€ã«ãå±éããŠç«¯æ«ããçŽæ¥å®è¡ã§ããŸãã
次ã®å
容㧠`traefik.toml` ãšãããã¡ã€ã«ãäœæããŸã:
### ã¬ã¹ãã³ã¹ã®ç¢ºèª { #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> ã«ã¢ã¯ã»ã¹ãããšãéåžžã©ããã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸã:
+ããã§ãUvicorn ã®ããŒãã® URL [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app) ã«ã¢ã¯ã»ã¹ãããšãéåžžã©ããã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸã:
```JSON
{
///
-次ã«ã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> ãéããŸãã
+次ã«ãTraefik ã®ããŒãã§ãã¬ãã£ãã¯ã¹ä»ãã® URL [http://127.0.0.1:9999/api/v1/app](http://127.0.0.1:9999/api/v1/app) ãéããŸãã
åãã¬ã¹ãã³ã¹ãåŸãããŸã:
ãå
¬åŒãªãã¢ã¯ã»ã¹æ¹æ³ã¯ãå®çŸ©ãããã¹ãã¬ãã£ãã¯ã¹ä»ãã®ãããã·çµç±ã§ãããããã£ãŠæ³å®ã©ããããã¬ãã£ãã¯ã¹ãªãã® 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> ã確èªããŠãã ãã:
+[http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) ã確èªããŠãã ãã:
<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> ã確èªããŠãã ãã:
+[http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs) ã確èªããŠãã ãã:
<img src="/img/tutorial/behind-a-proxy/image02.png">
///
-ããã¥ã¡ã³ã 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>ïŒã§ã¯æ¬¡ã®ããã«è¡šç€ºãããŸã:
+ããã¥ã¡ã³ã UIïŒ[http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs)ïŒã§ã¯æ¬¡ã®ããã«è¡šç€ºãããŸã:
<img src="/img/tutorial/behind-a-proxy/image03.png">
## ãµãã¢ããªã±ãŒã·ã§ã³ã®ããŠã³ã { #mounting-a-sub-application }
-`root_path` ã䌎ããããã·ã䜿çšãã€ã€ãµãã¢ããªã±ãŒã·ã§ã³ãããŠã³ãããå¿
èŠãããå Žåã§ãïŒ[ãµãã¢ããªã±ãŒã·ã§ã³ - ããŠã³ã](sub-applications.md){.internal-link target=_blank} åç
§ïŒãéåžžã©ããã«è¡ããŸãã
+`root_path` ã䌎ããããã·ã䜿çšãã€ã€ãµãã¢ããªã±ãŒã·ã§ã³ãããŠã³ãããå¿
èŠãããå Žåã§ãïŒ[ãµãã¢ããªã±ãŒã·ã§ã³ - ããŠã³ã](sub-applications.md) åç
§ïŒãéåžžã©ããã«è¡ããŸãã
FastAPI ã¯å
éšã§ `root_path` ãé©åã«æ±ãããããã®ãŸãŸåäœããŸããâš
-# ã«ã¹ã¿ã ã¬ã¹ãã³ã¹ - HTMLãã¹ããªãŒã ããã¡ã€ã«ããã®ä»ã®ã¬ã¹ãã³ã¹ { #custom-response-html-stream-file-others }
+# ã«ã¹ã¿ã ã¬ã¹ãã³ã¹ - HTMLãã¹ããªãŒã ããã¡ã€ã«ããã®ä» { #custom-response-html-stream-file-others }
-ããã©ã«ãã§ã¯ã**FastAPI** 㯠`JSONResponse` ã䜿ã£ãŠã¬ã¹ãã³ã¹ãè¿ããŸãã
+ããã©ã«ãã§ã¯ã**FastAPI** ã¯JSONã¬ã¹ãã³ã¹ãè¿ããŸãã
-[ã¬ã¹ãã³ã¹ãçŽæ¥è¿ã](response-directly.md){.internal-link target=_blank}ã§èŠãããã«ã `Response` ãçŽæ¥è¿ãããšã§ãã®æåããªãŒããŒã©ã€ãã§ããŸãã
+[ã¬ã¹ãã³ã¹ãçŽæ¥è¿ã](response-directly.md)ã§èŠãããã«ã`Response` ãçŽæ¥è¿ããŠãã®æåãäžæžãã§ããŸãã
-ãããã`Response` ãçŽæ¥è¿ããšïŒãŸã㯠`JSONResponse` ã®ãããªä»»æã®ãµãã¯ã©ã¹ãè¿ããšïŒãããŒã¿ã¯èªåçã«å€æãããïŒ`response_model` ã宣èšããŠããŠãïŒãããã¥ã¡ã³ããèªåçæãããŸããïŒäŸãã°ãçæãããOpenAPIã®äžéšãšããŠHTTPããã㌠`Content-Type` ã«ç¹å®ã®ãã¡ãã£ã¢ã¿ã€ãããå«ãããªã©ïŒã
+ãããã`Response`ïŒãŸã㯠`JSONResponse` ã®ãããªä»»æã®ãµãã¯ã©ã¹ïŒãçŽæ¥è¿ãå ŽåãïŒ`response_model` ã宣èšããŠããŠãïŒããŒã¿ã¯èªåçã«å€æããããããã¥ã¡ã³ããèªåçæãããŸããïŒäŸãã°ãçæãããOpenAPIã®äžéšãšããŠHTTPããã㌠`Content-Type` ã«ç¹å®ã®ãã¡ãã£ã¢ã¿ã€ãããå«ãããªã©ïŒã
-`response_class` ãã©ã¡ãŒã¿ã䜿çšããŠã*path operation ãã³ã¬ãŒã¿* ã§äœ¿çšããã `Response`ïŒä»»æã® `Response` ãµãã¯ã©ã¹ïŒã宣èšããããšãã§ããŸãã
+äžæ¹ã§ã*path operation ãã³ã¬ãŒã¿* ã® `response_class` ãã©ã¡ãŒã¿ã䜿ã£ãŠã䜿çšããã `Response`ïŒ`Response` ã®ä»»æã®ãµãã¯ã©ã¹ïŒã宣èšããããšãã§ããŸãã
-*path operation 颿°* ããè¿ãããã³ã³ãã³ãã¯ããã® `Response` ã«å«ãŸããŸãã
-
-ãããŠãã® `Response` ãã`JSONResponse` ã `UJSONResponse` ã®å Žåã®ããã«JSONã¡ãã£ã¢ã¿ã€ãïŒ`application/json`ïŒãªãã颿°ã®è¿ãå€ã¯ *path operationãã³ã¬ãŒã¿* ã«å®£èšããä»»æã®Pydantic `response_model` ã«ããèªåçã«å€æïŒããã³ãã£ã«ã¿ïŒãããŸãã
+*path operation 颿°* ããè¿ããã³ã³ãã³ãã¯ããã® `Response` ã«æ ŒçŽãããŸãã
/// note | åè
-ã\83¡ã\83\87ã\82£ã\82¢ã\82¿ã\82ۋ\83\97ã\82\92Ê\8c\87å®\9aã\81\9bã\81\9aã\81«ã\83‹\82¹ã\83\9dã\83³ã\82¹ã\82¯ã\83©ã\82¹ã\82\92Ã¥\88©ç\94šã\81\99ã\82\8bã\81šã\80\81FastAPIã\81¯ã\83‹\82¹ã\83\9dã\83³ã\82¹ã\81«ã\82³ã\83³ã\83\86ã\83³ã\83\84ã\81\8cã\81ªã\81\84ã\81\93ã\81šã\82\92Ê\9c\9fåŸ\85ã\81\97ã\81Ÿã\81\99ã\80\82ã\81\9dã\81®ã\81\9fã\82\81ã\80\81ç\94\9fÊ\88\90ã\81\95ã\82\8cã\82\8bOpenAPIã\83\89ã\82Âã\83¥ã\83¡ã\83³ã\83\88ã\81«ã\83‹\82¹ã\83\9dã\83³ã\82¹ã\83\95ã\82©ã\83΋\83\9eã\83\83ã\83\88ã\81\8cèšèŒãããŸããã
+ã\83¡ã\83\87ã\82£ã\82¢ã\82¿ã\82ۋ\83\97ã\82\92Ê\8c\81ã\81\9fã\81ªã\81\84ã\83‹\82¹ã\83\9dã\83³ã\82¹ã\82¯ã\83©ã\82¹ã\82\92Àœ¿ç\94šã\81\99ã\82\8bã\81šã\80\81FastAPIã\81¯ã\83‹\82¹ã\83\9dã\83³ã\82¹ã\81«ã\82³ã\83³ã\83\86ã\83³ã\83\84ã\81\8cã\81ªã\81\84ã\82\82ã\81®ã\81šÚŠ\8bã\81ªã\81\97ã\81Ÿã\81\99ã\80\82ã\81\9dã\81®ã\81\9fã\82\81ã\80\81ç\94\9fÊ\88\90ã\81\95ã\82\8cã\82\8bOpenAPIã\83\89ã\82Âã\83¥ã\83¡ã\83³ã\83\88ã\81«ã\83‹\82¹ã\83\9dã\83³ã\82¹ã\83\95ã\82©ã\83΋\83\9eã\83\83ã\83\88ã\81¯èšèŒãããŸããã
///
-## `ORJSONResponse` ã䜿ã { #use-orjsonresponse }
-
-äŸãã°ãããã©ãŒãã³ã¹ãçµãåºãããå Žåã¯ã<a href="https://github.com/ijl/orjson" class="external-link" target="_blank">`orjson`</a>ãã€ã³ã¹ããŒã«ããã¬ã¹ãã³ã¹ãšã㊠`ORJSONResponse` ãã»ããã§ããŸãã
-
-䜿ããã `Response` ã¯ã©ã¹ïŒãµãã¯ã©ã¹ïŒãã€ã³ããŒããã*path operationãã³ã¬ãŒã¿* ã«å®£èšããŸãã
+## JSONã¬ã¹ãã³ã¹ { #json-responses }
-倧ããªã¬ã¹ãã³ã¹ã®å Žåã`Response` ãçŽæ¥è¿ãã»ãããèŸæžãè¿ããããã¯ããã«é«éã§ãã
+FastAPI ã¯ããã©ã«ãã§JSONã¬ã¹ãã³ã¹ãè¿ããŸãã
-ããã¯ãããã©ã«ãã§ã¯FastAPIããã¥ãŒããªã¢ã«ã§èª¬æããåã[JSON Compatible Encoder](../tutorial/encoder.md){.internal-link target=_blank}ã䜿ã£ãŠãå
éšã®åã¢ã€ãã ãæ€æ»ããJSONãšããŠã·ãªã¢ã©ã€ãºå¯èœã§ããããšã確èªããããã§ããããã«ãããäŸãã°ããŒã¿ããŒã¹ã¢ãã«ã®ãããª**ä»»æã®ãªããžã§ã¯ã**ãè¿ããŸãã
+[ã¬ã¹ãã³ã¹ã¢ãã«](../tutorial/response-model.md) ã宣èšãããšãFastAPI 㯠Pydantic ã䜿ã£ãŠããŒã¿ãJSONã«ã·ãªã¢ã©ã€ãºããŸãã
-ããããè¿ãããšããŠããã³ã³ãã³ãã **JSONã§ã·ãªã¢ã©ã€ãºå¯èœ**ã§ããããšã確å®ãªãããããçŽæ¥ã¬ã¹ãã³ã¹ã¯ã©ã¹ã«æž¡ããŠãFastAPIãã¬ã¹ãã³ã¹ã¯ã©ã¹ãžæž¡ãåã«è¿åŽã³ã³ãã³ãã `jsonable_encoder` ã«éãããšã§çºçãã远å ã®ãªãŒããŒããããåé¿ã§ããŸãã
-
-{* ../../docs_src/custom_response/tutorial001b_py310.py hl[2,7] *}
-
-/// info | æ
å ±
+ã¬ã¹ãã³ã¹ã¢ãã«ã宣èšããªãå ŽåãFastAPI 㯠[JSON Compatible Encoder](../tutorial/encoder.md) ã§èª¬æãã `jsonable_encoder` ã䜿ãããã®çµæã `JSONResponse` ã«å
¥ããŸãã
-ãã©ã¡ãŒã¿ `response_class` ã¯ãã¬ã¹ãã³ã¹ã®ãã¡ãã£ã¢ã¿ã€ãããå®çŸ©ããããã«ãå©çšãããŸãã
+`JSONResponse` ã®ããã«JSONã¡ãã£ã¢ã¿ã€ãïŒ`application/json`ïŒãæã€ `response_class` ã宣èšããå Žåã*path operation ãã³ã¬ãŒã¿* ã«å®£èšããä»»æã®Pydanticã® `response_model` ã«åŸã£ãŠãè¿ãããŒã¿ã¯èªåçã«å€æïŒããã³ãã£ã«ã¿ïŒãããŸãããã ãããã®ããŒã¿ã¯ Pydantic ã§JSONã®ãã€ãåã«ã·ãªã¢ã©ã€ãºãããããã§ã¯ãªãããŸã `jsonable_encoder` ã§å€æãããåŸã« `JSONResponse` ã¯ã©ã¹ãžæž¡ãããPythonã®æšæºJSONã©ã€ãã©ãªã§ãã€ãåã«ã·ãªã¢ã©ã€ãºãããŸãã
-ãã®å ŽåãHTTPããã㌠`Content-Type` ã«ã¯ `application/json` ãã»ãããããŸãã
-
-ãããŠãOpenAPIã«ã¯ãã®ããã«ããã¥ã¡ã³ããããŸãã
-
-///
-
-/// tip | è±ç¥è
+### JSONã®ããã©ãŒãã³ã¹ { #json-performance }
-`ORJSONResponse` ã¯FastAPIã§ã®ã¿å©çšå¯èœã§ãStarletteã§ã¯å©çšã§ããŸããã
+çµè«ãšããŠãæå€§ã®ããã©ãŒãã³ã¹ãåŸããå Žåã¯ã[ã¬ã¹ãã³ã¹ã¢ãã«](../tutorial/response-model.md) ã䜿ãã*path operation ãã³ã¬ãŒã¿* ã§ `response_class` ã¯å®£èšããªãã§ãã ããã
-///
+{* ../../docs_src/response_model/tutorial001_01_py310.py ln[15:17] hl[16] *}
## HTMLã¬ã¹ãã³ã¹ { #html-response }
-**FastAPI** ããHTMLãçŽæ¥è¿ãå Žåã¯ã`HTMLResponse` ã䜿ããŸãã
+**FastAPI** ããHTMLãçŽæ¥è¿ãã«ã¯ã`HTMLResponse` ã䜿ããŸãã
-* `HTMLResponse` ãã€ã³ããŒãããã
-* *path operation ãã³ã¬ãŒã¿* ã®ãã©ã¡ãŒã¿ `response_class` ã« `HTMLResponse` ãæž¡ãã
+* `HTMLResponse` ãã€ã³ããŒããã
+* *path operation ãã³ã¬ãŒã¿* ã®ãã©ã¡ãŒã¿ `response_class` ã« `HTMLResponse` ãæž¡ã
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
/// info | æ
å ±
-ãã©ã¡ãŒã¿ `response_class` ã¯ãã¬ã¹ãã³ã¹ã®ãã¡ãã£ã¢ã¿ã€ãããå®çŸ©ããããã«ãå©çšãããŸãã
+ãã©ã¡ãŒã¿ `response_class` ã¯ãã¬ã¹ãã³ã¹ã®ãã¡ãã£ã¢ã¿ã€ãããå®çŸ©ããããã«ã䜿çšãããŸãã
-ãã®å ŽåãHTTPããã㌠`Content-Type` ã«ã¯ `text/html` ãã»ãããããŸãã
+ãã®å ŽåãHTTPããã㌠`Content-Type` ã«ã¯ `text/html` ãèšå®ãããŸãã
-ã\81\9dã\81\97ã\81Šã\80\81OpenAPIã\81«ã\81¯ã\81\9dã\81®ã\82\88ã\81\86ã\81«ã\83\89ã\82Âã\83¥ã\83¡ã\83³ã\83\88ãããŸãã
+ã\81\9dã\81\97ã\81Šã\80\81OpenAPIã\81«ã\82\82ã\81\9dã\81®ã\82\88ã\81\86ã\81«ã\83\89ã\82Âã\83¥ã\83¡ã\83³ã\83\88Ã¥\8c\96ãããŸãã
///
### `Response` ãè¿ã { #return-a-response }
-[ã¬ã¹ãã³ã¹ãçŽæ¥è¿ã](response-directly.md){.internal-link target=_blank}ã§èŠãããã«ãã¬ã¹ãã³ã¹ãè¿ãããšã§ã*path operation* ã®äžã§ã¬ã¹ãã³ã¹ãçŽæ¥ãªãŒããŒã©ã€ãããããšãã§ããŸãã
+[ã¬ã¹ãã³ã¹ãçŽæ¥è¿ã](response-directly.md)ã§èŠãããã«ã*path operation* ã®äžã§ã¬ã¹ãã³ã¹ãçŽæ¥è¿ããŠäžæžãããããšãã§ããŸãã
-Àž\8aښ\98ã\81šå\90\8cã\81\98ÀŸ\8bã\81«ã\81\8aã\81\84ã\81Šã\80\81 `HTMLResponse` ã\82\92Ú¿\94ã\81\99ã\81šã\80\81ã\81\93ã®ããã«ãªããŸã:
+Àž\8aښ\98ã\81šå\90\8cã\81\98ÀŸ\8bã\81§ã\80\81`HTMLResponse` ã\82\92Ú¿\94ã\81\99ã\81šÊ¬¡ã®ããã«ãªããŸã:
{* ../../docs_src/custom_response/tutorial003_py310.py hl[2,7,19] *}
/// warning | 泚æ
-*path operation颿°* ããçŽæ¥è¿ããã `Response` ã¯ãOpenAPIã«ããã¥ã¡ã³ããããïŒäŸãã°ã`Content-Type` ãããã¥ã¡ã³ããããªãïŒãèªåçãªå¯Ÿè©±çããã¥ã¡ã³ãã§ã衚瀺ãããŸããã
+*path operation 颿°* ããçŽæ¥è¿ããã `Response` ã¯ãOpenAPIã«ããã¥ã¡ã³ãåãããïŒäŸãã° `Content-Type` ãããã¥ã¡ã³ãåãããªãïŒãèªåçæã®å¯Ÿè©±çããã¥ã¡ã³ãã«ã衚瀺ãããŸããã
///
/// info | æ
å ±
-ã\82\82ã\81¡ã\82\8dã\82\93ã\80\81å®\9fé\9a\9bã\81® `Content-Type` ã\83\98ã\83\83ã\83\80ã\83΋\82\84ã\82¹ã\83\86ã\83΋\82¿ã\82¹ã\82³ã\83΋\83\89ã\81ªã\81©ã\81¯ã\80\81Ú¿\94ã\81\95ã\82\8cã `Response` ãªããžã§ã¯ãã«ç±æ¥ããŸãã
+ã\82\82ã\81¡ã\82\8dã\82\93ã\80\81å®\9fé\9a\9bã\81® `Content-Type` ã\83\98ã\83\83ã\83\80ã\83΋\82\84ã\82¹ã\83\86ã\83΋\82¿ã\82¹ã\82³ã\83΋\83\89ã\81ªã\81©ã\81¯ã\80\81Ú¿\94ã\81\97ã `Response` ãªããžã§ã¯ãã«ç±æ¥ããŸãã
///
-### OpenAPIã\83\89ã\82Âã\83¥ã\83¡ã\83³ã\83\88ã\81š `Response` ã\81®ã\82ªã\83΋\83\90ã\83΋\83©ã\82ۋ\83\89 { #document-in-openapi-and-override-response }
+### OpenAPIã\81«ã\83\89ã\82Âã\83¥ã\83¡ã\83³ã\83\88Ã¥\8c\96ã\81\97ã\81ۋ\81€ `Response` ã\82\92Àž\8aÊ\9bžã\81\8d { #document-in-openapi-and-override-response }
-é\96¢Ê\95°ã\81®ÀžÂã\81§ã\83‹\82¹ã\83\9dã\83³ã\82¹ã\82\92ã\82ªã\83΋\83\90ã\83΋\83©ã\82ۋ\83\89ã\81\97ã\81ۋ\81ۋ\82\82ã\80\81OpenAPI ã\81«ã\80\8cã\83¡ã\83\87ã\82£ã\82¢ã\82¿ã\82ۋ\83\97ã\80\8dã\82\92ã\83\89ã\82Âã\83¥ã\83¡ã\83³ã\83\88Ã¥\8c\96ã\81\97ã\81\9fã\81\84ã\81ªã\82\89ã`response_class` ãã©ã¡ãŒã¿ã䜿çšããã〠`Response` ãªããžã§ã¯ããè¿ããŸãã
+é\96¢Ê\95°ã\81®ÀžÂã\81\8bã\82\89ã\83‹\82¹ã\83\9dã\83³ã\82¹ã\82\92Àž\8aÊ\9bžã\81\8dã\81\97ã\81ۋ\81ۋ\80\81Ã¥\90\8cÊ\99\82ã\81«OpenAPIã\81§ã\80\8cã\83¡ã\83\87ã\82£ã\82¢ã\82¿ã\82ۋ\83\97ã\80\8dã\82\92ã\83\89ã\82Âã\83¥ã\83¡ã\83³ã\83\88Ã¥\8c\96ã\81\97ã\81\9fã\81\84堎å\90\88ã\81¯ã`response_class` ãã©ã¡ãŒã¿ã䜿çšããã〠`Response` ãªããžã§ã¯ããè¿ããŸãã
-`response_class` ã¯OpenAPIã®*path operation*ã®ããã¥ã¡ã³ãåã®ããã«ã®ã¿äœ¿çšããã`Response` ã¯ãã®ãŸãŸäœ¿çšãããŸãã
+ãã®å Žåã`response_class` ã¯OpenAPIã® *path operation* ãããã¥ã¡ã³ãåããããã ãã«äœ¿ãããå®éã«ã¯è¿ãã `Response` ããã®ãŸãŸäœ¿çšãããŸãã
#### `HTMLResponse` ãçŽæ¥è¿ã { #return-an-htmlresponse-directly }
-äŸãã°ããã®ããã«ãªããŸã:
+äŸãã°ã次ã®ããã«ãªããŸã:
{* ../../docs_src/custom_response/tutorial004_py310.py hl[7,21,23] *}
-ãã®äŸã§ã¯ã颿° `generate_html_response()` ã¯ã`str` ã®HTMLãè¿ãã®ã§ã¯ãªãã`Response` ãçæããŠè¿ããŠããŸãã
+ãã®äŸã§ã¯ã颿° `generate_html_response()` ã¯HTMLã® `str` ãè¿ãã®ã§ã¯ãªãããã§ã« `Response` ãçæããŠè¿ããŠããŸãã
-`generate_html_response()` ã\82\92Ã¥\91΋\81³å\87ºã\81\97ã\81\9fçµ\90Ê\9e\9cã\82\92Ú¿\94ã\81\99ã\81\93ã\81šã\81«ã\82\88ã\82\8aã\80\81ã\83\87ã\83\95ã\82©ã\83«ã\83\88ã\81® **FastAPI** ã\81®Ê\8c\99Ã¥\8b\95ã\82\92ã\82ªã\83΋\83\90ã\83΋\83©ã\82ۋ\83\89ãã `Response` ããã§ã«è¿ããŠããŸãã
+`generate_html_response()` ã\81®å\91΋\81³å\87ºã\81\97çµ\90Ê\9e\9cã\82\92Ú¿\94ã\81\99ã\81\93ã\81šã\81§ã\80\81ã\83\87ã\83\95ã\82©ã\83«ã\83\88ã\81® **FastAPI** ã\81®Ê\8c\99Ã¥\8b\95ã\82\92Àž\8aÊ\9bžã\81\8dãã `Response` ããã§ã«è¿ããŠããŸãã
-ã\81\97ã\81\8bã\81\97ã\80\81`response_class` ã\81«ã\82\82 `HTMLResponse` ã\82\92ʞ¡ã\81\97ã\81Šã\81\84ã\82\8bã\81\9fã\82\81ã\80\81**FastAPI** ã\81¯OpenAPIã\81šå¯ŸÚ©±ç\9a\84ã\83\89ã\82Âã\83¥ã\83¡ã\83³ã\83\88ã\81§ã\80\81`text/html` ã\81®HTMLã\81šã\81\97ã\81Šã\81©ã\81®ã\82\88ã\81\86ã\81«ã\83\89ã\82Âã\83¥ã\83¡ã\83³ã\83\88Ã¥\8c\96ã\81\99ã\82\8cã\81°ã\82\88ã\81\84ã\81\8bã\82\92ç\90\86Ú§£ã§ããŸã:
+ã\81\97ã\81\8bã\81\97ã\80\81`response_class` ã\81«ã\82\82 `HTMLResponse` ã\82\92ʞ¡ã\81\97ã\81Šã\81\84ã\82\8bã\81\9fã\82\81ã\80\81**FastAPI** ã\81¯OpenAPIã\81\8aã\82\88ã\81³å¯ŸÚ©±ç\9a\84ã\83\89ã\82Âã\83¥ã\83¡ã\83³ã\83\88ã\81§ã\80\81ã\81\9dã\82\8cã\81\8c `text/html` ã\81®HTMLã\81§ã\81\82ã\82\8bã\81šÊ£ã\81\97ã\81\8fã\83\89ã\82Âã\83¥ã\83¡ã\83³ã\83\88Ã¥\8c\96ã§ããŸã:
<img src="/img/tutorial/custom-response/image01.png">
## å©çšå¯èœãªã¬ã¹ãã³ã¹ { #available-responses }
-À»¥Àž\8bã\81\8cå©çšå¯èœãªã¬ã¹ãã³ã¹ã®äžéšã§ãã
+À»¥Àž\8bã\81¯å©çšå¯èœãªã¬ã¹ãã³ã¹ã®äžéšã§ãã
-`Response` ã䜿ã£ãŠä»ã®äœããè¿ããŸãããã«ã¹ã¿ã ã®ãµãã¯ã©ã¹ãäœããããšãèŠããŠãããŠãã ããã
+`Response` ã䜿ã£ãŠä»ã®ãã®ãè¿ããããã«ã¹ã¿ã ãµãã¯ã©ã¹ãäœæããããšãã§ããŸãã
/// note | æè¡è©³çް
-`from starlette.responses import HTMLResponse` ã\82\82Ã¥\88©ç\94šã§ããŸãã
+`from starlette.responses import HTMLResponse` ã\82\92Àœ¿ã\81\86ã\81\93ã\81šã\82\82ã§ããŸãã
-**FastAPI** ã\81¯é\96\8bç\99ºÚ\80\85ã\81®å\88©ÀŸ¿Ê\80§ã\81®ã\81\9fã\82\81ã\81«ã\80\81`starlette.responses` ã\81šå\90\8cã\81\98ã\82\82ã\81®ã\82\92 `fastapi.responses` ã\81šã\81\97ã\81ŠÊ\8f\90ÀŸ\9bã\81\97ã\81Šã\81\84ã\81Ÿã\81\99ã\80\82ã\81\97ã\81\8bã\81\97ã\80\81Ã¥\88©ç\94šå\8f¯Ú\83ϋ\81ªã\83‹\82¹ã\83\9dã\83³ã\82¹ã\81®ã\81ȋ\81šã\82\93ã\81©ã\81¯Starletteã\81\8bã\82\89ç\9bŽÊ\8e¥Ê\8f\90ÀŸ\9bã\81\95ã\82\8cãŸãã
+**FastAPI** ã\81¯é\96\8bç\99ºÚ\80\85ã\81®å\88©ÀŸ¿Ê\80§ã\81®ã\81\9fã\82\81ã\81«ã\80\81`starlette.responses` ã\81šå\90\8cã\81\98ã\82\82ã\81®ã\82\92 `fastapi.responses` ã\81šã\81\97ã\81ŠÊ\8f\90ÀŸ\9bã\81\97ã\81Šã\81\84ã\81Ÿã\81\99ã\80\82ã\81\9fã\81 ã\81\97ã\80\81Ã¥\88©ç\94šå\8f¯Ú\83ϋ\81ªã\83‹\82¹ã\83\9dã\83³ã\82¹ã\81®å€\9aã\81\8fã\81¯Starletteã\81\8bã\82\89ç\9bŽÊ\8e¥Ê\8f\90ÀŸ\9bã\81\95ã\82\8cã\81Šã\81\84ãŸãã
///
### `Response` { #response }
-ã¡ã€ã³ã® `Response` ã¯ã©ã¹ã§ãä»ã®å
šãŠã®ã¬ã¹ãã³ã¹ã¯ãããç¶æ¿ããŠããŸãã
+ã¡ã€ã³ã® `Response` ã¯ã©ã¹ã§ãä»ã®ãã¹ãŠã®ã¬ã¹ãã³ã¹ã¯ãããç¶æ¿ããŠããŸãã
çŽæ¥è¿ãããšãã§ããŸãã
以äžã®ãã©ã¡ãŒã¿ãåãä»ããŸãã
-* `content` - `str` ã\81\8b `bytes`ã\80\82
-* `status_code` - `int` ã®HTTPã¹ããŒã¿ã¹ã³ãŒãã
-* `headers` - æååã® `dict` ã
-* `media_type` - ã¡ãã£ã¢ã¿ã€ãã瀺ã `str` ãäŸãã° `"text/html"` ã
+* `content` - `str` ã\81Ÿã\81\9fã\81¯ `bytes`
+* `status_code` - `int` ã®HTTPã¹ããŒã¿ã¹ã³ãŒã
+* `headers` - æååã® `dict`
+* `media_type` - ã¡ãã£ã¢ã¿ã€ãã瀺ã `str`ãäŸ: `"text/html"`
-FastAPIïŒå®éã«ã¯StarletteïŒã¯èªåçã«Content-LengthããããŒãå«ã¿ãŸãããŸãã`media_type` ã«åºã¥ããContent-TypeããããŒãå«ã¿ãããã¹ãã¿ã€ãã®ããã«charsetã远å ããŸãã
+FastAPIïŒå®éã«ã¯StarletteïŒã¯èªåçã« Content-Length ããããŒãå«ããŸãããŸãã`media_type` ã«åºã¥ãã Content-Type ããããŒãå«ããããã¹ãã¿ã€ãã«ã¯ charset ã远å ããŸãã
{* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *}
### `HTMLResponse` { #htmlresponse }
-äžã§èªãã ããã«ãããã¹ãããã€ããåãåããHTMLã¬ã¹ãã³ã¹ãè¿ããŸãã
+äžã§èªãã ããã«ãããã¹ãããã€ãåãåãåããHTMLã¬ã¹ãã³ã¹ãè¿ããŸãã
### `PlainTextResponse` { #plaintextresponse }
-ããã¹ãããã€ããåãåãããã¬ãŒã³ããã¹ãã®ã¬ã¹ãã³ã¹ãè¿ããŸãã
+ããã¹ãããã€ãåãåãåãããã¬ãŒã³ããã¹ãã®ã¬ã¹ãã³ã¹ãè¿ããŸãã
{* ../../docs_src/custom_response/tutorial005_py310.py hl[2,7,9] *}
ããŒã¿ãåãåãã`application/json` ãšããŠãšã³ã³ãŒããããã¬ã¹ãã³ã¹ãè¿ããŸãã
-äžã§èªãã ããã«ã**FastAPI** ã®ããã©ã«ãã®ã¬ã¹ãã³ã¹ãšããŠå©çšãããŸãã
-
-### `ORJSONResponse` { #orjsonresponse }
-
-äžã§èªãã ããã«ã<a href="https://github.com/ijl/orjson" class="external-link" target="_blank">`orjson`</a>ã䜿ã£ããé«éãªä»£æ¿ã®JSONã¬ã¹ãã³ã¹ã§ãã
-
-/// info | æ
å ±
-
-ããã¯ãäŸãã° `pip install orjson` ã§ `orjson` ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
+ããã¯ãäžã§è¿°ã¹ãããã« **FastAPI** ã®ããã©ã«ãã®ã¬ã¹ãã³ã¹ã§ãã
-///
-
-### `UJSONResponse` { #ujsonresponse }
-
-<a href="https://github.com/ultrajson/ultrajson" class="external-link" target="_blank">`ujson`</a>ã䜿ã£ãã代æ¿ã®JSONã¬ã¹ãã³ã¹ã§ãã
-
-/// info | æ
å ±
-
-ããã¯ãäŸãã° `pip install ujson` ã§ `ujson` ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
-
-///
-
-/// warning | 泚æ
-
-`ujson` ã¯ãããã€ãã®ãšããžã±ãŒã¹ã®åãæ±ãã«ã€ããŠãPythonã«ãã«ãã€ã³ãããå®è£
ã»ã©æ³šææ·±ããããŸããã
-
-///
-
-{* ../../docs_src/custom_response/tutorial001_py310.py hl[2,7] *}
+/// note | æè¡è©³çް
-/// tip | è±ç¥è
+ãã ããã¬ã¹ãã³ã¹ã¢ãã«ãè¿åŽåã宣èšããå Žåã¯ããããçŽæ¥ããŒã¿ã®JSONã·ãªã¢ã©ã€ãºã«äœ¿ãããé©åãªJSONã®ã¡ãã£ã¢ã¿ã€ããæã€ã¬ã¹ãã³ã¹ã `JSONResponse` ã¯ã©ã¹ã䜿ããã«çŽæ¥è¿ãããŸãã
-`ORJSONResponse` ã®ã»ããé«éãªä»£æ¿ãããããŸããã
+ãããæé©ãªããã©ãŒãã³ã¹ãåŸãçæ³çãªæ¹æ³ã§ãã
///
### `RedirectResponse` { #redirectresponse }
-HTTPã\83ªã\83\80ã\82ۋ\83‹\82¯ã\83\88ã\82\92Ú¿\94ã\81\97ã\81Ÿã\81\99ã\80\82ã\83\87ã\83\95ã\82©ã\83«ã\83\88ã\81§ã\81¯307ã\82¹ã\83\86ã\83΋\82¿ã\82¹ã\82³ã\83΋\83\89ïŒ\88Temporary RedirectïŒ\89ã\81šã\81ªã\82\8aãŸãã
+HTTPã\83ªã\83\80ã\82ۋ\83‹\82¯ã\83\88ã\82\92Ú¿\94ã\81\97ã\81Ÿã\81\99ã\80\82ã\83\87ã\83\95ã\82©ã\83«ã\83\88ã\81§ã\81¯307ã\82¹ã\83\86ã\83΋\82¿ã\82¹ã\82³ã\83΋\83\89ïŒ\88Temporary RedirectïŒ\89ã\82\92Àœ¿ç\94šã\81\97ãŸãã
`RedirectResponse` ãçŽæ¥è¿ããŸã:
{* ../../docs_src/custom_response/tutorial006b_py310.py hl[2,7,9] *}
-ãã®å Žåã*path operation*颿°ããURLãçŽæ¥è¿ããŸãã
+ãã®å Žåã*path operation* 颿°ããURLãçŽæ¥è¿ããŸãã
-ãã®å Žåã«äœ¿çšããã `status_code` 㯠`RedirectResponse` ã®ããã©ã«ãã§ãã `307` ã«ãªããŸãã
+ãã®å Žåã«äœ¿çšããã `status_code` ã¯ã`RedirectResponse` ã®ããã©ã«ãã§ãã `307` ã«ãªããŸãã
---
-ã\81Ÿã\81\9fã`status_code` ãã©ã¡ãŒã¿ã `response_class` ãã©ã¡ãŒã¿ãšçµã¿åãããŠäœ¿ãããšãã§ããŸã:
+ã\81\95ã\82\89ã\81«ã`status_code` ãã©ã¡ãŒã¿ã `response_class` ãã©ã¡ãŒã¿ãšçµã¿åãããŠäœ¿ãããšãã§ããŸã:
{* ../../docs_src/custom_response/tutorial006c_py310.py hl[2,7,9] *}
### `StreamingResponse` { #streamingresponse }
-éåæãžã§ãã¬ãŒã¿ããŸãã¯éåžžã®ãžã§ãã¬ãŒã¿/ã€ãã¬ãŒã¿ãåãåããã¬ã¹ãã³ã¹ããã£ãã¹ããªãŒã ããŸãã
+éåæãžã§ãã¬ãŒã¿ããŸãã¯éåžžã®ãžã§ãã¬ãŒã¿/ã€ãã¬ãŒã¿ïŒ`yield` ãæã€é¢æ°ïŒãåãåããã¬ã¹ãã³ã¹ããã£ãã¹ããªãŒã ããŸãã
-{* ../../docs_src/custom_response/tutorial007_py310.py hl[2,14] *}
+{* ../../docs_src/custom_response/tutorial007_py310.py hl[3,16] *}
-#### ãã¡ã€ã«ã©ã€ã¯ãªããžã§ã¯ãã§ `StreamingResponse` ã䜿ã { #using-streamingresponse-with-file-like-objects }
-
-<a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">file-like</a> ãªããžã§ã¯ãïŒäŸ: `open()` ã§è¿ããããªããžã§ã¯ãïŒãããå Žåããã®file-likeãªããžã§ã¯ããå埩åŠçãããžã§ãã¬ãŒã¿é¢æ°ãäœããŸãã
-
-ããããã°ãæåã«ãã¹ãŠãã¡ã¢ãªãžèªã¿èŸŒãå¿
èŠã¯ãªãããã®ãžã§ãã¬ãŒã¿é¢æ°ã `StreamingResponse` ã«æž¡ããŠè¿ããŸãã
-
-ããã«ã¯ã¯ã©ãŠãã¹ãã¬ãŒãžãšã®é£æºãæ ååŠçãªã©ãå€ãã®ã©ã€ãã©ãªãå«ãŸããŸãã
+/// note | æè¡è©³çް
-{* ../../docs_src/custom_response/tutorial008_py310.py hl[2,10:12,14] *}
+`async` ã¿ã¹ã¯ã¯ `await` ã«å°éãããšãã«ã®ã¿ãã£ã³ã»ã«ã§ããŸãã`await` ããªãå Žåããžã§ãã¬ãŒã¿ïŒ`yield` ãæã€é¢æ°ïŒã¯é©åã«ãã£ã³ã»ã«ã§ããããã£ã³ã»ã«èŠæ±åŸãå®è¡ãç¶ãå¯èœæ§ããããŸãã
-1. ããã¯ãžã§ãã¬ãŒã¿é¢æ°ã§ããå
éšã« `yield` æãå«ãããããžã§ãã¬ãŒã¿é¢æ°ãã§ãã
-2. `with` ãããã¯ã䜿ãããšã§ããžã§ãã¬ãŒã¿é¢æ°ãçµãã£ãåŸïŒã€ãŸãã¬ã¹ãã³ã¹ã®éä¿¡ãå®äºããåŸïŒã«file-likeãªããžã§ã¯ãã確å®ã«ã¯ããŒãºãããããã«ããŸãã
-3. ãã® `yield from` ã¯ã`file_like` ãšããååã®ãã®ãå埩åŠçããããã«é¢æ°ãžæç€ºããŸãããããŠå埩ãããåããŒãã«ã€ããŠããã®ããŒãããã®ãžã§ãã¬ãŒã¿é¢æ°ïŒ`iterfile`ïŒããæ¥ããã®ãšã㊠`yield` ããŸãã
+ãã®å°ããªäŸã§ã¯ `await` ãäžèŠãªãããã€ãã³ãã«ãŒãã«ãã£ã³ã»ã«ãåŠçããæ©äŒãäžããããã« `await anyio.sleep(0)` ã远å ããŠããŸãã
- ã€ãŸããå
éšçã«ãçæãã®äœæ¥ãå¥ã®ãã®ãžç§»è²ãããžã§ãã¬ãŒã¿é¢æ°ã§ãã
+ããã¯å€§ããªã¹ããªãŒã ãç¡éã¹ããªãŒã ã§ã¯ããã«éèŠã«ãªããŸãã
- ãã®ããã«ããããšã§ `with` ãããã¯ã«å
¥ããããå®äºåŸã«file-likeãªããžã§ã¯ãã確å®ã«ã¯ããŒãºãããŸãã
+///
/// tip | è±ç¥è
-ããã§ã¯ `async` ãš `await` ããµããŒãããŠããªãæšæºã® `open()` ã䜿ã£ãŠãããããéåžžã® `def` ã§path operationã宣èšããŠããç¹ã«æ³šæããŠãã ããã
+`StreamingResponse` ãçŽæ¥è¿ã代ããã«ã[ããŒã¿ãã¹ããªãŒã ãã](./stream-data.md) ã¹ã¿ã€ã«ã«åŸãããšãããããããŸãããã¡ãã®ã»ããã¯ããã«äŸ¿å©ã§ãè£åŽã§ãã£ã³ã»ã«åŠçãè¡ã£ãŠãããŸãã
+
+JSON Lines ãã¹ããªãŒã ããå Žåã¯ã[JSON Lines ãã¹ããªãŒã ãã](../tutorial/stream-json-lines.md) ãã¥ãŒããªã¢ã«ãåç
§ããŠãã ããã
///
### `FileResponse` { #fileresponse }
-ã\83‹\82¹ã\83\9dã\83³ã\82¹ã\81šã\81\97ã\81Šã\83\95ã\82¡ã\82ۋ\83«ã\82\92é\9d\9eÃ¥\90\8cÊ\9c\9fç\9a\84ã«ã¹ããªãŒã ããŸãã
+ã\83\95ã\82¡ã\82ۋ\83«ã\82\92ã\83‹\82¹ã\83\9dã\83³ã\82¹ã\81šã\81\97ã\81Šé\9d\9eÃ¥\90\8cÊ\9c\9fã«ã¹ããªãŒã ããŸãã
-À»\96ã\81®ã\83¬ã\82¹ã\83\9dã\83³ã\82¹ã\82¿ã\82€ã\83\97ã\81šã\81¯ç\95°ã\81ªã\82\8båŒ\95Ê\95°ã\81®ã\82»ã\83\83ã\83\88ã\82\92å\8f\97ã\81\91å\8f\96ã\82\8aã\82€ã\83³ã\82¹ã\82¿ã\83³ã\82¹å\8c\96ã\81\97ã\81Ÿã\81\99ã\80\82
+À»\96ã\81®ã\83¬ã\82¹ã\83\9dã\83³ã\82¹ã\82¿ã\82€ã\83\97ã\81šã\81¯ç\95°ã\81ªã\82\8båŒ\95Ê\95°ã\82»ã\83\83ã\83\88ã\81§ã\82€ã\83³ã\82¹ã\82¿ã\83³ã\82¹å\8c\96ã\81\97ã\81Ÿã\81\99:
-* `path` - ã¹ããªãŒã ãããã¡ã€ã«ã®ãã¡ã€ã«ãã¹ã
-* `headers` - å«ãããä»»æã®ã«ã¹ã¿ã ããããŒã®èŸæžã
-* `media_type` - ã¡ãã£ã¢ã¿ã€ãã瀺ãæååãæªèšå®ã®å Žåããã¡ã€ã«åããã¹ããã¡ãã£ã¢ã¿ã€ããæšæž¬ãããŸãã
-* `filename` - èšå®ããå Žåãã¬ã¹ãã³ã¹ã® `Content-Disposition` ã«å«ãŸããŸãã
+* `path` - ã¹ããªãŒã ãããã¡ã€ã«ã®ãã¡ã€ã«ãã¹
+* `headers` - å«ãããä»»æã®ã«ã¹ã¿ã ããããŒïŒèŸæžïŒ
+* `media_type` - ã¡ãã£ã¢ã¿ã€ãã瀺ãæååãæªèšå®ã®å Žåããã¡ã€ã«åããã¹ããæšæž¬ãããŸã
+* `filename` - èšå®ããå Žåãã¬ã¹ãã³ã¹ã® `Content-Disposition` ã«å«ãŸããŸã
ãã¡ã€ã«ã¬ã¹ãã³ã¹ã«ã¯ãé©å㪠`Content-Length`ã`Last-Modified`ã`ETag` ããããŒãå«ãŸããŸãã
{* ../../docs_src/custom_response/tutorial009b_py310.py hl[2,8,10] *}
-ãã®å Žåã*path operation*颿°ãããã¡ã€ã«ãã¹ãçŽæ¥è¿ããŸãã
+ãã®å Žåã*path operation* 颿°ãããã¡ã€ã«ãã¹ãçŽæ¥è¿ããŸãã
## ã«ã¹ã¿ã ã¬ã¹ãã³ã¹ã¯ã©ã¹ { #custom-response-class }
-`Response` ã\82\92ç¶\99Ê\89¿ã\81\97ã\81\9fç\8b¬Ú\87ªã\81®ã\82«ã\82¹ã\82¿ã\83 ã\83‹\82¹ã\83\9dã\83³ã\82¹ã\82¯ã\83©ã\82¹ã\82\92Àœ\9cÊ\88\90ã\81\97ã\81Šå\88©çšã§ããŸãã
+`Response` ã\82\92ç¶\99Ê\89¿ã\81\97ã\81Šã\80\81ç\8b¬Ú\87ªã\81®ã\82«ã\82¹ã\82¿ã\83 ã\83‹\82¹ã\83\9dã\83³ã\82¹ã\82¯ã\83©ã\82¹ã\82\92Àœ\9cÊ\88\90ã\81\97ã\80\81Àœ¿çšã§ããŸãã
-äŸãã°ã<a href="https://github.com/ijl/orjson" class="external-link" target="_blank">`orjson`</a>ã䜿ããããã忢±ã® `ORJSONResponse` ã¯ã©ã¹ã§äœ¿ãããŠããªãã«ã¹ã¿ã èšå®ã䜿ããããšããŸãã
+äŸãã°ã[`orjson`](https://github.com/ijl/orjson) ãç¹å®ã®èšå®ã§äœ¿ããããšããŸãã
-äŸãã°ãã€ã³ãã³ãããæŽåœ¢ãããJSONãè¿ãããã®ã§ãorjsonãªãã·ã§ã³ `orjson.OPT_INDENT_2` ã䜿ããããšããŸãã
+ã€ã³ãã³ããããæŽåœ¢æžã¿JSONãè¿ãããã®ã§ãorjson ã®ãªãã·ã§ã³ `orjson.OPT_INDENT_2` ã䜿ããããšããŸãã
-`CustomORJSONResponse` ãäœããŸããäž»ã«å¿
èŠãªã®ã¯ãã³ã³ãã³ãã `bytes` ãšããŠè¿ã `Response.render(content)` ã¡ãœãããäœãããšã§ã:
+`CustomORJSONResponse` ãäœæã§ããŸããäž»ã«å¿
èŠãªã®ã¯ã`bytes` ãè¿ã `Response.render(content)` ã¡ãœãããäœãããšã§ã:
{* ../../docs_src/custom_response/tutorial009c_py310.py hl[9:14,17] *}
}
```
-ãã¡ãããJSONã®æŽåœ¢ãããããããæŽ»çšãããã£ãšè¯ãæ¹æ³ãèŠã€ããã¯ãã§ãã ð
+ãã¡ãããJSONã®æŽåœ¢ä»¥å€ã«ãããããæŽ»çšãããã£ãšè¯ãæ¹æ³ãèŠã€ããã¯ãã§ãã ð
+
+### `orjson` ã ã¬ã¹ãã³ã¹ã¢ãã«ã { #orjson-or-response-model }
+
+ããæ±ããŠããã®ãããã©ãŒãã³ã¹ã§ããã°ã`orjson` ã¬ã¹ãã³ã¹ã䜿ãããã[ã¬ã¹ãã³ã¹ã¢ãã«](../tutorial/response-model.md) ã䜿ãã»ããè¯ãå Žåãå€ãã§ãã
+
+ã¬ã¹ãã³ã¹ã¢ãã«ããããšãFastAPI ã¯äžéã¹ãããïŒä»ã®å Žåã«è¡ããã `jsonable_encoder` ã«ãã倿ãªã©ïŒãä»ããã«ãPydantic ã䜿ã£ãŠããŒã¿ãJSONã«ã·ãªã¢ã©ã€ãºããŸãã
+
+å
éšçã«ã¯ãPydantic ã¯JSONã·ãªã¢ã©ã€ãºã« `orjson` ãšåãRustç±æ¥ã®ä»çµã¿ãçšããŠãããããã¬ã¹ãã³ã¹ã¢ãã«ã䜿ãã ãã§æè¯ã®ããã©ãŒãã³ã¹ãåŸãããŸãã
## ããã©ã«ãã¬ã¹ãã³ã¹ã¯ã©ã¹ { #default-response-class }
-**FastAPI** ã\82¯ã\83©ã\82¹ã\81®ã\82ۋ\83³ã\82¹ã\82¿ã\83³ã\82¹ã\80\81ã\81Ÿã\81\9fã\81¯ `APIRouter` ãäœæããéã«ãããã©ã«ãã§äœ¿çšããã¬ã¹ãã³ã¹ã¯ã©ã¹ãæå®ã§ããŸãã
+**FastAPI** ã\82¯ã\83©ã\82¹ã\81®ã\82ۋ\83³ã\82¹ã\82¿ã\83³ã\82¹ã\82\84 `APIRouter` ãäœæããéã«ãããã©ã«ãã§äœ¿çšããã¬ã¹ãã³ã¹ã¯ã©ã¹ãæå®ã§ããŸãã
ãããå®çŸ©ãããã©ã¡ãŒã¿ã¯ `default_response_class` ã§ãã
-以äžã®äŸã§ã¯ã**FastAPI** ã¯ãã¹ãŠã®*path operation*ã§ã`JSONResponse` ã®ä»£ããã« `ORJSONResponse` ãããã©ã«ããšããŠäœ¿ããŸãã
+以äžã®äŸã§ã¯ã**FastAPI** ã¯ãã¹ãŠã® *path operation* ã§ãJSONã®ä»£ããã«ããã©ã«ãã§ `HTMLResponse` ã䜿çšããŸãã
{* ../../docs_src/custom_response/tutorial010_py310.py hl[2,4] *}
/// tip | è±ç¥è
-ãããŸã§ãšåæ§ã«ã*path operation*ã§ `response_class` ããªãŒããŒã©ã€ãã§ããŸãã
+ãããŸã§ãšåæ§ã«ã*path operation* ããšã« `response_class` ããªãŒããŒã©ã€ãã§ããŸãã
///
## ãã®ä»ã®ããã¥ã¡ã³ã { #additional-documentation }
-OpenAPIã§ã¯ `responses` ã䜿ã£ãŠã¡ãã£ã¢ã¿ã€ãããã®ä»ã®è©³çްã宣èšããããšãã§ããŸã: [Additional Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}ã
+OpenAPIã§ã¯ `responses` ã䜿ã£ãŠã¡ãã£ã¢ã¿ã€ãããã®ä»ã®è©³çްã宣èšããããšãã§ããŸã: [OpenAPI ã®è¿œå ã¬ã¹ãã³ã¹](additional-responses.md)ã
FastAPI 㯠**Pydantic** ã®äžã«æ§ç¯ãããŠããããããŸã§ã«ãªã¯ãšã¹ããã¬ã¹ãã³ã¹ã宣èšããããã« Pydantic ã¢ãã«ãäœ¿ãæ¹æ³ã玹ä»ããŠããŸããã
-ããã FastAPI ã¯ãåæ§ã®æ¹æ³ã§ <a href="https://docs.python.org/3/library/dataclasses.html" class="external-link" target="_blank">`dataclasses`</a> ããµããŒãããŸã:
+ããã FastAPI ã¯ãåæ§ã®æ¹æ³ã§ [`dataclasses`](https://docs.python.org/3/library/dataclasses.html) ããµããŒãããŸã:
{* ../../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** ã«ãã£ãŠåŒãç¶ããµããŒããããŠããŸããPydantic ã«ã¯ [`dataclasses` ã®å
éšãµããŒã](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel) ãããããã§ãã
ãã®ãããäžèšã®ããã«æç€ºçã« Pydantic ã䜿ã£ãŠããªãã³ãŒãã§ããFastAPI ã¯æšæºã® dataclass ã Pydantic ç¬èªã® dataclass ã«å€æããããã« Pydantic ã䜿çšããŠããŸãã
ãã€ãã©ãããFastAPI ã§ã¯å¿
èŠã«å¿ã㊠`def` ãš `async def` ãçµã¿åãããããŸãã
- ã©ã¡ãããã€äœ¿ããã®åŸ©ç¿ãå¿
èŠãªå Žåã¯ã[`async` ãš `await`](../async.md#in-a-hurry){.internal-link target=_blank} ã«é¢ããããã¥ã¡ã³ãã® _"In a hurry?"_ ã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã
+ ã©ã¡ãããã€äœ¿ããã®åŸ©ç¿ãå¿
èŠãªå Žåã¯ã[`async` ãš `await`](../async.md#in-a-hurry) ã«é¢ããããã¥ã¡ã³ãã® _"In a hurry?"_ ã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã
9. ãã® *path operation 颿°* ã¯ïŒå¯èœã§ã¯ãããŸããïŒdataclass èªäœã¯è¿ãããå
éšããŒã¿ãæã€èŸæžã®ãªã¹ããè¿ããŠããŸãã
`dataclasses` ãä»ã® Pydantic ã¢ãã«ãšçµã¿åãããããç¶æ¿ããããèªåã®ã¢ãã«ã«å«ããããã§ããŸãã
-詳ããã¯ã<a href="https://docs.pydantic.dev/latest/concepts/dataclasses/" class="external-link" target="_blank">dataclasses ã«é¢ãã Pydantic ããã¥ã¡ã³ã</a> ãåç
§ããŠãã ããã
+詳ããã¯ã[dataclasses ã«é¢ãã Pydantic ããã¥ã¡ã³ã](https://docs.pydantic.dev/latest/concepts/dataclasses/) ãåç
§ããŠãã ããã
## ããŒãžã§ã³ { #version }
æè¡ãæ°ã«ãªãæ¹ãžã®çްããªè©³çްã§ããð€
-å
éšçã«ã¯ãASGI ã®æè¡ä»æ§ã«ãããŠããã㯠<a href="https://asgi.readthedocs.io/en/latest/specs/lifespan.html" class="external-link" target="_blank">Lifespan ãããã³ã«</a> ã®äžéšã§ããã`startup` ãš `shutdown` ãšããã€ãã³ããå®çŸ©ãããŠããŸãã
+å
éšçã«ã¯ãASGI ã®æè¡ä»æ§ã«ãããŠããã㯠[Lifespan ãããã³ã«](https://asgi.readthedocs.io/en/latest/specs/lifespan.html) ã®äžéšã§ããã`startup` ãš `shutdown` ãšããã€ãã³ããå®çŸ©ãããŠããŸãã
/// info | æ
å ±
-Starlette ã® `lifespan` ãã³ãã©ã«ã€ããŠã¯ã<a href="https://www.starlette.dev/lifespan/" class="external-link" target="_blank">Starlette ã® Lifespan ããã¥ã¡ã³ã</a>ã§è©³ããèªãããšãã§ããŸãã
+Starlette ã® `lifespan` ãã³ãã©ã«ã€ããŠã¯ã[Starlette ã® Lifespan ããã¥ã¡ã³ã](https://www.starlette.dev/lifespan/)ã§è©³ããèªãããšãã§ããŸãã
ã³ãŒãã®ä»ã®é åã§äœ¿ãã lifespan ã®ç¶æ
ãã©ã®ããã«æ±ãããå«ãŸããŠããŸãã
## ãµãã¢ããªã±ãŒã·ã§ã³ { #sub-applications }
-ðš ãããã® lifespan ã€ãã³ãïŒstartup ãš shutdownïŒã¯ã¡ã€ã³ã®ã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠã®ã¿å®è¡ããã[ãµãã¢ããªã±ãŒã·ã§ã³ - ããŠã³ã](sub-applications.md){.internal-link target=_blank} ã«ã¯å®è¡ãããªãããšã«æ³šæããŠãã ããã
+ðš ãããã® lifespan ã€ãã³ãïŒstartup ãš shutdownïŒã¯ã¡ã€ã³ã®ã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠã®ã¿å®è¡ããã[ãµãã¢ããªã±ãŒã·ã§ã³ - ããŠã³ã](sub-applications.md) ã«ã¯å®è¡ãããªãããšã«æ³šæããŠãã ããã
æ¬ã¬ã€ãã§ã¯ãFastAPI ããã¯ãšã³ãåãã® **TypeScript SDK** ãçæããæ¹æ³ã説æããŸãã
-## ãªãŒããœãŒã¹ã® SDK ãžã§ãã¬ãŒã¿ { #open-source-sdk-generators }
+## ã\82ªã\83Œã\83\97ã\83³ã\82œã\83Œã\82¹ã\81® SDK ã\82žã\82§ã\83\8dã\83¬ã\83Œã\82¿ { #open-source-sdk-generators }
-å€çšéãªéžæè¢ãšã㊠<a href="https://openapi-generator.tech/" class="external-link" target="_blank">OpenAPI Generator</a> ããããŸããããã¯**倿°ã®ããã°ã©ãã³ã°èšèª**ããµããŒãããOpenAPI 仿§ãã SDK ãçæã§ããŸãã
+å€çšéãªéžæè¢ãšã㊠[OpenAPI Generator](https://openapi-generator.tech/) ããããŸããããã¯**倿°ã®ããã°ã©ãã³ã°èšèª**ããµããŒãããOpenAPI 仿§ãã SDK ãçæã§ããŸãã
-**TypeScript ã¯ã©ã€ã¢ã³ã**åãã«ã¯ã<a href="https://heyapi.dev/" class="external-link" target="_blank">Hey API</a> ãç®çç¹åã®ãœãªã¥ãŒã·ã§ã³ã§ãTypeScript ãšã³ã·ã¹ãã ã«æé©åãããäœéšãæäŸããŸãã
+**TypeScript ã¯ã©ã€ã¢ã³ã**åãã«ã¯ã[Hey API](https://heyapi.dev/) ãç®çç¹åã®ãœãªã¥ãŒã·ã§ã³ã§ãTypeScript ãšã³ã·ã¹ãã ã«æé©åãããäœéšãæäŸããŸãã
-ä»ã® SDK ãžã§ãã¬ãŒã¿ã¯ <a href="https://openapi.tools/#sdk" class="external-link" target="_blank">OpenAPI.Tools</a> ã§ãèŠã€ããããŸãã
+ä»ã® SDK ãžã§ãã¬ãŒã¿ã¯ [OpenAPI.Tools](https://openapi.tools/#sdk) ã§ãèŠã€ããããŸãã
/// tip | è±ç¥è
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãFastAPI ãã¹ãã³ãµãŒããŠããäŒæ¥ã«ããã**ãã³ãã£ãŒæ¯æŽ**ããã³**äŒæ¥æ¯æŽ**ã®ãœãªã¥ãŒã·ã§ã³ã玹ä»ããŸãããããã®è£œåã¯ãé«å質ãªçæ SDK ã«å ããŠã**è¿œå æ©èœ**ã**çµ±å**ãæäŸããŸãã
-âš [**FastAPI ãã¹ãã³ãµãŒãã**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} âš ããšã§ããããã®äŒæ¥ã¯ãã¬ãŒã ã¯ãŒã¯ãšãã®**ãšã³ã·ã¹ãã **ã®å¥å
šæ§ãš**æç¶å¯èœæ§**ãæ¯æŽããŠããŸãã
+âš [**FastAPI ãã¹ãã³ãµãŒãã**](../help-fastapi.md#sponsor-the-author) âš ããšã§ããããã®äŒæ¥ã¯ãã¬ãŒã ã¯ãŒã¯ãšãã®**ãšã³ã·ã¹ãã **ã®å¥å
šæ§ãš**æç¶å¯èœæ§**ãæ¯æŽããŠããŸãã
ãã®æ¯æŽã¯ã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>
+* [Speakeasy](https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship)
+* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
+* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
ãããã®ãœãªã¥ãŒã·ã§ã³ã®äžã«ã¯ãªãŒãã³ãœãŒã¹ãç¡ææ ãæäŸãããã®ããããééçã³ãããã¡ã³ããªãã§è©Šãããšãã§ããŸããä»ã®åçš SDK ãžã§ãã¬ãŒã¿ãååšãããªã³ã©ã€ã³ã§èŠã€ããããŸããð€
ããã§ 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>ã¯å
¬åŒãµã€ããåç
§ããŠãã ããã
+[`@hey-api/openapi-ts` ã®ã€ã³ã¹ããŒã«æ¹æ³](https://heyapi.dev/openapi-ts/get-started)ãã[çæç©ã®è©³çް](https://heyapi.dev/openapi-ts/output)ã¯å
¬åŒãµã€ããåç
§ããŠãã ããã
### SDK ã®å©çš { #using-the-sdk }
## ãããªãæ©èœ { #additional-features }
-ã¡ã€ã³ã®[ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã](../tutorial/index.md){.internal-link target=_blank}ã ãã§ã**FastAPI**ã®äž»èŠãªæ©èœãäžéãææ¡ããã«ã¯ååãªã¯ãã§ãã
+ã¡ã€ã³ã®[ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã](../tutorial/index.md)ã ãã§ã**FastAPI**ã®äž»èŠãªæ©èœãäžéãææ¡ããã«ã¯ååãªã¯ãã§ãã
以éã®ã»ã¯ã·ã§ã³ã§ã¯ããã®ä»ã®ãªãã·ã§ã³ãèšå®ãè¿œå æ©èœãèŠãŠãããŸãã
## å
ã«ãã¥ãŒããªã¢ã«ãèªã { #read-the-tutorial-first }
-ã¡ã€ã³ã®[ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã](../tutorial/index.md){.internal-link target=_blank}ã§åŸãç¥èãããã°ã**FastAPI**ã®æ©èœã®å€ãã¯åŒãç¶ãå©çšã§ããŸãã
+ã¡ã€ã³ã®[ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã](../tutorial/index.md)ã§åŸãç¥èãããã°ã**FastAPI**ã®æ©èœã®å€ãã¯åŒãç¶ãå©çšã§ããŸãã
ãŸãã以éã®ã»ã¯ã·ã§ã³ã§ã¯ããã§ã«ãããèªãã§ããŠãäž»èŠãªèãæ¹ãçè§£ããŠããããšãåæãšããŠããŸãã
# é«åºŠãªããã«ãŠã§ã¢ { #advanced-middleware }
-ã¡ã€ã³ã®ãã¥ãŒããªã¢ã«ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã«[ã«ã¹ã¿ã ããã«ãŠã§ã¢](../tutorial/middleware.md){.internal-link target=_blank}ã远å ããæ¹æ³ãåŠã³ãŸããã
+ã¡ã€ã³ã®ãã¥ãŒããªã¢ã«ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã«[ã«ã¹ã¿ã ããã«ãŠã§ã¢](../tutorial/middleware.md)ã远å ããæ¹æ³ãåŠã³ãŸããã
-ãããŠã[`CORSMiddleware` ã䜿ã£ã CORS ã®æ±ãæ¹](../tutorial/cors.md){.internal-link target=_blank}ãåŠã³ãŸããã
+ãããŠã[`CORSMiddleware` ã䜿ã£ã CORS ã®æ±ãæ¹](../tutorial/cors.md)ãåŠã³ãŸããã
ãã®ã»ã¯ã·ã§ã³ã§ã¯ããã®ä»ã®ããã«ãŠã§ã¢ã®äœ¿ãæ¹ãèŠãŠãããŸãã
äŸãã°:
-- <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>
+- [Uvicorn ã® `ProxyHeadersMiddleware`](https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py)
+- [MessagePack](https://github.com/florimondmanca/msgpack-asgi)
-ä»ã«å©çšå¯èœãªããã«ãŠã§ã¢ã«ã€ããŠã¯ã<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> ãåç
§ããŠãã ããã
+ä»ã«å©çšå¯èœãªããã«ãŠã§ã¢ã«ã€ããŠã¯ã[Starlette ã®ããã«ãŠã§ã¢ããã¥ã¡ã³ã](https://www.starlette.dev/middleware/)ã [ASGI Awesome List](https://github.com/florimondmanca/awesome-asgi) ãåç
§ããŠãã ããã
/// tip | è±ç¥è
-`callback_url` ã¯ãšãªãã©ã¡ãŒã¿ã¯ãPydantic ã® <a href="https://docs.pydantic.dev/latest/api/networks/" class="external-link" target="_blank">Url</a> åã䜿çšããŸãã
+`callback_url` ã¯ãšãªãã©ã¡ãŒã¿ã¯ãPydantic ã® [Url](https://docs.pydantic.dev/latest/api/networks/) åã䜿çšããŸãã
///
å®éã®ã³ãŒã«ããã¯ã¯åãªã 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> ã®ãããªãã®ã䜿ããŸãã
+èªåã§ã³ãŒã«ããã¯ãå®è£
ããå Žåã¯ã[HTTPX](https://www.python-httpx.org) ã [Requests](https://requests.readthedocs.io/) ã®ãããªãã®ã䜿ããŸãã
///
éåžžã® *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>ïŒåŸè¿°ïŒãå«ããããŸãã
+* *ãã¹* ã«ã¯ã*ããªãã® API* ã«éãããå
ã®ãªã¯ãšã¹ãã®ãã©ã¡ãŒã¿ãäžéšã倿°ãšããŠäœ¿ãã [OpenAPI 3 ã®åŒ](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression)ïŒåŸè¿°ïŒãå«ããããŸãã
### ã³ãŒã«ããã¯ã®ãã¹åŒ { #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>ã䜿çšã§ããŸãã
+ã³ãŒã«ããã¯ã® *ãã¹* ã«ã¯ã*ããªãã® API* ã«éãããå
ã®ãªã¯ãšã¹ãã®äžéšãå«ãããã [OpenAPI 3 ã®åŒ](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression)ã䜿çšã§ããŸãã
ãã®äŸã§ã¯ã`str` ã¯æ¬¡ã®ãšããã§ã:
### ããã¥ã¡ã³ããç¢ºèª { #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> ã«ã¢ã¯ã»ã¹ããŸãã
+ã¢ããªãèµ·åã㊠[http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) ã«ã¢ã¯ã»ã¹ããŸãã
ããªãã® *path operation* ã«ãCallbacksãã»ã¯ã·ã§ã³ãå«ãŸãã*å€éš API* ãã©ãããã¹ããã衚瀺ãããŠããã®ã確èªã§ããŸã:
### ããã¥ã¡ã³ãã®ç¢ºèª { #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> ã«ã¢ã¯ã»ã¹ããŸãã
+ã¢ããªãèµ·åãã[http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) ã«ã¢ã¯ã»ã¹ããŸãã
ããã¥ã¡ã³ãã«ã¯éåžžã® *path operations* ã«å ããŠã**webhooks** ã衚瀺ãããŸã:
远å ã®ã¬ã¹ãã³ã¹ã«ã€ããŠããã¢ãã«ãã¹ããŒã¿ã¹ã³ãŒããªã©ãšãšãã«å®£èšã§ããŸãã
-ããã«ã€ããŠã¯ããã¥ã¡ã³ãã«ç« å
šäœããããŸãã [OpenAPIã®è¿œå ã¬ã¹ãã³ã¹](additional-responses.md){.internal-link target=_blank} ã§èªããŸãã
+ããã«ã€ããŠã¯ããã¥ã¡ã³ãã«ç« å
šäœããããŸãã [OpenAPIã®è¿œå ã¬ã¹ãã³ã¹](additional-responses.md) ã§èªããŸãã
## OpenAPI Extra { #openapi-extra }
/// note | æè¡è©³çް
-OpenAPI仿§ã§ã¯ <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object" class="external-link" target="_blank">Operation Object</a> ãšåŒã°ããŠããŸãã
+OpenAPI仿§ã§ã¯ [Operation Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object) ãšåŒã°ããŠããŸãã
///
ããã¯äœã¬ãã«ãªæ¡åŒµãã€ã³ãã§ãã
-远å ã¬ã¹ãã³ã¹ã宣èšããã ããªãããã䟿å©ãªæ¹æ³ãšã㊠[OpenAPIã®è¿œå ã¬ã¹ãã³ã¹](additional-responses.md){.internal-link target=_blank} ã䜿ãããšãã§ããŸãã
+远å ã¬ã¹ãã³ã¹ã宣èšããã ããªãããã䟿å©ãªæ¹æ³ãšã㊠[OpenAPIã®è¿œå ã¬ã¹ãã³ã¹](additional-responses.md) ã䜿ãããšãã§ããŸãã
///
# ã¬ã¹ãã³ã¹ - ã¹ããŒã¿ã¹ã³ãŒãã®å€æŽ { #response-change-status-code }
-ãã§ã«ãããã©ã«ãã®[ã¬ã¹ãã³ã¹ã®ã¹ããŒã¿ã¹ã³ãŒã](../tutorial/response-status-code.md){.internal-link target=_blank}ãèšå®ã§ããããšããåç¥ãããããŸããã
+ãã§ã«ãããã©ã«ãã®[ã¬ã¹ãã³ã¹ã®ã¹ããŒã¿ã¹ã³ãŒã](../tutorial/response-status-code.md)ãèšå®ã§ããããšããåç¥ãããããŸããã
ãããå Žåã«ãã£ãŠã¯ãããã©ã«ããšã¯ç°ãªãã¹ããŒã¿ã¹ã³ãŒããè¿ãå¿
èŠããããŸãã
ãã㊠`response_model` ã宣èšããŠããã°ãè¿ãããªããžã§ã¯ãã®ãã£ã«ã¿ãšå€æã«ã¯åŒãç¶ãããã䜿ãããŸãã
-FastAPI ã¯ãã®*äžæçãª*ã¬ã¹ãã³ã¹ããã¹ããŒã¿ã¹ã³ãŒãïŒããã³ Cookie ãšããããŒïŒãåãåºãã`response_model` ã«ãã£ãŠãã£ã«ã¿æžã¿ã®è¿åŽå€ãå«ãæçµçãªã¬ã¹ãã³ã¹ã«åæ ããŸãã
+**FastAPI** ã¯ãã®*äžæçãª*ã¬ã¹ãã³ã¹ããã¹ããŒã¿ã¹ã³ãŒãïŒããã³ Cookie ãšããããŒïŒãåãåºãã`response_model` ã«ãã£ãŠãã£ã«ã¿æžã¿ã®è¿åŽå€ãå«ãæçµçãªã¬ã¹ãã³ã¹ã«åæ ããŸãã
ãŸãã`Response` ãã©ã¡ãŒã¿ã¯äŸåé¢ä¿å
ã«å®£èšããŠã¹ããŒã¿ã¹ã³ãŒããèšå®ããããšãã§ããŸãããã ããæåŸã«èšå®ããããã®ãåªå
ãããç¹ã«æ³šæããŠãã ããã
ã³ãŒãã§ `Response` ãçŽæ¥è¿ããšãã«ãCookie ãäœæããããšãã§ããŸãã
-ãã®ããã«ã¯ã[Response ãçŽæ¥è¿ã](response-directly.md){.internal-link target=_blank} ã§èª¬æãããŠãããšããã«ã¬ã¹ãã³ã¹ãäœæããŸãã
+ãã®ããã«ã¯ã[Response ãçŽæ¥è¿ã](response-directly.md) ã§èª¬æãããŠãããšããã«ã¬ã¹ãã³ã¹ãäœæããŸãã
ãã®ã¬ã¹ãã³ã¹ã« Cookie ãèšå®ããŠããè¿ããŸã:
///
-å©çšå¯èœãªãã¹ãŠã®ãã©ã¡ãŒã¿ããªãã·ã§ã³ã«ã€ããŠã¯ã<a href="https://www.starlette.dev/responses/#set-cookie" class="external-link" target="_blank">Starlette ã®ããã¥ã¡ã³ã</a>ãåç
§ããŠãã ããã
+å©çšå¯èœãªãã¹ãŠã®ãã©ã¡ãŒã¿ããªãã·ã§ã³ã«ã€ããŠã¯ã[Starlette ã®ããã¥ã¡ã³ã](https://www.starlette.dev/responses/#set-cookie)ãåç
§ããŠãã ããã
# ã¬ã¹ãã³ã¹ãçŽæ¥è¿ã { #return-a-response-directly }
-**FastAPI** ã® *path operation* ã§ã¯ãéåžžã¯ä»»æã®ããŒã¿ãè¿ãããšãã§ããŸã: äŸãã°ã `dict`ã`list`ãPydanticã¢ãã«ãããŒã¿ããŒã¹ã¢ãã«ãªã©ã§ãã
+**FastAPI** ã® *path operation* ã§ã¯ãéåžžã¯ä»»æã®ããŒã¿ãè¿ãããšãã§ããŸã: äŸãã°ã`dict`ã`list`ãPydanticã¢ãã«ãããŒã¿ããŒã¹ã¢ãã«ãªã©ã§ãã
-ããã©ã«ãã§ã¯ã**FastAPI** 㯠[JSONäºæãšã³ã³ãŒã](../tutorial/encoder.md){.internal-link target=_blank} ã§èª¬æãããŠãã `jsonable_encoder` ã«ãããè¿ãå€ãèªåçã«JSONã«å€æããŸãã
+[ã¬ã¹ãã³ã¹ã¢ãã«](../tutorial/response-model.md) ã宣èšããå ŽåãFastAPI 㯠Pydantic ã䜿ã£ãŠããŒã¿ãJSONã«ã·ãªã¢ã©ã€ãºããŸãã
-ã\81\93ã\81®ã\81šã\81\8dÚ\83\8cåŸ\8cã\81§ã\81¯ã\80\81JSON˼\92Ê\8f\9bã\81ªã\83\87ã\83΋\82¿ (ÀŸ\8bã\81\88ã\81°`dict`) ã\82\92ã\80\81ã\82¯ã\83©ã\82ۋ\82¢ã\83³ã\83\88ã\81žé\80\81À¿¡ã\81\95ã\82\8cã\82\8bã\83‹\82¹ã\83\9dã\83³ã\82¹ã\81šã\81\97ã\81Šå\88©ç\94šã\81\95ã\82\8cã\82\8b `JSONResponse` ã\81®ÀžÂã\81«å\90«ã\82\81ãŸãã
+ã\83‹\82¹ã\83\9dã\83³ã\82¹ã\83¢ã\83\87ã\83«ã\82\92宣ښ\80ã\81\97ã\81ªã\81\84堎å\90\88ã\80\81FastAPI ã\81¯ [JSON˼\92Ê\8f\9bã\82šã\83³ã\82³ã\83΋\83\80](../tutorial/encoder.md) ã\81§Úª¬Ê\98\8eã\81\95ã\82\8cã\81Šã\81\84ã\82\8b `jsonable_encoder` ã\82\92Àœ¿ç\94šã\81\97ã\80\81ã\81\9dã\81®çµ\90Ê\9e\9cã\82\92 `JSONResponse` ã\81«å\85¥ã\82\8cãŸãã
-ã\81\97ã\81\8bã\81\97ã\80\81*path operation* ã\81\8bã\82\89 `JSONResponse` ã\82\92ç\9bŽÊ\8eÂ¥è¿ãããšãã§ããŸãã
+ã\81Ÿã\81\9fã\80\81`JSONResponse` ã\82\92ç\9bŽÊ\8e¥Àœ\9cÊ\88\90ã\81\97ã\81Šè¿ãããšãã§ããŸãã
-ããã¯äŸãã°ãã«ã¹ã¿ã ããããŒãcookieãè¿ããšãã«äŸ¿å©ã§ãã
+/// tip
+
+éåžžã¯ã`JSONResponse` ãçŽæ¥è¿ããããã[ã¬ã¹ãã³ã¹ã¢ãã«](../tutorial/response-model.md) ã䜿ãã»ããããã©ãŒãã³ã¹ã倧å¹
ã«è¯ããªããŸããããã¯ãPydantic ã«ããã·ãªã¢ã©ã€ãºã Rust ã§å®è¡ãããããã§ãã
+
+///
## `Response` ãè¿ã { #return-a-response }
å®éã¯ã`Response` ããã®ãµãã¯ã©ã¹ãè¿ãããšãã§ããŸãã
-/// tip | è±ç¥è
+/// info
-`JSONResponse` ããèªäœã¯ã `Response` ã®ãµãã¯ã©ã¹ã§ãã
+`JSONResponse` ããèªäœã¯ã`Response` ã®ãµãã¯ã©ã¹ã§ãã
///
ããã¯å€ãã®æè»æ§ãæäŸããŸããä»»æã®ããŒã¿åãè¿ããããä»»æã®ããŒã¿å®£èšãããªããŒã·ã§ã³ããªãŒããŒã©ã€ãã§ããŸãã
+åæã«å€ãã®è²¬ä»»ã䌎ããŸããè¿ãããŒã¿ãæ£ãããæ£ãããã©ãŒãããã§ãããã·ãªã¢ã©ã€ãºå¯èœã§ããããšãªã©ããããªããä¿èšŒããªããã°ãªããŸããã
+
## `jsonable_encoder` ã `Response` ã®äžã§äœ¿ã { #using-the-jsonable-encoder-in-a-response }
**FastAPI** ã¯ããªããè¿ã `Response` ã«å¯ŸããŠäœã倿Žãå ããªãã®ã§ãã³ã³ãã³ããæºåã§ããŠããããšãä¿èšŒããªããã°ãªããŸããã
## ã«ã¹ã¿ã `Response` ãè¿ã { #returning-a-custom-response }
-äžèšã®äŸã§ã¯å¿
èŠãªéšåãå
šãŠç€ºããŠããŸãããããŸã䟿å©ã§ã¯ãããŸããã`item` ãçŽæ¥è¿ãããšãã§ãããã**FastAPI** ã¯ããã `dict` ã«å€æã㊠`JSONResponse`ãã«å«ããŠããããªã©ããã¹ãŠãããã©ã«ãã®åäœã§ãã
+äžèšã®äŸã§ã¯å¿
èŠãªéšåãå
šãŠç€ºããŠããŸãããããŸã䟿å©ã§ã¯ãããŸããã`item` ãçŽæ¥è¿ãããšãã§ãããã**FastAPI** ã¯ããã `dict` ã«å€æã㊠`JSONResponse` ã«å«ããŠããããªã©ããã¹ãŠãããã©ã«ãã®åäœã§ãã
ã§ã¯ãããã䜿ã£ãŠã«ã¹ã¿ã ã¬ã¹ãã³ã¹ãã©ãè¿ããèŠãŠã¿ãŸãããã
-<a href="https://en.wikipedia.org/wiki/XML" class="external-link" target="_blank">XML</a>ã¬ã¹ãã³ã¹ãè¿ããããšããŸãããã
+[XML](https://en.wikipedia.org/wiki/XML)ã¬ã¹ãã³ã¹ãè¿ããããšããŸãããã
XMLãæååã«ãã`Response` ã«å«ãããããè¿ããŸãã
{* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *}
+## Response Model ã®ä»çµã¿ { #how-a-response-model-works }
+
+path operation ã§ [Response Model - æ»ãå€ã®å](../tutorial/response-model.md) ã宣èšãããšã**FastAPI** ã¯ããã䜿ã£ãŠ Pydantic ã«ããããŒã¿ãJSONã«ã·ãªã¢ã©ã€ãºããŸãã
+
+{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *}
+
+ãã㯠Rust åŽã§è¡ããããããéåžžã® Python ãš `JSONResponse` ã¯ã©ã¹ã§è¡ãå Žåãããããã©ãŒãã³ã¹ã¯ã¯ããã«è¯ããªããŸãã
+
+`response_model` ãæ»ãå€ã®åã䜿çšããå ŽåãFastAPI ã¯ããŒã¿å€æã«ïŒäœéã«ãªãããïŒ`jsonable_encoder` ã `JSONResponse` ã¯ã©ã¹ã䜿ããŸããã
+
+代ããã«ãresponse modelïŒãŸãã¯æ»ãå€ã®åïŒã䜿ã£ãŠ Pydantic ãçæãã JSON ã®ãã€ãåããã®ãŸãŸçšããJSON çšã®æ£ããã¡ãã£ã¢ã¿ã€ãïŒ`application/json`ïŒãæã€ `Response` ãçŽæ¥è¿ããŸãã
+
## åè { #notes }
`Response` ãçŽæ¥è¿ãå ŽåãããªããŒã·ã§ã³ãã倿 (ã·ãªã¢ã©ã€ãº) ããèªåããã¥ã¡ã³ãã¯è¡ãããŸããã
-ãããã[Additional Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}ã«èšèŒãããããã«ããã¥ã¡ã³ããæžãããšãã§ããŸãã
+ãããã[Additional Responses in OpenAPI](additional-responses.md)ã«èšèŒãããããã«ããã¥ã¡ã³ããæžãããšãã§ããŸãã
åŸã®ã»ã¯ã·ã§ã³ã§ãã«ã¹ã¿ã `Response` ã䜿çšã»å®£èšããªãããèªåçãªããŒã¿å€æãããã¥ã¡ã³ããŒã·ã§ã³ãè¡ãæ¹æ³ã説æããŸãã
`Response` ãçŽæ¥è¿ãå Žåã«ãããããŒã远å ã§ããŸãã
-[Response ãçŽæ¥è¿ã](response-directly.md){.internal-link target=_blank} ã§èª¬æããããã«ã¬ã¹ãã³ã¹ãäœæããããããŒã远å ã®ãã©ã¡ãŒã¿ãšããŠæž¡ããŸã:
+[Response ãçŽæ¥è¿ã](response-directly.md) ã§èª¬æããããã«ã¬ã¹ãã³ã¹ãäœæããããããŒã远å ã®ãã©ã¡ãŒã¿ãšããŠæž¡ããŸã:
{* ../../docs_src/response_headers/tutorial001_py310.py hl[10:12] *}
## ã«ã¹ã¿ã ããã㌠{ #custom-headers }
-ç¬èªã®ã«ã¹ã¿ã ããããŒã¯ã<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">`X-` ãã¬ãã£ãã¯ã¹ã䜿ã£ãŠ</a>远å ã§ããããšã«æ³šæããŠãã ããã
+ç¬èªã®ã«ã¹ã¿ã ããããŒã¯ã[`X-` ãã¬ãã£ãã¯ã¹ã䜿ã£ãŠ](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)远å ã§ããããšã«æ³šæããŠãã ããã
-ãã ãããã©ãŠã¶ã®ã¯ã©ã€ã¢ã³ãã«èŠããããã«ãããã«ã¹ã¿ã ããããŒãããå Žåã¯ã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` ãã©ã¡ãŒã¿ã䜿çšããŸãã
+ãã ãããã©ãŠã¶ã®ã¯ã©ã€ã¢ã³ãã«èŠããããã«ãããã«ã¹ã¿ã ããããŒãããå Žåã¯ãCORS èšå®ã«ãããã远å ããå¿
èŠããããŸãïŒ[CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md) ãåç
§ïŒããã®ãšãã[Starlette ã® CORS ããã¥ã¡ã³ã](https://www.starlette.dev/middleware/#corsmiddleware)ã«èšèŒã® `expose_headers` ãã©ã¡ãŒã¿ã䜿çšããŸãã
äŸåé¢ä¿ã䜿ã£ãŠãŠãŒã¶ãŒåãšãã¹ã¯ãŒããæ£ãããã確èªããŸãã
-ããã«ã¯ãPython æšæºã¢ãžã¥ãŒã« <a href="https://docs.python.org/3/library/secrets.html" class="external-link" target="_blank">`secrets`</a> ãçšããŠãŠãŒã¶ãŒåãšãã¹ã¯ãŒããæ€èšŒããŸãã
+ããã«ã¯ãPython æšæºã¢ãžã¥ãŒã« [`secrets`](https://docs.python.org/3/library/secrets.html) ãçšããŠãŠãŒã¶ãŒåãšãã¹ã¯ãŒããæ€èšŒããŸãã
`secrets.compare_digest()` 㯠`bytes` ããASCII æåïŒè±èªã®æåïŒã®ã¿ãå«ã `str` ãåãåãå¿
èŠããããŸããã€ãŸãã`Sebastián` ã®ããã« `á` ãå«ãæåã§ã¯ãã®ãŸãŸã§ã¯åäœããŸããã
```Python
if not (credentials.username == "stanleyjobson") or not (credentials.password == "swordfish"):
- # Return some error
+ # äœããã®ãšã©ãŒãè¿ã
...
```
## è¿œå æ©èœ { #additional-features }
-[ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã: ã»ãã¥ãªãã£](../../tutorial/security/index.md){.internal-link target=_blank}ã§æ±ã£ããã®ä»¥å€ã«ããã»ãã¥ãªãã£ãæ±ãããã®è¿œå æ©èœãããã€ããããŸãã
+[ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã: ã»ãã¥ãªãã£](../../tutorial/security/index.md)ã§æ±ã£ããã®ä»¥å€ã«ããã»ãã¥ãªãã£ãæ±ãããã®è¿œå æ©èœãããã€ããããŸãã
/// tip | è±ç¥è
-次ã®ç¯ã¯å¿
ããããé«åºŠãã§ã¯ãããŸããã
+次ã®ç¯ã¯**å¿
ããããé«åºŠãã§ã¯ãããŸãã**ã
ããªãã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ããã®äžã®ããããã«è§£æ±ºçããããããããŸããã
## ãŸããã¥ãŒããªã¢ã«ãèªã { #read-the-tutorial-first }
-以äžã®ç¯ã¯ããã§ã«ã¡ã€ã³ã®[ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã: ã»ãã¥ãªãã£](../../tutorial/security/index.md){.internal-link target=_blank}ãèªãã§ããããšãåæãšããŸãã
+以äžã®ç¯ã¯ããã§ã«ã¡ã€ã³ã®[ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã: ã»ãã¥ãªãã£](../../tutorial/security/index.md)ãèªãã§ããããšãåæãšããŸãã
ããããåãæŠå¿µã«åºã¥ããŠããŸãããããã€ãã®è¿œå æ©èœãå©çšã§ããŸãã
## å
šäœå { #global-view }
-ãŸããã¡ã€ã³ã®**ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã**ã«ãã [OAuth2ïŒãã¹ã¯ãŒãããã·ã¥åããïŒãBearer ãš JWT ããŒã¯ã³](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank} ã®äŸãã倿Žãããéšåããã¹ã³ãŒãä»ã OAuth2 ã䜿ã£ãŠææ©ãèŠãŠã¿ãŸãããã
+ãŸããã¡ã€ã³ã®**ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã**ã«ãã [OAuth2ïŒãã¹ã¯ãŒãããã·ã¥åããïŒãBearer ãš JWT ããŒã¯ã³](../../tutorial/security/oauth2-jwt.md) ã®äŸãã倿Žãããéšåããã¹ã³ãŒãä»ã OAuth2 ã䜿ã£ãŠææ©ãèŠãŠã¿ãŸãããã
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *}
## ãã³ã¬ãŒã¿ `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` ã䜿çšã§ããŸãã
+ãã³ã¬ãŒã¿ã® `dependencies` ãã©ã¡ãŒã¿ã« `Depends` ã® `list` ãå®çŸ©ã§ããã®ãšåæ§ïŒ[path operation ãã³ã¬ãŒã¿ã§ã®äŸåé¢ä¿](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md) åç
§ïŒãããã§ `scopes` ãæå®ãã `Security` ã䜿çšã§ããŸãã
/// tip | è±ç¥è
-ç°å¢å€æ°ã«ã€ããŠçè§£ããã«ã¯ã[ç°å¢å€æ°](../environment-variables.md){.internal-link target=_blank}ãåç
§ããŠãã ããã
+ç°å¢å€æ°ã«ã€ããŠçè§£ããã«ã¯ã[ç°å¢å€æ°](../environment-variables.md)ãåç
§ããŠãã ããã
///
## 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 ã«ã¯ç°å¢å€æ°ããæ¥ãèšå®ãæ±ãããã®åªãããŠãŒãã£ãªãã£ãããã[Pydantic: Settings management](https://docs.pydantic.dev/latest/concepts/pydantic_settings/) ã§æäŸãããŠããŸãã
### `pydantic-settings` ã®ã€ã³ã¹ããŒã« { #install-pydantic-settings }
-ãŸãã[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank}ãäœæããŠæå¹åãã`pydantic-settings` ããã±ãŒãžãã€ã³ã¹ããŒã«ããŸã:
+ãŸãã[ä»®æ³ç°å¢](../virtual-environments.md)ãäœæããŠæå¹åãã`pydantic-settings` ããã±ãŒãžãã€ã³ã¹ããŒã«ããŸã:
<div class="termy">
## å¥ã¢ãžã¥ãŒã«ã§ã®èšå® { #settings-in-another-module }
-[å€§èŠæš¡ã¢ããªã±ãŒã·ã§ã³ - è€æ°ãã¡ã€ã«](../tutorial/bigger-applications.md){.internal-link target=_blank} ã§èŠãããã«ããããã®èšå®ãå¥ã®ã¢ãžã¥ãŒã«ãã¡ã€ã«ã«çœ®ãããšãã§ããŸãã
+[å€§èŠæš¡ã¢ããªã±ãŒã·ã§ã³ - è€æ°ãã¡ã€ã«](../tutorial/bigger-applications.md) ã§èŠãããã«ããããã®èšå®ãå¥ã®ã¢ãžã¥ãŒã«ãã¡ã€ã«ã«çœ®ãããšãã§ããŸãã
ããšãã°ã`config.py` ãšãããã¡ã€ã«ã«æ¬¡ã®ããã«æžããŸã:
/// tip | è±ç¥è
-[å€§èŠæš¡ã¢ããªã±ãŒã·ã§ã³ - è€æ°ãã¡ã€ã«](../tutorial/bigger-applications.md){.internal-link target=_blank} ã§èŠãããã«ã`__init__.py` ãã¡ã€ã«ãå¿
èŠã§ãã
+[å€§èŠæš¡ã¢ããªã±ãŒã·ã§ã³ - è€æ°ãã¡ã€ã«](../tutorial/bigger-applications.md) ã§èŠãããã«ã`__init__.py` ãã¡ã€ã«ãå¿
èŠã§ãã
///
///
-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> ãåç
§ããŠãã ããã
+Pydantic ã¯å€éšã©ã€ãã©ãªã䜿ã£ãŠãã®çš®ã®ãã¡ã€ã«ããã®èªã¿èŸŒã¿ããµããŒãããŠããŸãã詳现㯠[Pydantic Settings: Dotenv (.env) support](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support) ãåç
§ããŠãã ããã
/// tip | è±ç¥è
/// tip | è±ç¥è
-`model_config` 屿§ã¯ Pydantic ã®èšå®å°çšã§ãã詳ãã㯠<a href="https://docs.pydantic.dev/latest/concepts/config/" class="external-link" target="_blank">Pydantic: Concepts: Configuration</a> ãåç
§ããŠãã ããã
+`model_config` 屿§ã¯ Pydantic ã®èšå®å°çšã§ãã詳ãã㯠[Pydantic: Concepts: Configuration](https://docs.pydantic.dev/latest/concepts/config/) ãåç
§ããŠãã ããã
///
ãã®æ¹æ³ã¯ãã»ãšãã©ã°ããŒãã«å€æ°ã®ããã«æ¯ãèããŸããããããäŸå颿°ã䜿ã£ãŠããã®ã§ããã¹ãã®ããã«ç°¡åã«ãªãŒããŒã©ã€ãã§ããŸãã
-`@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>ãåç
§ããŠãã ããã
+`@lru_cache` 㯠Python æšæºã©ã€ãã©ãªã® `functools` ã®äžéšã§ãã詳现㯠[Python ã® `@lru_cache` ããã¥ã¡ã³ã](https://docs.python.org/3/library/functools.html#functools.lru_cache)ãåç
§ããŠãã ããã
## ãŸãšã { #recap }
### èªå API ããã¥ã¡ã³ãã®ç¢ºèª { #check-the-automatic-api-docs }
-ã\81§ã\81¯ã\80\81`fastapi` ã\82³ã\83\9eã\83³ã\83\89ã\81§ã\81\93ã\81®ã\83\95ã\82¡ã\82€ã\83«ã\82\92å®\9fÚ¡\8cã\81\97ã\81Ÿã\81\99:
+ã§ã¯ã`fastapi` ã³ãã³ããå®è¡ããŸã:
<div class="termy">
```console
-$ fastapi dev main.py
+$ fastapi dev
<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> ãéããŸãã
+ãããŠã[http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) ãéããŸãã
ã¡ã€ã³ã¢ããªçšã®èªå 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> ãéããŸãã
+次ã«ããµãã¢ããªã±ãŒã·ã§ã³ã®ããã¥ã¡ã³ã [http://127.0.0.1:8000/subapi/docs](http://127.0.0.1:8000/subapi/docs) ãéããŸãã
ãµãã¢ããªã±ãŒã·ã§ã³çšã®èªå API ããã¥ã¡ã³ãã衚瀺ããããã®ã¢ããªèªèº«ã® path operation ã®ã¿ããæ£ãããµããã¹æ¥é èŸ `/subapi` ã®äžã§è¡šç€ºãããŸã:
ããã«ããµãã¢ããªã±ãŒã·ã§ã³èªèº«ãå¥ã®ãµãã¢ããªã±ãŒã·ã§ã³ãããŠã³ãããŠããŠãåé¡ãããŸãããFastAPI ããããã® `root_path` ããã¹ãŠèªåçã«åŠçããããã§ãã
-`root_path` ã®è©³çްãæç€ºçãªæå®æ¹æ³ã«ã€ããŠã¯ã[ãããã·ã®èåŸã§](behind-a-proxy.md){.internal-link target=_blank} ã®ç¯ã§åŠã¹ãŸãã
+`root_path` ã®è©³çްãæç€ºçãªæå®æ¹æ³ã«ã€ããŠã¯ã[ãããã·ã®èåŸã§](behind-a-proxy.md) ã®ç¯ã§åŠã¹ãŸãã
## äŸåé¢ä¿ã®ã€ã³ã¹ããŒã« { #install-dependencies }
-[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank} ãäœæããŠæå¹åãã`jinja2` ãã€ã³ã¹ããŒã«ããŸã:
+[ä»®æ³ç°å¢](../virtual-environments.md) ãäœæããŠæå¹åãã`jinja2` ãã€ã³ã¹ããŒã«ããŸã:
<div class="termy">
## ããã«è©³ãã { #more-details }
-ãã詳ããå
容ïŒãã³ãã¬ãŒãã®ãã¹ãæ¹æ³ãªã©ïŒã«ã€ããŠã¯ã<a href="https://www.starlette.dev/templates/" class="external-link" target="_blank">Starlette ã®ãã³ãã¬ãŒãã«é¢ããããã¥ã¡ã³ã</a>ãåç
§ããŠãã ããã
+ãã詳ããå
容ïŒãã³ãã¬ãŒãã®ãã¹ãæ¹æ³ãªã©ïŒã«ã€ããŠã¯ã[Starlette ã®ãã³ãã¬ãŒãã«é¢ããããã¥ã¡ã³ã](https://www.starlette.dev/templates/)ãåç
§ããŠãã ããã
/// note | åè
-詳现ã«ã€ããŠã¯ãStarlette ã®ããã¥ã¡ã³ãã<a href="https://www.starlette.dev/testclient/#testing-websocket-sessions" class="external-link" target="_blank">WebSocket ã®ãã¹ã</a>ããåç
§ããŠãã ããã
+詳现ã«ã€ããŠã¯ãStarlette ã®ããã¥ã¡ã³ãã[WebSocket ã®ãã¹ã](https://www.starlette.dev/testclient/#testing-websocket-sessions)ããåç
§ããŠãã ããã
///
## `Request` ãªããžã§ã¯ãã®è©³çް { #details-about-the-request-object }
-**FastAPI** ã¯å
éšçã«ã¯ **Starlette** ã®äžã«ããã€ãã®ããŒã«å±€ãèŒãããã®ãªã®ã§ãå¿
èŠã«å¿ã㊠Starlette ã® <a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">`Request`</a> ãªããžã§ã¯ããçŽæ¥äœ¿ããŸãã
+**FastAPI** ã¯å
éšçã«ã¯ **Starlette** ã®äžã«ããã€ãã®ããŒã«å±€ãèŒãããã®ãªã®ã§ãå¿
èŠã«å¿ã㊠Starlette ã® [`Request`](https://www.starlette.dev/requests/) ãªããžã§ã¯ããçŽæ¥äœ¿ããŸãã
ãŸãã`Request` ãªããžã§ã¯ãããçŽæ¥ããŒã¿ïŒäŸ: ããã£ïŒãååŸããå Žåããã®ããŒã¿ã¯ FastAPI ã«ãã£ãŠæ€èšŒã»å€æã»ããã¥ã¡ã³ãåïŒOpenAPI ã«ããèªå API ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹åãïŒãããŸããã
## `Request` ã®ããã¥ã¡ã³ã { #request-documentation }
-ãã詳ããã¯ã<a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">å
¬åŒ Starlette ããã¥ã¡ã³ããµã€ãã® `Request` ãªããžã§ã¯ã</a>ãåç
§ããŠãã ããã
+ãã詳ããã¯ã[å
¬åŒ Starlette ããã¥ã¡ã³ããµã€ãã® `Request` ãªããžã§ã¯ã](https://www.starlette.dev/requests/)ãåç
§ããŠãã ããã
/// note | æè¡è©³çް
# WebSockets { #websockets }
-**FastAPI**ã§<a href="https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API" class="external-link" target="_blank">WebSockets</a>ã䜿çšã§ããŸãã
+**FastAPI**ã§[WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API)ã䜿çšã§ããŸãã
## `websockets`ã®ã€ã³ã¹ããŒã« { #install-websockets }
-[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank}ãäœæãããããæå¹åããŠããããWebSocketããããã³ã«ãç°¡åã«äœ¿ããããã«ããPythonã©ã€ãã©ãªã®`websockets`ãã€ã³ã¹ããŒã«ããŠãã ããã
+[ä»®æ³ç°å¢](../virtual-environments.md)ãäœæãããããæå¹åããŠããããWebSocketããããã³ã«ãç°¡åã«äœ¿ããããã«ããPythonã©ã€ãã©ãªã®`websockets`ãã€ã³ã¹ããŒã«ããŠãã ããã
<div class="termy">
## 詊ããŠã¿ã { #try-it }
-ã\83\95ã\82¡ã\82ۋ\83«å\90\8dã\81\8c `main.py` ã\81§ã\81\82ã\82\8b堎å\90\88ã\80\81À»¥Àž\8bã\81§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŸãã
+ã\82³ã\83΋\83\89ã\82\92 `main.py` ã\81«å\85¥ã\82\8cã\81Šã\80\81ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŸãã
<div class="termy">
```console
-$ fastapi dev main.py
+$ fastapi dev
<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" class="external-link" target="_blank">http://127.0.0.1:8000</a> ãéããŸãã
+ãã©ãŠã¶ã§ [http://127.0.0.1:8000](http://127.0.0.1:8000) ãéããŸãã
次ã®ãããªã·ã³ãã«ãªããŒãžã衚瀺ãããŸãã
ããã¯WebSocketã§ããããã`HTTPException` ãçºçãããããšã¯ããŸãæå³ããããŸããã代ããã« `WebSocketException` ãçºçãããŸãã
-ã¯ããŒãžã³ã°ã³ãŒãã¯ã<a href="https://tools.ietf.org/html/rfc6455#section-7.4.1" class="external-link" target="_blank">仿§ã§å®çŸ©ãããæå¹ãªã³ãŒã</a>ã®äžãã䜿çšããããšãã§ããŸãã
+ã¯ããŒãžã³ã°ã³ãŒãã¯ã[仿§ã§å®çŸ©ãããæå¹ãªã³ãŒã](https://tools.ietf.org/html/rfc6455#section-7.4.1)ã®äžãã䜿çšããããšãã§ããŸãã
///
### äŸåé¢ä¿ãçšããŠWebSocketsã詊ããŠã¿ã { #try-the-websockets-with-dependencies }
-ã\83\95ã\82¡ã\82€ã\83«å\90\8dã\81\8c `main.py` ã\81§ã\81\82ã\82\8b堎å\90\88ã\80\81À»¥Àž\8bã\81§ã\82¢ã\83\97ã\83ªã\82±ã\83Œã\82·ã\83§ã\83³ã\82\92å®\9fÚ¡\8cã\81\97ã\81Ÿã\81\99ã\80\82
+ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŸãã
<div class="termy">
```console
-$ fastapi dev main.py
+$ fastapi dev
<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" class="external-link" target="_blank">http://127.0.0.1:8000</a> ãéããŸãã
+ãã©ãŠã¶ã§ [http://127.0.0.1:8000](http://127.0.0.1:8000) ãéããŸãã
ããã§ã以äžãèšå®ã§ããŸãã
ãããããã¹ãŠãã¡ã¢ãªå
ã®åäžã®ãªã¹ãã§åŠçããããããããã»ã¹ã®å®è¡äžã«ã®ã¿æ©èœããåäžã®ããã»ã¹ã§ã®ã¿æ©èœããããšã«æ³šæããŠãã ããã
-FastAPIãšç°¡åã«çµ±åã§ããŠãRedisãPostgreSQLãªã©ã§ãµããŒããããŠãããããå
ç¢ãªãã®ãå¿
èŠãªãã<a href="https://github.com/encode/broadcaster" class="external-link" target="_blank">encode/broadcaster</a> ã確èªããŠãã ããã
+FastAPIãšç°¡åã«çµ±åã§ããŠãRedisãPostgreSQLãªã©ã§ãµããŒããããŠãããããå
ç¢ãªãã®ãå¿
èŠãªãã[encode/broadcaster](https://github.com/encode/broadcaster) ã確èªããŠãã ããã
///
ãªãã·ã§ã³ã®è©³çްã«ã€ããŠã¯ãStarletteã®ããã¥ã¡ã³ãã確èªããŠãã ããã
-* <a href="https://www.starlette.dev/websockets/" class="external-link" target="_blank">`WebSocket` ã¯ã©ã¹</a>.
-* <a href="https://www.starlette.dev/endpoints/#websocketendpoint" class="external-link" target="_blank">ã¯ã©ã¹ããŒã¹ã®WebSocketåŠç</a>.
+* [`WebSocket` ã¯ã©ã¹](https://www.starlette.dev/websockets/)ã
+* [ã¯ã©ã¹ããŒã¹ã®WebSocketåŠç](https://www.starlette.dev/endpoints/#websocketendpoint)ã
# WSGI ã®çµã¿èŸŒã¿ - FlaskãDjango ãªã© { #including-wsgi-flask-django-others }
-[ãµãã¢ããªã±ãŒã·ã§ã³ - ããŠã³ã](sub-applications.md){.internal-link target=_blank}ã[ãããã·ã®èåŸ](behind-a-proxy.md){.internal-link target=_blank} ã§èŠãããã«ãWSGI ã¢ããªã±ãŒã·ã§ã³ãããŠã³ãã§ããŸãã
+[ãµãã¢ããªã±ãŒã·ã§ã³ - ããŠã³ã](sub-applications.md)ã[ãããã·ã®èåŸ](behind-a-proxy.md) ã§èŠãããã«ãWSGI ã¢ããªã±ãŒã·ã§ã³ãããŠã³ãã§ããŸãã
ãã®ããã« `WSGIMiddleware` ã䜿çšããŠãFlask ã Django ãªã©ã® WSGI ã¢ããªãã©ããã§ããŸãã
ãã以å€ã¯ **FastAPI** ãåŠçããŸãã
-å®è¡ã㊠<a href="http://localhost:8000/v1/" class="external-link" target="_blank">http://localhost:8000/v1/</a> ã«ã¢ã¯ã»ã¹ãããšãFlask ããã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸã:
+å®è¡ã㊠[http://localhost:8000/v1/](http://localhost:8000/v1/) ã«ã¢ã¯ã»ã¹ãããšãFlask ããã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸã:
```txt
Hello, World from Flask!
```
-ããã« <a href="http://localhost:8000/v2" class="external-link" target="_blank">http://localhost:8000/v2</a> ã«ã¢ã¯ã»ã¹ãããšãFastAPI ããã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸã:
+ããã« [http://localhost:8000/v2](http://localhost:8000/v2) ã«ã¢ã¯ã»ã¹ãããšãFastAPI ããã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸã:
```JSON
{
## 以åã®ããŒã« { #previous-tools }
-### <a href="https://www.djangoproject.com/" class="external-link" target="_blank">Django</a> { #django }
+### [Django](https://www.djangoproject.com/) { #django }
Pythonã®ãã¬ãŒã ã¯ãŒã¯ã®äžã§æãããã¥ã©ãŒã§ãåºãä¿¡é ŒãããŠããŸããInstagramã®ãããªã·ã¹ãã ã®æ§ç¯ã«äœ¿ãããŠããŸãã
ããã¯ãšã³ãã§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> { #django-rest-framework }
+### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework }
Django REST Frameworkã¯ãDjangoãäžæ·ãã«ããŠWeb APIãæ§ç¯ããæè»ãªããŒã«ããããšããŠãAPIã®æ©èœãåäžãããããã«äœãããŸããã
///
-### <a href="https://flask.palletsprojects.com" class="external-link" target="_blank">Flask</a> { #flask }
+### [Flask](https://flask.palletsprojects.com) { #flask }
Flask ã¯ããã€ã¯ããã¬ãŒã ã¯ãŒã¯ãã§ãããããŒã¿ããŒã¹ãšã®çµ±åã®ãããªDjangoãããã©ã«ãã§æã€å€ãã®æ©èœã¯å«ãŸããŠããŸããã
///
-### <a href="https://requests.readthedocs.io" class="external-link" target="_blank">Requests</a> { #requests }
+### [Requests](https://requests.readthedocs.io) { #requests }
**FastAPI**ã¯å®éã«ã¯**Requests**ã®ä»£æ¿ã§ã¯ãããŸããããããã®ã¹ã³ãŒãã¯å€§ããç°ãªããŸãã
///
-### <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 }
+### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi }
ç§ãDjango REST Frameworkã«æ±ããŠããäž»ãªæ©èœã¯ãAPIã®èªåçãªããã¥ã¡ã³ãçæã§ããã
ãããŠãæšæºã«åºã¥ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ããŒã«ãçµ±åããŠããŸãã
-* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>
-* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>
+* [Swagger UI](https://github.com/swagger-api/swagger-ui)
+* [ReDoc](https://github.com/Rebilly/ReDoc)
ãã®äºã€ã¯äººæ°ã§å®å®ãããã®ãšããŠéžæãããŸããããå°ãæ€çŽ¢ããŠã¿ããšã (**FastAPI**ãšåæã«äœ¿çšã§ãã) OpenAPIã®ããã®å€ãã®ä»£æ¿ãšãªãããŒã«ãèŠã€ããããšãã§ããŸãã
ããã€ãã®Flask RESTãã¬ãŒã ã¯ãŒã¯ããããŸããããããã調æ»ããŠã¿ããšãããå€ãã®ãã®ãäžé©åãªåé¡ãæ®ã£ããŸãŸãäžæããããæŸçœ®ãããŠããããšãããããŸããã
-### <a href="https://marshmallow.readthedocs.io/en/stable/" class="external-link" target="_blank">Marshmallow</a> { #marshmallow }
+### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow }
APIã·ã¹ãã ã§å¿
èŠãšãããäž»ãªæ©èœã®äžã€ã«ãã³ãŒã (Python) ããããŒã¿ãåãåºããŠããããã¯ãŒã¯ãä»ããŠéãããã®ã«å€æããããŒã¿ã®ã<dfn title="å¥å: marshallingã倿">ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³</dfn>ãããããŸããäŸãã°ãããŒã¿ããŒã¹ã®ããŒã¿ãå«ããªããžã§ã¯ããJSONãªããžã§ã¯ãã«å€æãããã`datetime` ãªããžã§ã¯ããæååã«å€æãããªã©ã§ãã
///
-### <a href="https://webargs.readthedocs.io/en/latest/" class="external-link" target="_blank">Webargs</a> { #webargs }
+### [Webargs](https://webargs.readthedocs.io/en/latest/) { #webargs }
APIã«æ±ããããä»ã®å€§ããªæ©èœãšããŠã<dfn title="PythonããŒã¿ãžã®èªã¿èŸŒã¿ãšå€æ">åä¿¡ãããªã¯ãšã¹ãããŒã¿ã®ããŒã¹</dfn>ããããŸãã
///
-### <a href="https://apispec.readthedocs.io/en/stable/" class="external-link" target="_blank">APISpec</a> { #apispec }
+### [APISpec](https://apispec.readthedocs.io/en/stable/) { #apispec }
MarshmallowãšWebargsã¯ããªããŒã·ã§ã³ãããŒã¹ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ããã©ã°ã€ã³ãšããŠæäŸããŠããŸãã
///
-### <a href="https://flask-apispec.readthedocs.io/en/latest/" class="external-link" target="_blank">Flask-apispec</a> { #flask-apispec }
+### [Flask-apispec](https://flask-apispec.readthedocs.io/en/latest/) { #flask-apispec }
WebargsãMarshmallowãAPISpecã飿ºãããFlaskãã©ã°ã€ã³ã§ãã
ããã䜿ãããšã§ãããã€ãã®Flaskãã«ã¹ã¿ãã¯ãžã§ãã¬ãŒã¿ãäœæããããšã«ãªããŸããããããã¯ç§ (ãšããã€ãã®å€éšã®ããŒã ) ãä»ãŸã§äœ¿ã£ãŠããã¡ã€ã³ã®ã¹ã¿ãã¯ã§ãã
-* <a href="https://github.com/tiangolo/full-stack" class="external-link" target="_blank">https://github.com/tiangolo/full-stack</a>
-* <a href="https://github.com/tiangolo/full-stack-flask-couchbase" class="external-link" target="_blank">https://github.com/tiangolo/full-stack-flask-couchbase</a>
-* <a href="https://github.com/tiangolo/full-stack-flask-couchdb" class="external-link" target="_blank">https://github.com/tiangolo/full-stack-flask-couchdb</a>
+* [https://github.com/tiangolo/full-stack](https://github.com/tiangolo/full-stack)
+* [https://github.com/tiangolo/full-stack-flask-couchbase](https://github.com/tiangolo/full-stack-flask-couchbase)
+* [https://github.com/tiangolo/full-stack-flask-couchdb](https://github.com/tiangolo/full-stack-flask-couchdb)
-ãããŠããããã®ãã«ã¹ã¿ãã¯ãžã§ãã¬ãŒã¿ãŒã¯ã[**FastAPI** Project Generators](project-generation.md){.internal-link target=_blank}ã®å
ãšãªã£ãŠããŸããã
+ãããŠããããã®ãã«ã¹ã¿ãã¯ãžã§ãã¬ãŒã¿ãŒã¯ã[**FastAPI** Project Generators](project-generation.md)ã®å
ãšãªã£ãŠããŸããã
/// info | æ
å ±
///
-### <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](https://nestjs.com/) (ãš[Angular](https://angular.io/)) { #nestjs-and-angular }
NestJSã¯Angularã«ã€ã³ã¹ãã€ã¢ãããJavaScript (TypeScript) NodeJSãã¬ãŒã ã¯ãŒã¯ã§ãPythonã§ãããããŸããã
///
-### <a href="https://sanic.readthedocs.io/en/latest/" class="external-link" target="_blank">Sanic</a> { #sanic }
+### [Sanic](https://sanic.readthedocs.io/en/latest/) { #sanic }
`asyncio`ã«åºã¥ãããPythonã®ãã¬ãŒã ã¯ãŒã¯ã®äžã§ãéåžžã«é«éãªãã®ã®äžã€ã§ããFlaskãšéåžžã«äŒŒãäœãã«ãªã£ãŠããŸãã
/// note | æè¡è©³çް
-Pythonã®`asyncio`ã«ãŒãã®ä»£ããã«ã<a href="https://github.com/MagicStack/uvloop" class="external-link" target="_blank">`uvloop`</a>ãå©çšãããŠããŸããããã«ãããéåžžã«é«éã§ãã
+Pythonã®`asyncio`ã«ãŒãã®ä»£ããã«ã[`uvloop`](https://github.com/MagicStack/uvloop)ãå©çšãããŠããŸããããã«ãããéåžžã«é«éã§ãã
`Uvicorn`ãš`Starlette`ã«æãããªã€ã³ã¹ãã¬ãŒã·ã§ã³ãäžããŠããããããã¯çŸåšãªãŒãã³ãªãã³ãããŒã¯ã«ãããŠSanicããé«éã§ãã
///
-### <a href="https://falconframework.org/" class="external-link" target="_blank">Falcon</a> { #falcon }
+### [Falcon](https://falconframework.org/) { #falcon }
Falconã¯ããäžã€ã®é«æ§èœPythonãã¬ãŒã ã¯ãŒã¯ã§ããããã ã«èšèšãããŠãããHugã®ãããªä»ã®ãã¬ãŒã ã¯ãŒã¯ã®åºç€ãšããŠåäœããŸãã
///
-### <a href="https://moltenframework.com/" class="external-link" target="_blank">Molten</a> { #molten }
+### [Molten](https://moltenframework.com/) { #molten }
**FastAPI**ãæ§ç¯ããæåã®æ®µéã§MoltenãçºèŠããŸããããããŠãããã¯éåžžã«äŒŒããããªã¢ã€ãã¢ãæã£ãŠããŸãã
///
-### <a href="https://github.com/hugapi/hug" class="external-link" target="_blank">Hug</a> { #hug }
+### [Hug](https://github.com/hugapi/hug) { #hug }
Hugã¯ãPythonã®åãã³ããå©çšããŠAPIãã©ã¡ãŒã¿ã®å宣èšãå®è£
ããæåã®ãã¬ãŒã ã¯ãŒã¯ã®1ã€ã§ããããã¯çŽ æŽãããã¢ã€ãã¢ã§ãä»ã®ããŒã«ãåãããšããããã£ãããšãªããŸããã
/// info | æ
å ±
-Hugã¯Timothy Crosleyã«ããäœæãããŸããã圌ã¯<a href="https://github.com/timothycrosley/isort" class="external-link" target="_blank">`isort`</a>ãªã©ãPythonã®ãã¡ã€ã«å
ã®ã€ã³ããŒãã®äžŠã³æ¿ããèªåçã«ããããªãçŽ æŽãããããŒã«ã®éçºè
ã§ãã
+Hugã¯Timothy Crosleyã«ããäœæãããŸããã圌ã¯[`isort`](https://github.com/timothycrosley/isort)ãªã©ãPythonã®ãã¡ã€ã«å
ã®ã€ã³ããŒãã®äžŠã³æ¿ããèªåçã«ããããªãçŽ æŽãããããŒã«ã®éçºè
ã§ãã
///
///
-### <a href="https://github.com/encode/apistar" class="external-link" target="_blank">APIStar</a> (<= 0.5) { #apistar-0-5 }
+### [APIStar](https://github.com/encode/apistar) (<= 0.5) { #apistar-0-5 }
**FastAPI**ãæ§ç¯ããããšã決ããçŽåã«ã**APIStar**ãµãŒããŒãèŠã€ããŸãããããã¯ç§ãæ¢ããŠãããã®ãã»ãŒãã¹ãŠå«ãŸããŠãããçŽ æŽããããã¶ã€ã³ã§ããã
## **FastAPI**ãå©çšããŠãããã® { #used-by-fastapi }
-### <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> { #pydantic }
+### [Pydantic](https://docs.pydantic.dev/) { #pydantic }
Pydanticã¯ãPythonã®åãã³ããå
ã«ããŒã¿ã®ããªããŒã·ã§ã³ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã (JSON Schemaã䜿çšãã) ããã¥ã¡ã³ããå®çŸ©ããã©ã€ãã©ãªã§ãã
ããŒã¿ã®ããªããŒã·ã§ã³ãããŒã¿ã®ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãèªåçãªã¢ãã«ã® (JSON Schemaã«åºã¥ãã) ããã¥ã¡ã³ãåã®å
šãŠãæ±ããŸãã
-**FastAPI**ã¯JSON Schemaã®ããŒã¿ãOpenAPIã«å©çšããŸãã
+**FastAPI**ã¯ãã®JSON SchemaããŒã¿ãOpenAPIã«åã蟌ã¿ãŸã (ãã以å€ã«ãå€ãã®ããšãè¡ããŸã)ã
///
-### <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a> { #starlette }
+### [Starlette](https://www.starlette.dev/) { #starlette }
Starletteã¯ã軜éãª<dfn title="éåæPython Webã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®æ°ããæšæº">ASGI</dfn>ãã¬ãŒã ã¯ãŒã¯/ããŒã«ãããã§ã髿§èœãªéåæãµãŒãã¹ã®æ§ç¯ã«æé©ã§ãã
///
-### <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a> { #uvicorn }
+### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn }
Uvicornã¯éåžžã«é«éãªASGIãµãŒããŒã§ãuvloopãšhttptoolsã«ããæ§æãããŠããŸãã
ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ `--workers` ã䜿ã£ãŠãéåæã®ãã«ãããã»ã¹ãµãŒããŒã«ã§ããŸãã
-詳现ã¯[ãããã€](deployment/index.md){.internal-link target=_blank}ã®é
ç®ã§ç¢ºèªããŠãã ããã
+詳现ã¯[ãããã€](deployment/index.md)ã®é
ç®ã§ç¢ºèªããŠãã ããã
///
## ãã³ãããŒã¯ ãš ã¹ããŒã { #benchmarks-and-speed }
-UvicornãStarletteãFastAPIã®éããçè§£ãæ¯èŒã確èªããã«ã¯ã[ãã³ãããŒã¯](benchmarks.md){.internal-link target=_blank}ã確èªããŠãã ããã
+UvicornãStarletteãFastAPIã®éããçè§£ãæ¯èŒã確èªããã«ã¯ã[ãã³ãããŒã¯](benchmarks.md)ã確èªããŠãã ããã
/// info | æ
å ±
-çŸããã€ã©ã¹ã㯠<a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a> ã«ãããã®ã§ããðš
+çŸããã€ã©ã¹ã㯠[Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot) ã«ãããã®ã§ããðš
///
/// info | æ
å ±
-çŸããã€ã©ã¹ã㯠<a href="https://www.instagram.com/ketrinadrawsalot" class="external-link" target="_blank">Ketrina Thompson</a> ã«ãããã®ã§ããðš
+çŸããã€ã©ã¹ã㯠[Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot) ã«ãããã®ã§ããðš
///
ãããŠãããã **FastAPI** ã§åŸãããããã©ãŒãã³ã¹ã®æ°Žæºã§ãã
-ããã«ãäžŠåæ§ãšéåææ§ãåæã«æŽ»çšã§ããããããã¹ããããå€ãã® NodeJS ãã¬ãŒã ã¯ãŒã¯ããé«ãæ§èœãçºæ®ããC ã«è¿ãã³ã³ãã€ã«èšèªã§ãã Go ãšåçã®æ§èœã«ãªããŸã <a href="https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1" class="external-link" target="_blank">(ãã¹ãŠ Starlette ã®ãããã§ã)</a>ã
+ããã«ãäžŠåæ§ãšéåææ§ãåæã«æŽ»çšã§ããããããã¹ããããå€ãã® NodeJS ãã¬ãŒã ã¯ãŒã¯ããé«ãæ§èœãçºæ®ããC ã«è¿ãã³ã³ãã€ã«èšèªã§ãã Go ãšåçã®æ§èœã«ãªããŸã [(ãã¹ãŠ Starlette ã®ãããã§ã)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1)ã
### 䞊è¡åŠçã¯äžŠååŠçããåªããŠããïŒ { #is-concurrency-better-than-parallelism }
ããã«ãPython ã **ããŒã¿ãµã€ãšã³ã¹**ãæ©æ¢°åŠç¿ãç¹ã«ãã£ãŒãã©ãŒãã³ã°ã®äž»èŠèšèªã§ãããšããäºå®ãçžãŸã£ãŠãFastAPI ã¯ããŒã¿ãµã€ãšã³ã¹/æ©æ¢°åŠç¿ã® Web API ãã¢ããªã±ãŒã·ã§ã³ (ã»ã倿°) ã«éåžžã«é©ããŠããŸãã
-æ¬çªç°å¢ã§ãã®äžŠåæ§ãå®çŸããæ¹æ³ã¯ã[ãããã€](deployment/index.md){.internal-link target=_blank} ã®ã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã
+æ¬çªç°å¢ã§ãã®äžŠåæ§ãå®çŸããæ¹æ³ã¯ã[ãããã€](deployment/index.md) ã®ã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã
## `async` ãš `await` { #async-and-await }
### èªåã§ async ã³ãŒããæžã { #write-your-own-async-code }
-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> ã®äž¡æ¹ã«å¯Ÿå¿ããŠããŸãã
+Starlette (**FastAPI** ã) 㯠[AnyIO](https://anyio.readthedocs.io/en/stable/) ã®äžã«æ§ç¯ãããŠãããæšæºã©ã€ãã©ãªã® [asyncio](https://docs.python.org/3/library/asyncio-task.html) ãš [Trio](https://trio.readthedocs.io/en/stable/) ã®äž¡æ¹ã«å¯Ÿå¿ããŠããŸãã
-ç¹ã«ãããªãèªèº«ã®ã³ãŒãå
ã§ãããé«åºŠãªãã¿ãŒã³ãå¿
èŠãšããçºå±çãªäžŠè¡åŠçã®ãŠãŒã¹ã±ãŒã¹ã«å¯ŸããŠã<a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a> ãçŽæ¥äœ¿ããŸãã
+ç¹ã«ãããªãèªèº«ã®ã³ãŒãå
ã§ãããé«åºŠãªãã¿ãŒã³ãå¿
èŠãšããçºå±çãªäžŠè¡åŠçã®ãŠãŒã¹ã±ãŒã¹ã«å¯ŸããŠã[AnyIO](https://anyio.readthedocs.io/en/stable/) ãçŽæ¥äœ¿ããŸãã
-仮㫠FastAPI ã䜿ã£ãŠããªããŠãã<a href="https://anyio.readthedocs.io/en/stable/" class="external-link" target="_blank">AnyIO</a> ã§ç¬èªã® async ã¢ããªã±ãŒã·ã§ã³ãæžãã°ãé«ãäºææ§ãšå©ç¹ (äŸ: æ§é åäžŠè¡æ§) ãåŸãããŸãã
+仮㫠FastAPI ã䜿ã£ãŠããªããŠãã[AnyIO](https://anyio.readthedocs.io/en/stable/) ã§ç¬èªã® async ã¢ããªã±ãŒã·ã§ã³ãæžãã°ãé«ãäºææ§ãšå©ç¹ (äŸ: æ§é åäžŠè¡æ§) ãåŸãããŸãã
-ç§ã¯ AnyIO ã®äžã«èãå±€ãšããŠãåæ³šéãå°ãæ¹åããããè¯ã**è£å®**ã**ã€ã³ã©ã€ã³ãšã©ãŒ**ãªã©ãåŸãããã®å¥ã©ã€ãã©ãªãäœããŸããããŸãã**çè§£**ããŠ**èªåã§ async ã³ãŒããæžã**ã®ã«åœ¹ç«ã€ãã¬ã³ããªãŒãªã€ã³ãã/ãã¥ãŒããªã¢ã«ããããŸã: <a href="https://asyncer.tiangolo.com/" class="external-link" target="_blank">Asyncer</a>ãç¹ã«ã**async ã³ãŒããšéåžžã®** (ããããã³ã°/åæ) **ã³ãŒããçµã¿åããã**å¿
èŠãããå Žåã«æçšã§ãã
+ç§ã¯ AnyIO ã®äžã«èãå±€ãšããŠãåæ³šéãå°ãæ¹åããããè¯ã**è£å®**ã**ã€ã³ã©ã€ã³ãšã©ãŒ**ãªã©ãåŸãããã®å¥ã©ã€ãã©ãªãäœããŸããããŸãã**çè§£**ããŠ**èªåã§ async ã³ãŒããæžã**ã®ã«åœ¹ç«ã€ãã¬ã³ããªãŒãªã€ã³ãã/ãã¥ãŒããªã¢ã«ããããŸã: [Asyncer](https://asyncer.tiangolo.com/)ãç¹ã«ã**async ã³ãŒããšéåžžã®** (ããããã³ã°/åæ) **ã³ãŒããçµã¿åããã**å¿
èŠãããå Žåã«æçšã§ãã
### éåæã³ãŒãã®ä»ã®åœ¢åŒ { #other-forms-of-asynchronous-code }
ãã以åã¯ãéåæã³ãŒãã®æ±ãã¯ããªãè€éã§é£è§£ã§ããã
-以åã® Python ã§ã¯ã¹ã¬ããã <a href="https://www.gevent.org/" class="external-link" target="_blank">Gevent</a> ã䜿ããŸããããã³ãŒãã®çè§£ã»ãããã°ã»æèãã¯ããã«é£ãããªããŸãã
+以åã® Python ã§ã¯ã¹ã¬ããã [Gevent](https://www.gevent.org/) ã䜿ããŸããããã³ãŒãã®çè§£ã»ãããã°ã»æèãã¯ããã«é£ãããªããŸãã
以åã® NodeJS / ãã©ãŠã¶ JavaScript ã§ã¯ãã³ãŒã«ããã¯ãã䜿ã£ãŠããããã³ãŒã«ããã¯å°çããæããŸããã
äžèšãšã¯ç°ãªãåäœã®å¥ã®éåæãã¬ãŒã ã¯ãŒã¯ããæ¥ãŠãããã»ãã®ããããªããã©ãŒãã³ã¹åäž (çŽ 100 ããç§) ãçã£ãŠãèšç®ã®ã¿ã®äºçŽ°ãª *path operation 颿°* ãçŽ ã® `def` ã§å®çŸ©ããããšã«æ
£ããŠããå Žåã**FastAPI** ã§ã¯å¹æããŸã£ããéã«ãªãç¹ã«æ³šæããŠãã ããããããã®å Žåã*path operation 颿°* ãããããã³ã°ãª <abbr title="Input/Output - å
¥åºå: ãã£ã¹ã¯ã®èªã¿åããŸãã¯æžã蟌ã¿ããããã¯ãŒã¯éä¿¡ã">I/O</abbr> ãè¡ãã³ãŒãã䜿ã£ãŠããªãéãã`async def` ã䜿ã£ãæ¹ãè¯ãã§ãã
-ããã§ããã©ã¡ãã®ç¶æ³ã§ãã**FastAPI** ã¯ããªãã以å䜿ã£ãŠãããã¬ãŒã ã¯ãŒã¯ããã (å°ãªããšãåçã«) [é«éã§ãã](index.md#performance){.internal-link target=_blank} å¯èœæ§ãé«ãã§ãã
+ããã§ããã©ã¡ãã®ç¶æ³ã§ãã**FastAPI** ã¯ããªãã以å䜿ã£ãŠãããã¬ãŒã ã¯ãŒã¯ããã (å°ãªããšãåçã«) [é«éã§ãã](index.md#performance) å¯èœæ§ãé«ãã§ãã
### äŸåé¢ä¿ { #dependencies }
-[äŸåé¢ä¿](tutorial/dependencies/index.md){.internal-link target=_blank} ã«ã€ããŠãåæ§ã§ããäŸåé¢ä¿ã `async def` ã§ã¯ãªãæšæºã® `def` 颿°ã§ããå Žåãå€éšã®ã¹ã¬ããããŒã«ã§å®è¡ãããŸãã
+[äŸåé¢ä¿](tutorial/dependencies/index.md) ã«ã€ããŠãåæ§ã§ããäŸåé¢ä¿ã `async def` ã§ã¯ãªãæšæºã® `def` 颿°ã§ããå Žåãå€éšã®ã¹ã¬ããããŒã«ã§å®è¡ãããŸãã
### ãµãäŸåé¢ä¿ { #sub-dependencies }
-è€æ°ã®äŸåé¢ä¿ã [ãµãäŸåé¢ä¿](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} ã (颿°å®çŸ©ã®ãã©ã¡ãŒã¿ãšããŠ) çžäºã«èŠæ±ãããããŸãããã®äžéšã¯ `async def`ãä»ã¯éåžžã® `def` ã§äœãããŠããŠãåäœããŸããéåžžã® `def` ã§äœããããã®ã¯ãawaitãããã代ããã«ãå€éšã¹ã¬ããããŒã«ããã¹ã¬ããäžã§åŒã³åºãããŸãã
+è€æ°ã®äŸåé¢ä¿ã [ãµãäŸåé¢ä¿](tutorial/dependencies/sub-dependencies.md) ã (颿°å®çŸ©ã®ãã©ã¡ãŒã¿ãšããŠ) çžäºã«èŠæ±ãããããŸãããã®äžéšã¯ `async def`ãä»ã¯éåžžã® `def` ã§äœãããŠããŠãåäœããŸããéåžžã® `def` ã§äœããããã®ã¯ãawaitãããã代ããã«ãå€éšã¹ã¬ããããŒã«ããã¹ã¬ããäžã§åŒã³åºãããŸãã
### ãã®ä»ã®ãŠãŒãã£ãªãã£é¢æ° { #other-utility-functions }
# ãã³ãããŒã¯ { #benchmarks }
-TechEmpowerã®ç¬ç«ãããã³ãããŒã¯ã§ã¯ãUvicornã®äžã§åäœãã**FastAPI**ã¢ããªã±ãŒã·ã§ã³ã¯ã<a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">å©çšå¯èœãªæéã®Pythonãã¬ãŒã ã¯ãŒã¯ã®1ã€</a>ã§ãããäžåã£ãŠããã®ã¯StarletteãšUvicornèªäœïŒFastAPIã«ãã£ãŠå
éšã§äœ¿çšãããïŒã®ã¿ã ãšç€ºãããŠããŸãã
+TechEmpowerã®ç¬ç«ãããã³ãããŒã¯ã§ã¯ãUvicornã®äžã§åäœãã**FastAPI**ã¢ããªã±ãŒã·ã§ã³ã¯ã[å©çšå¯èœãªæéã®Pythonãã¬ãŒã ã¯ãŒã¯ã®1ã€](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7)ã§ãããäžåã£ãŠããã®ã¯StarletteãšUvicornèªäœïŒFastAPIã«ãã£ãŠå
éšã§äœ¿çšãããïŒã®ã¿ã ãšç€ºãããŠããŸãã
ãã ãããã³ãããŒã¯ã確èªããæ¯èŒããéã«ã¯äžèšã®å
å®¹ã«æ°ãä»ããŠãã ããã
## FastAPI Cloud { #fastapi-cloud }
-**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** ã¯ã**FastAPI** ã®äœè
ãšåãããŒã ã«ãã£ãŠäœãããŠããŸãã
+**[FastAPI Cloud](https://fastapicloud.com)** ã¯ã**FastAPI** ã®äœè
ãšåãããŒã ã«ãã£ãŠäœãããŠããŸãã
API ã®**æ§ç¯**ã**ãããã€**ã**ã¢ã¯ã»ã¹**ãŸã§ã®ããã»ã¹ããæå°éã®æéã§å¹çåããŸãã
## ã¯ã©ãŠããããã€ã - ã¹ãã³ãµãŒ { #cloud-providers-sponsors }
-ä»ã«ãããã€ãã®ã¯ã©ãŠããããã€ãã âš [**FastAPI ãã¹ãã³ãµãŒããŠããŸã**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} âšãð
+ä»ã«ãããã€ãã®ã¯ã©ãŠããããã€ãã âš [**FastAPI ãã¹ãã³ãµãŒããŠããŸã**](../help-fastapi.md#sponsor-the-author) âšãð
ãããã®ã¬ã€ããåèã«ãããµãŒãã¹ã詊ããŠã¿ãã®ãããã§ããã:
-* <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>
+* [Render](https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi)
+* [Railway](https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi)
## ã»ãã¥ãªã㣠- HTTPS { #security-https }
-[åãã£ãã¿ãŒã®HTTPSã«ã€ããŠ](https.md){.internal-link target=_blank}ã§ã¯ãHTTPSãã©ã®ããã«APIãæå·åããã®ãã«ã€ããŠåŠã³ãŸããã
+[åãã£ãã¿ãŒã®HTTPSã«ã€ããŠ](https.md)ã§ã¯ãHTTPSãã©ã®ããã«APIãæå·åããã®ãã«ã€ããŠåŠã³ãŸããã
éåžžãã¢ããªã±ãŒã·ã§ã³ãµãŒãã«ãšã£ãŠ**å€éšã®**ã³ã³ããŒãã³ãã§ãã**TLS Termination Proxy**ã«ãã£ãŠæäŸãããããšãäžè¬çã§ãããã®ãããã·ã¯éä¿¡ã®æå·åãæ
åœããŸãã
* Caddy
* èšŒææžã®æŽæ°ãèªåçã«åŠç âš
* Nginx
- * èšŒææžæŽæ°ã®ããã«Certbotã®ãããªå€éšã³ã³ããŒãã³ãã䜿çš
+ * èšŒææžæŽæ°ã®ããã« Certbot ã®ãããªå€éšã³ã³ããŒãã³ãã䜿çš
* HAProxy
- * èšŒææžæŽæ°ã®ããã«Certbotã®ãããªå€éšã³ã³ããŒãã³ãã䜿çš
+ * èšŒææžæŽæ°ã®ããã« Certbot ã®ãããªå€éšã³ã³ããŒãã³ãã䜿çš
* Nginx ã®ãã㪠Ingress Controller ãæã€ Kubernetes
* èšŒææžã®æŽæ°ã« cert-manager ã®ãããªå€éšã³ã³ããŒãã³ãã䜿çš
* ã¯ã©ãŠãã»ãããã€ããŒããµãŒãã¹ã®äžéšãšããŠå
éšçã«åŠçïŒäžèšãåç
§ðïŒ
### ã¯ãŒã«ãŒã»ããã»ã¹ ãš ããŒã { #worker-processes-and-ports }
-[HTTPSã«ã€ããŠ](https.md){.internal-link target=_blank}ã®ããã¥ã¡ã³ãã§ã1ã€ã®ãµãŒããŒã§1ã€ã®ããŒããšIPã¢ãã¬ã¹ã®çµã¿åããã§ãªãã¹ã³ã§ããã®ã¯1ã€ã®ããã»ã¹ã ãã§ããããšãèŠããŠããŸãã§ããããïŒ
+[HTTPSã«ã€ããŠ](https.md)ã®ããã¥ã¡ã³ãã§ã1ã€ã®ãµãŒããŒã§1ã€ã®ããŒããšIPã¢ãã¬ã¹ã®çµã¿åããã§ãªãã¹ã³ã§ããã®ã¯1ã€ã®ããã»ã¹ã ãã§ããããšãèŠããŠããŸãã§ããããïŒ
ããã¯ããŸã ã«åãã§ãã
ãããã®**ã³ã³ãã**ãDockerãããŠKubernetesã«é¢ããé
ç®ãããŸã ããŸãæå³ããªããŠããªããŠãå¿é
ããªãã§ãã ããã
-ã³ã³ããã»ã€ã¡ãŒãžãDockerãKubernetesãªã©ã«ã€ããŠã¯ãå°æ¥ã®ç« ã§è©³ãã説æããŸã: [ã³ã³ããå
ã®FastAPI - Docker](docker.md){.internal-link target=_blank}.
+ã³ã³ããã»ã€ã¡ãŒãžãDockerãKubernetesãªã©ã«ã€ããŠã¯ãå°æ¥ã®ç« ã§è©³ãã説æããŸã: [ã³ã³ããå
ã®FastAPI - Docker](docker.md).
///
/// tip | è±ç¥è
-ã³ã³ããã䜿ã£ãå
·äœçãªäŸã«ã€ããŠã¯ãå°æ¥ã®ç« ã§ç޹ä»ããŸã: [ã³ã³ããå
ã®FastAPI - Docker](docker.md){.internal-link target=_blank}.
+ã³ã³ããã䜿ã£ãå
·äœçãªäŸã«ã€ããŠã¯ãå°æ¥ã®ç« ã§ç޹ä»ããŸã: [ã³ã³ããå
ã®FastAPI - Docker](docker.md).
///
# ã³ã³ããå
ã®FastAPI - Docker { #fastapi-in-containers-docker }
-FastAPIã¢ããªã±ãŒã·ã§ã³ããããã€ããå Žåãäžè¬çãªã¢ãããŒãã¯**Linuxã³ã³ããã»ã€ã¡ãŒãž**ããã«ãããããšã§ããåºæ¬çã«ã¯ <a href="https://www.docker.com/" class="external-link" target="_blank">**Docker**</a>ãçšããŠè¡ãããŸããçæãããã³ã³ããã»ã€ã¡ãŒãžã¯ãããã€ãã®æ¹æ³ã®ããããã§ãããã€ã§ããŸãã
+FastAPIã¢ããªã±ãŒã·ã§ã³ããããã€ããå Žåãäžè¬çãªã¢ãããŒãã¯**Linuxã³ã³ããã»ã€ã¡ãŒãž**ããã«ãããããšã§ããåºæ¬çã«ã¯ [**Docker**](https://www.docker.com/) ãçšããŠè¡ãããŸããçæãããã³ã³ããã»ã€ã¡ãŒãžã¯ãããã€ãã®æ¹æ³ã®ããããã§ãããã€ã§ããŸãã
Linuxã³ã³ããã®äœ¿çšã«ã¯ã**ã»ãã¥ãªãã£**ã**å埩å¯èœæ§ïŒã¬ããªã«ããªãã£ïŒ**ã**ã·ã³ããªã·ãã£**ãªã©ãããã€ãã®å©ç¹ããããŸãã
Dockerã¯ã**ã³ã³ããã»ã€ã¡ãŒãž**ãš**ã³ã³ãã**ãäœæã»ç®¡çããããã®äž»èŠãªããŒã«ã®1ã€ã§ãã
-ãããŠãå€ãã®ããŒã«ãç°å¢ãããŒã¿ããŒã¹ãã¢ããªã±ãŒã·ã§ã³ã«å¯Ÿå¿ããŠããäºãäœæããã**å
¬åŒã®ã³ã³ããã»ã€ã¡ãŒãž**ããããªãã¯ã«æäŸããŠãã<a href="https://hub.docker.com/" class="external-link" target="_blank">Docker Hub</a>ãšãããã®ããããŸãã
+ãããŠãå€ãã®ããŒã«ãç°å¢ãããŒã¿ããŒã¹ãã¢ããªã±ãŒã·ã§ã³ã«å¯Ÿå¿ããŠããäºãäœæããã**å
¬åŒã®ã³ã³ããã»ã€ã¡ãŒãž**ããããªãã¯ã«æäŸããŠãã [Docker Hub](https://hub.docker.com/) ãšãããã®ããããŸãã
-äŸãã°ãå
¬åŒã€ã¡ãŒãžã®1ã€ã«<a href="https://hub.docker.com/_/python" class="external-link" target="_blank">Python Image</a>ããããŸãã
+äŸãã°ãå
¬åŒã€ã¡ãŒãžã®1ã€ã« [Python Image](https://hub.docker.com/_/python) ããããŸãã
ãã®ä»ã«ããããŒã¿ããŒã¹ãªã©ããŸããŸãªã€ã¡ãŒãžããããŸãïŒ
-* <a href="https://hub.docker.com/_/postgres" class="external-link" target="_blank">PostgreSQL</a>
-* <a href="https://hub.docker.com/_/mysql" class="external-link" target="_blank">MySQL</a>
-* <a href="https://hub.docker.com/_/mongo" class="external-link" target="_blank">MongoDB</a>
-* <a href="https://hub.docker.com/_/redis" class="external-link" target="_blank">Redis</a>, etc.
+* [PostgreSQL](https://hub.docker.com/_/postgres)
+* [MySQL](https://hub.docker.com/_/mysql)
+* [MongoDB](https://hub.docker.com/_/mongo)
+* [Redis](https://hub.docker.com/_/redis), etc.
äºãäœæãããã³ã³ããã»ã€ã¡ãŒãžã䜿çšããããšã§ãç°ãªãããŒã«ã**çµã¿åãããŠ**䜿çšããããšãéåžžã«ç°¡åã«ãªããŸããäŸãã°ãæ°ããããŒã¿ããŒã¹ã詊ãå Žåã«ç¹ã«äŸ¿å©ã§ããã»ãšãã©ã®å Žåã**å
¬åŒã€ã¡ãŒãž**ã䜿ããç°å¢å€æ°ã§èšå®ããã ãã§è¯ãã§ãã
æãäžè¬çãªæ¹æ³ã¯ã`requirements.txt` ãã¡ã€ã«ã«ããã±ãŒãžåãšãã®ããŒãžã§ã³ã 1 è¡ãã€æžãããšã§ãã
-ãã¡ããã[FastAPI ããŒãžã§ã³ã«ã€ããŠ](versions.md){.internal-link target=_blank}ã§èªãã ã®ãšåãã¢ã€ãã¢ã䜿çšããŠãããŒãžã§ã³ã®ç¯å²ãèšå®ããŸãã
+ãã¡ããã[FastAPI ããŒãžã§ã³ã«ã€ããŠ](versions.md)ã§èªãã ã®ãšåãã¢ã€ãã¢ã䜿çšããŠãããŒãžã§ã³ã®ç¯å²ãèšå®ããŸãã
äŸãã°ã`requirements.txt` ã¯æ¬¡ã®ããã«ãªããŸãïŒ
#### `CMD` ã䜿ã - Execåœ¢åŒ { #use-cmd-exec-form }
-Dockeråœä»€ <a href="https://docs.docker.com/reference/dockerfile/#cmd" class="external-link" target="_blank">`CMD`</a> ã¯2ã€ã®åœ¢åŒã§æžããŸãïŒ
+Dockeråœä»€ [`CMD`](https://docs.docker.com/reference/dockerfile/#cmd) ã¯2ã€ã®åœ¢åŒã§æžããŸãïŒ
â
**Exec** 圢åŒïŒ
CMD fastapi run app/main.py --port 80
```
-FastAPIãæ£åžžã«ã·ã£ããããŠã³ã§ãã[lifespan events](../advanced/events.md){.internal-link target=_blank}ãããªã¬ãŒãããããã«ãåžžã« **exec** 圢åŒã䜿çšããŠãã ããã
+FastAPIãæ£åžžã«ã·ã£ããããŠã³ã§ãã[lifespan events](../advanced/events.md)ãããªã¬ãŒãããããã«ãåžžã« **exec** 圢åŒã䜿çšããŠãã ããã
-詳ããã¯ã<a href="https://docs.docker.com/reference/dockerfile/#shell-and-exec-form" class="external-link" target="_blank">shell圢åŒãšexec圢åŒã«é¢ããDockerããã¥ã¡ã³ã</a>ãã芧ãã ããã
+詳ããã¯ã[shell圢åŒãšexec圢åŒã«é¢ããDockerããã¥ã¡ã³ã](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form)ãã芧ãã ããã
-ãã㯠`docker compose` ã䜿çšããå Žåã«ããªãç®ç«ã€ããšããããŸããããæè¡çãªè©³çްã¯ããã®Docker Composeã®FAQã»ã¯ã·ã§ã³ãã芧ãã ããïŒ<a href="https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop" class="external-link" target="_blank">Why do my services take 10 seconds to recreate or stop?</a>ã
+ãã㯠`docker compose` ã䜿çšããå Žåã«ããªãç®ç«ã€ããšããããŸããããæè¡çãªè©³çްã¯ããã®Docker Composeã®FAQã»ã¯ã·ã§ã³ãã芧ãã ããïŒ[Why do my services take 10 seconds to recreate or stop?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop)ã
#### ãã£ã¬ã¯ããªæ§é { #directory-structure }
## 確èªãã { #check-it }
-Dockerã³ã³ããã®<a href="http://192.168.99.100/items/5?q=somequery" class="external-link" target="_blank">http://192.168.99.100/items/5?q=somequery</a> ã <a href="http://127.0.0.1/items/5?q=somequery" class="external-link" target="_blank">http://127.0.0.1/items/5?q=somequery</a> (ãŸãã¯ããã«çžåœããDockerãã¹ãã䜿çšãããã®ïŒãšãã£ãURLã§ç¢ºèªã§ããã¯ãã§ãã
+Dockerã³ã³ããã®[http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) ã [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery) (ãŸãã¯ããã«çžåœããDockerãã¹ãã䜿çšãããã®ïŒãšãã£ãURLã§ç¢ºèªã§ããã¯ãã§ãã
ã¢ã¯ã»ã¹ãããšä»¥äžã®ãããªãã®ã衚瀺ãããŸãïŒ
## ã€ã³ã¿ã©ã¯ãã£ããªAPIããã¥ã¡ã³ã { #interactive-api-docs }
-ãããã®URLã«ãã¢ã¯ã»ã¹ã§ããŸã: <a href="http://192.168.99.100/docs" class="external-link" target="_blank">http://192.168.99.100/docs</a> ã <a href="http://127.0.0.1/docs" class="external-link" target="_blank">http://127.0.0.1/docs</a> (ãŸãã¯ããã«çžåœããDockerãã¹ãã䜿çšãããã®ïŒ
+ãããã®URLã«ãã¢ã¯ã»ã¹ã§ããŸã: [http://192.168.99.100/docs](http://192.168.99.100/docs) ã [http://127.0.0.1/docs](http://127.0.0.1/docs) (ãŸãã¯ããã«çžåœããDockerãã¹ãã䜿çšãããã®ïŒ
-ã¢ã¯ã»ã¹ãããšãèªå察話åAPIããã¥ã¡ã³ãïŒ<a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>ãæäŸïŒã衚瀺ãããŸãïŒ
+ã¢ã¯ã»ã¹ãããšãèªå察話åAPIããã¥ã¡ã³ãïŒ[Swagger UI](https://github.com/swagger-api/swagger-ui)ãæäŸïŒã衚瀺ãããŸãïŒ

## 代æ¿ã®APIããã¥ã¡ã³ã { #alternative-api-docs }
-ãŸãã<a href="http://192.168.99.100/redoc" class="external-link" target="_blank">http://192.168.99.100/redoc</a> ã <a href="http://127.0.0.1/redoc" class="external-link" target="_blank">http://127.0.0.1/redoc</a> (ãŸãã¯ããã«çžåœããDockerãã¹ãã䜿çšãããã®ïŒã«ãã¢ã¯ã»ã¹ã§ããŸãã
+ãŸãã[http://192.168.99.100/redoc](http://192.168.99.100/redoc) ã [http://127.0.0.1/redoc](http://127.0.0.1/redoc) (ãŸãã¯ããã«çžåœããDockerãã¹ãã䜿çšãããã®ïŒã«ãã¢ã¯ã»ã¹ã§ããŸãã
-代æ¿ã®èªåããã¥ã¡ã³ãïŒ<a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>ã«ãã£ãŠæäŸãããïŒã衚瀺ãããŸãïŒ
+代æ¿ã®èªåããã¥ã¡ã³ãïŒ[ReDoc](https://github.com/Rebilly/ReDoc)ã«ãã£ãŠæäŸãããïŒã衚瀺ãããŸãïŒ

## ãããã€ã¡ã³ãã®ã³ã³ã»ãã { #deployment-concepts }
-ã³ã³ãããšãã芳ç¹ããã[ãããã€ã®ã³ã³ã»ãã](concepts.md){.internal-link target=_blank}ã«å
±éããããã€ãã«ã€ããŠãããäžåºŠèª¬æããŸãããã
+ã³ã³ãããšãã芳ç¹ããã[ãããã€ã®ã³ã³ã»ãã](concepts.md)ã«å
±éããããã€ãã«ã€ããŠãããäžåºŠèª¬æããŸãããã
ã³ã³ããã¯äž»ã«ãã¢ããªã±ãŒã·ã§ã³ã®**ãã«ããšãããã€**ã®ããã»ã¹ãç°¡çŽ åããããã®ããŒã«ã§ããããããã®**ãããã€ã®ã³ã³ã»ãã**ãæ±ãããã®ç¹å®ã®ã¢ãããŒãã匷å¶ãããã®ã§ã¯ãªããããã€ãã®æŠç¥ããããŸãã
FastAPI ã¢ããªã±ãŒã·ã§ã³ã® **ã³ã³ããã»ã€ã¡ãŒãž**ïŒããã³åŸã§å®è¡äžã® **ã³ã³ãã**ïŒã ãã«çŠç¹ãåœãŠããšãéåžžãHTTPSã¯å¥ã®ããŒã«ãçšããŠ**å€éšã§**åŠçãããŸãã
-äŸãã°<a href="https://traefik.io/" class="external-link" target="_blank">Traefik</a>ã®ããã«ã**HTTPS**ãš**èšŒææž**ã®**èªå**ååŸãæ±ãå¥ã®ã³ã³ããã§ããå¯èœæ§ããããŸãã
+äŸãã° [Traefik](https://traefik.io/) ã®ããã«ã**HTTPS**ãš**èšŒææž**ã®**èªå**ååŸãæ±ãå¥ã®ã³ã³ããã§ããå¯èœæ§ããããŸãã
/// tip | è±ç¥è
/// info | æ
å ±
-ããKubernetesã䜿çšããŠããå Žå, ããã¯ãããã<a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" class="external-link" target="_blank">Init Container</a>ã§ãããã
+ããKubernetesã䜿çšããŠããå Žå, ããã¯ãããã[Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)ã§ãããã
///
### ããŒã¹Dockerã€ã¡ãŒãž { #base-docker-image }
-以åã¯ãå
¬åŒã®FastAPI Dockerã€ã¡ãŒãžããããŸããïŒ<a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>ãããããçŸåšã¯éæšå¥šã§ããâïž
+以åã¯ãå
¬åŒã®FastAPI Dockerã€ã¡ãŒãžããããŸããïŒ[tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker)ãããããçŸåšã¯éæšå¥šã§ããâïž
ããããããã®ããŒã¹Dockerã€ã¡ãŒãžïŒãŸãã¯ãã®ä»ã®é¡äŒŒã®ãã®ïŒã¯**䜿çšããªã**æ¹ãããã§ãããã
## `uv` ã䜿ã£ãDockerã€ã¡ãŒãž { #docker-image-with-uv }
-<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">uv</a> ã䜿ã£ãŠãããžã§ã¯ãã®ã€ã³ã¹ããŒã«ãšç®¡çãããŠããå Žåã¯ã<a href="https://docs.astral.sh/uv/guides/integration/docker/" class="external-link" target="_blank">uv Docker guide</a>ã«åŸã£ãŠãã ããã
+[uv](https://github.com/astral-sh/uv) ã䜿ã£ãŠãããžã§ã¯ãã®ã€ã³ã¹ããŒã«ãšç®¡çãããŠããå Žåã¯ã[uv Docker guide](https://docs.astral.sh/uv/guides/integration/docker/)ã«åŸã£ãŠãã ããã
## ãŸãšã { #recap }
# FastAPI Cloud { #fastapi-cloud }
-<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a> ã« **ã³ãã³ã1ã€** ã§ãããã€ã§ããŸãããŸã ãªããŠã§ã€ãã£ã³ã°ãªã¹ãã«ãç»é²ãã ãããð
+[FastAPI Cloud](https://fastapicloud.com) ã« **ã³ãã³ã1ã€** ã§ãããã€ã§ããŸãããŸã ãªããŠã§ã€ãã£ã³ã°ãªã¹ãã«ãç»é²ãã ãããð
## ãã°ã€ã³ { #login }
## FastAPI Cloud ã«ã€ã㊠{ #about-fastapi-cloud }
-**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** ã¯ã**FastAPI** ã®äœè
ãšããŒã ã«ãã£ãŠéçºãããŠããŸãã
+**[FastAPI Cloud](https://fastapicloud.com)** ã¯ã**FastAPI** ã®äœè
ãšããŒã ã«ãã£ãŠéçºãããŠããŸãã
æå°éã®æéã§ API ã**æ§ç¯**ã»**ãããã€**ã»**å©çš**ã§ããããã«å·¥çšãç°¡çŽ åããŸãã
///
-å©çšè
ã®èŠç¹ãã **HTTPS ã®åºæ¬ãåŠã¶**ã«åœãã£ãŠã¯ã次ã®ãªãœãŒã¹ããªã¹ã¹ã¡ããŸã: <a href="https://howhttps.works/" class="external-link" target="_blank">https://howhttps.works/</a>.
+å©çšè
ã®èŠç¹ãã **HTTPS ã®åºæ¬ãåŠã¶**ã«åœãã£ãŠã¯ã次ã®ãªãœãŒã¹ããªã¹ã¹ã¡ããŸã: [https://howhttps.works/](https://howhttps.works/).
ããŠã**éçºè
ã®èŠç¹**ãããHTTPSã«ã€ããŠèããéã«å¿µé ã«çœ®ãã¹ãããšãããã€ãã¿ãŠãããŸãããïŒ
* **ããã©ã«ãã§ã¯**ã**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ã¬ãã«ã§æå·åãåŠçãããã®)ã«ã¯ã**[<abbr title="Server Name Indication - ãµãŒããŒå衚瀺">SNI</abbr>](https://en.wikipedia.org/wiki/Server_Name_Indication)**ãšåŒã°ãã**æ¡åŒµ**ããããŸãã
* ãã®SNIæ¡åŒµæ©èœã«ããã1ã€ã®ãµãŒããŒïŒ**åäžã®IPã¢ãã¬ã¹**ãæã€ïŒã**è€æ°ã®HTTPSèšŒææž**ãæã¡ã**è€æ°ã®HTTPSãã¡ã€ã³/ã¢ããªã±ãŒã·ã§ã³**ã«ãµãŒãã¹ãæäŸã§ããããã«ãªããŸãã
* ãããæ©èœããããã«ã¯ã**ãããªãã¯IPã¢ãã¬ã¹**ã§ãªãã¹ã³ããŠããããµãŒããŒäžã§åäœããŠãã**åäžã®**ã³ã³ããŒãã³ã(ããã°ã©ã )ãããµãŒããŒå
ã®**ãã¹ãŠã®HTTPSèšŒææž**ãæã£ãŠããå¿
èŠããããŸãã
* ã»ãã¥ã¢ãªæ¥ç¶ãååŸãã**åŸ**ã§ããéä¿¡ãããã³ã«ã¯**HTTPã®ãŸãŸ**ã§ãã
* ã³ã³ãã³ãã¯**HTTPãããã³ã«**ã§éä¿¡ãããŠããã«ããããããã**æå·å**ãããŠããŸãã
-ãµãŒããŒïŒãã·ã³ããã¹ããªã©ïŒäžã§**1ã€ã®ããã°ã©ã /HTTPãµãŒããŒ**ãå®è¡ããã**HTTPSã«é¢ããå
šãŠã®ããš**ã管çããã®ãäžè¬çã§ãã**æå·åããã HTTPS ãªã¯ãšã¹ã** ãåä¿¡ãã**埩å·åããã HTTP ãªã¯ãšã¹ã** ãåããµãŒããŒã§å®è¡ãããŠããå®éã® HTTP ã¢ããªã±ãŒã·ã§ã³ïŒãã®å Žå㯠**FastAPI** ã¢ããªã±ãŒã·ã§ã³ïŒã«éä¿¡ããã¢ããªã±ãŒã·ã§ã³ãã **HTTP ã¬ã¹ãã³ã¹** ãåãåããé©å㪠**HTTPS èšŒææž** ã䜿çšã㊠**æå·å** ãããããŠ**HTTPS** ã䜿çšããŠã¯ã©ã€ã¢ã³ãã«éãè¿ããŸãããã®ãµãŒããŒã¯ãã°ãã° **<a href="https://en.wikipedia.org/wiki/TLS_termination_proxy" class="external-link" target="_blank">TLS Termination Proxy</a>**ãšåŒã°ããŸãã
+ãµãŒããŒïŒãã·ã³ããã¹ããªã©ïŒäžã§**1ã€ã®ããã°ã©ã /HTTPãµãŒããŒ**ãå®è¡ããã**HTTPSã«é¢ããå
šãŠã®ããš**ã管çããã®ãäžè¬çã§ãã**æå·åããã HTTPS ãªã¯ãšã¹ã** ãåä¿¡ãã**埩å·åããã HTTP ãªã¯ãšã¹ã** ãåããµãŒããŒã§å®è¡ãããŠããå®éã® HTTP ã¢ããªã±ãŒã·ã§ã³ïŒãã®å Žå㯠**FastAPI** ã¢ããªã±ãŒã·ã§ã³ïŒã«éä¿¡ããã¢ããªã±ãŒã·ã§ã³ãã **HTTP ã¬ã¹ãã³ã¹** ãåãåããé©å㪠**HTTPS èšŒææž** ã䜿çšã㊠**æå·å** ãããããŠ**HTTPS** ã䜿çšããŠã¯ã©ã€ã¢ã³ãã«éãè¿ããŸãããã®ãµãŒããŒã¯ãã°ãã° **[TLS Termination Proxy](https://en.wikipedia.org/wiki/TLS_termination_proxy)**ãšåŒã°ããŸãã
TLS Termination ProxyãšããŠäœ¿ãããªãã·ã§ã³ã«ã¯ã以äžã®ãããªãã®ããããŸãïŒ
ãããã®èšŒææžãååŸããããã®æç¶ãã¯é¢åã§ãããªãã®æžé¡ãå¿
èŠãšããèšŒææžã¯ããªãé«äŸ¡ãªãã®ã§ããã
-ããããã®åŸã**<a href="https://letsencrypt.org/" class="external-link" target="_blank">Let's Encrypt</a>** ãäœãããŸããã
+ããããã®åŸã**[Let's Encrypt](https://letsencrypt.org/)** ãäœãããŸããã
ããã¯Linux Foundationã®ãããžã§ã¯ãããçãŸãããã®ã§ãã èªååãããæ¹æ³ã§ã**HTTPSèšŒææžãç¡æã§**æäŸããŸãããããã®èšŒææžã¯ããã¹ãŠã®æšæºçãªæå·åã»ãã¥ãªãã£ã䜿çšãããŸãçåœïŒçŽ3ã¶æïŒã§ããããããã£ã寿åœã®çãã«ãã£ãŠã**ã»ãã¥ãªãã£ã¯å®éã«åªããŠããŸã**ã
ããããã¯ã©ãŠããµãŒããŒïŒä»®æ³ãã·ã³ïŒãããã«é¡ãããã®ãæã«å
¥ãã<dfn title="æéãšãšãã«å€åããªããåçã§ã¯ãªãã">åºå®ã®</dfn> **ãããªãã¯IPã¢ãã¬ã¹**ãæã€ããšã«ãªãã§ãããã
-DNSã\82µã\83΋\83\90ã\83΋\81§ã\81¯ã\80\81**Ã¥\8f\96åŸ\97ã\81\97ã\81\9fã\83\89ã\83¡ã\82ۋ\83³**ã\82\92ã\81\82ã\81ªã\81\9fã\81®ã\82µã\83΋\83\90ã\83΋\81®ã\83\91ã\83\97ãªãã¯**IPã¢ãã¬ã¹**ã«åããã¬ã³ãŒãïŒã`A record`ãïŒãèšå®ããŸãã
+DNSã\82µã\83΋\83\90ã\83΋\81§ã\81¯ã\80\81**Ã¥\8f\96åŸ\97ã\81\97ã\81\9fã\83\89ã\83¡ã\82ۋ\83³**ã\82\92ã\81\82ã\81ªã\81\9fã\81®ã\82µã\83΋\83\90ã\83΋\81®ã\83\91ã\83\96ãªãã¯**IPã¢ãã¬ã¹**ã«åããã¬ã³ãŒãïŒã`A record`ãïŒãèšå®ããŸãã
ããã¯ãããããæåã®1åã ãããããã¹ãŠãã»ããã¢ãããããšãã«è¡ãã§ãããã
### DNS { #dns }
-ã\81§ã\81¯ã\80\81å®\9fé\9a\9bã\81®HTTPSã\81®é\83šå\88\86ã\81«Ê³šç\9b®ã\81\97ã\81Šã\81¿ã\82\88ãã
+ã\81§ã\81¯ã\80\81å®\9fé\9a\9bã\81®HTTPSã\81®é\83šå\88\86ã\81«Ê³šç\9b®ã\81\97ã\81Šã\81¿ã\81Ÿã\81\97ã\82\87ãã
ãŸãããã©ãŠã¶ã¯**DNSãµãŒããŒ**ã«**ãã¡ã€ã³ã«å¯ŸããIP**ãäœã§ãããã確èªããŸããä»åã¯ã`someapp.example.com`ãšããŸãã
### SNIæ¡åŒµæ©èœä»ãã®TLS { #tls-with-sni-extension }
-ãµãŒããŒå
ã®**1ã€ã®ããã»ã¹**ã ãããç¹å® ã®**IPã¢ãã¬ã¹**ã®ç¹å®ã®**ããŒã** ã§åŸ
ã¡åããããšãã§ããŸãã
+ãµãŒããŒå
ã®**1ã€ã®ããã»ã¹**ã ãããç¹å®ã®**IPã¢ãã¬ã¹**ã®ç¹å®ã®**ããŒã**ã§åŸ
ã¡åããããšãã§ããŸãã
åãIPã¢ãã¬ã¹ã®ä»ã®ããŒãã§ä»ã®ããã»ã¹ããªãã¹ã³ããŠããå¯èœæ§ããããŸãããIPã¢ãã¬ã¹ãšããŒãã®çµã¿åããããšã«1ã€ã ãã§ãã
ãããã·ããããŒã¯æ¬¡ã®ãšããã§ãïŒ
-* <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>
+* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For)
+* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto)
+* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host)
///
/// tip | è±ç¥è
-ããã«ã€ããŠã¯ã[Behind a Proxy - Enable Proxy Forwarded Headers](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers){.internal-link target=_blank} ã®ããã¥ã¡ã³ãã§è©³ããåŠã¹ãŸãã
+ããã«ã€ããŠã¯ã[Behind a Proxy - Enable Proxy Forwarded Headers](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers) ã®ããã¥ã¡ã³ãã§è©³ããåŠã¹ãŸãã
///
è€æ°ã®ããŒã«ãçµã¿åãããŠèªåã§**ãµãŒããŒããããã€**ããããšãã§ããŸãããäœæ¥ã®äžéšã代è¡ããŠããã **ã¯ã©ãŠããµãŒãã¹** ã䜿ãããšãã§ããŸããã»ãã«ãéžæè¢ããããŸãã
-ããšãã°ãFastAPI ã®éçºããŒã ã§ããç§ãã¡ã¯ãã¯ã©ãŠããžã® FastAPI ã¢ããªã®ãããã€ãå¯èœãªéãåçåããFastAPI ã䜿ã£ãŠéçºããã®ãšåãéçºè
äœéšãæäŸããããã«ã<a href="https://fastapicloud.com" class="external-link" target="_blank">**FastAPI Cloud**</a> ãæ§ç¯ããŸããã
+ããšãã°ãFastAPI ã®éçºããŒã ã§ããç§ãã¡ã¯ãã¯ã©ãŠããžã® FastAPI ã¢ããªã®ãããã€ãå¯èœãªéãåçåããFastAPI ã䜿ã£ãŠéçºããã®ãšåãéçºè
äœéšãæäŸããããã«ã[**FastAPI Cloud**](https://fastapicloud.com) ãæ§ç¯ããŸããã
**FastAPI** ã¢ããªã±ãŒã·ã§ã³ããããã€ããéã«ããããã念é ã«çœ®ãã¹ãäž»èŠãªæŠå¿µãããã€ã玹ä»ããŸãïŒãã ãããã®ã»ãšãã©ã¯ä»ã®çš®é¡ã® Web ã¢ããªã±ãŒã·ã§ã³ã«ãåœãŠã¯ãŸããŸãïŒã
ä»ã«ãããã€ãã®éžæè¢ããããŸã:
-* <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 ã¢ããªã±ãŒã·ã§ã³ã©ã³ã¿ã€ã ã
+* [Uvicorn](https://www.uvicorn.dev/): 髿§èœãª ASGI ãµãŒããŒã
+* [Hypercorn](https://hypercorn.readthedocs.io/): HTTP/2 ã Trio ã«å¯Ÿå¿ãã ASGI ãµãŒããŒãªã©ã
+* [Daphne](https://github.com/django/daphne): Django Channels ã®ããã«äœããã ASGI ãµãŒããŒã
+* [Granian](https://github.com/emmett-framework/granian): Python ã¢ããªã±ãŒã·ã§ã³åãã® Rust 補 HTTP ãµãŒããŒã
+* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): 軜éã§å€çšé㪠Web ã¢ããªã±ãŒã·ã§ã³ã©ã³ã¿ã€ã ã
## ãµãŒããŒãã·ã³ãšãµãŒããŒããã°ã©ã { #server-machine-and-server-program }
ãã ããASGI ãµãŒããŒãæåã§ã€ã³ã¹ããŒã«ããããšãã§ããŸãã
-[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank}ãäœæããŠæå¹åãããµãŒããŒã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããŠãã ããã
+[ä»®æ³ç°å¢](../virtual-environments.md)ãäœæããŠæå¹åãããµãŒããŒã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããŠãã ããã
äŸãšããŠãUvicorn ãã€ã³ã¹ããŒã«ããã«ã¯:
`standard` ãä»ãããšãUvicorn ã¯æšå¥šã®è¿œå äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŠäœ¿çšããŸãã
-ãã®äžã«ã¯ã`asyncio` ã®é«æ§èœãªããããã€ã³ä»£æ¿ã§ããã倧ããªäžŠè¡å®è¡æ§èœã®åäžããããã `uvloop` ãå«ãŸããŸãã
+ãã®äžã«ã¯ã`uvloop` ãå«ãŸããŸãããã㯠`asyncio` ã®é«æ§èœãªããããã€ã³ä»£æ¿ã§ã倧ããªäžŠè¡å®è¡æ§èœã®åäžããããããŸãã
`pip install "fastapi[standard]"` ã®ããã« FastAPI ãã€ã³ã¹ããŒã«ããå Žåã¯ããã§ã« `uvicorn[standard]` ãå«ãŸããŸãã
ã¢ããªã±ãŒã·ã§ã³ããããã€ããéã«ã¯ã**è€æ°ã®ã³ã¢**ãå©çšãããããŠããå€ãã®ãªã¯ãšã¹ããåŠçã§ããããã«ããããã«ãããã»ã¹ã®**ã¬ããªã±ãŒã·ã§ã³**ãæã€ããšãæãã§ãããã
-åã®ãã£ãã¿ãŒã§ãã[ãããã€ã¡ã³ãã®ã³ã³ã»ãã](concepts.md){.internal-link target=_blank}ã«ãŠèŠãŠããããã«ãæå¹ãªæŠç¥ãããã€ããããŸãã
+åã®ãã£ãã¿ãŒã§ãã[ãããã€ã¡ã³ãã®ã³ã³ã»ãã](concepts.md)ã«ãŠèŠãŠããããã«ãæå¹ãªæŠç¥ãããã€ããããŸãã
ããã§ã¯ã`fastapi` ã³ãã³ãããŸã㯠`uvicorn` ã³ãã³ããçŽæ¥äœ¿ã£ãŠã**ã¯ãŒã«ãŒããã»ã¹**ä»ãã® **Uvicorn** ãäœ¿ãæ¹æ³ã玹ä»ããŸãã
/// info | æ
å ±
-DockerãKubernetesãªã©ã®ã³ã³ããã䜿çšããŠããå Žåã¯ã次ã®ç« ã§è©³ãã説æããŸãïŒ [ã³ã³ããå
ã®FastAPI - Docker](docker.md){.internal-link target=_blank}ã
+DockerãKubernetesãªã©ã®ã³ã³ããã䜿çšããŠããå Žåã¯ã次ã®ç« ã§è©³ãã説æããŸãïŒ [ã³ã³ããå
ã®FastAPI - Docker](docker.md)ã
ç¹ã«**Kubernetes**äžã§å®è¡ããå Žåã¯ãããããã¯ãŒã«ãŒã¯äœ¿ããã代ããã«**ã³ã³ããããšã«åäžã®Uvicornããã»ã¹**ãå®è¡ãããã¯ãã§ãããããã«ã€ããŠã¯ãã®ç« ã®åŸåã§èª¬æããŸãã
## ã³ã³ãããšDocker { #containers-and-docker }
-æ¬¡ç« ã®[ã³ã³ããå
ã®FastAPI - Docker](docker.md){.internal-link target=_blank}ã§ã¯ããã®ä»ã®**ãããã€ã¡ã³ãã®ã³ã³ã»ãã**ãæ±ãããã«äœ¿ããæŠç¥ãããã€ã説æããŸãã
+æ¬¡ç« ã®[ã³ã³ããå
ã®FastAPI - Docker](docker.md)ã§ã¯ããã®ä»ã®**ãããã€ã¡ã³ãã®ã³ã³ã»ãã**ãæ±ãããã«äœ¿ããæŠç¥ãããã€ã説æããŸãã
åäžã®Uvicornããã»ã¹ãå®è¡ããããã«ã**ãŒãããç¬èªã®ã€ã¡ãŒãžãæ§ç¯ãã**æ¹æ³ã玹ä»ããŸããããã¯ç°¡åãªããã»ã¹ã§ã**Kubernetes**ã®ãããªåæ£ã³ã³ãã管çã·ã¹ãã ã䜿ãå Žåã«ãããããããããããšã§ãããã
æ°æ©èœãé«é »åºŠã§è¿œå ããã宿çã«ãã°ãä¿®æ£ãããã³ãŒãã¯ç¶ç¶çã«æ¹åãããŠããŸãã
-ãããçŸåšã®ããŒãžã§ã³ãããŸã ã« `0.x.x` ãªçç±ã§ãããããããã®ããŒãžã§ã³ã¯ç Žå£çãªå€æŽããªãããå¯èœæ§ããããŸããããã¯ã<a href="https://semver.org/" class="external-link" target="_blank">ã»ãã³ãã£ã㯠ããŒãžã§ãã³ã°</a>ã®èŠåã«åã£ãŠããŸãã
+ãããçŸåšã®ããŒãžã§ã³ãããŸã ã« `0.x.x` ãªçç±ã§ãããããããã®ããŒãžã§ã³ã¯ç Žå£çãªå€æŽããªãããå¯èœæ§ããããŸããããã¯ã[ã»ãã³ãã£ã㯠ããŒãžã§ãã³ã°](https://semver.org/)ã®èŠåã«åã£ãŠããŸãã
**FastAPI** ã䜿çšãããšæ¬çªçšã¢ããªã±ãŒã·ã§ã³ãä»ããäœæã§ããŸãïŒãããŠãããããããªãã¯ãã°ããåããããããŠããã¯ãã§ãïŒãå¿
èŠãªã®ã¯ãæ®ãã®ã³ãŒããšæ£ããåäœããããŒãžã§ã³ã䜿çšããŠããããšã確èªããããšã ãã§ãã
## å©çšå¯èœãªããŒãžã§ã³ { #available-versions }
-å©çšå¯èœãªããŒãžã§ã³ïŒäŸ: çŸåšã®ææ°ãäœãã確èªããããïŒã¯ã[Release Notes](../release-notes.md){.internal-link target=_blank} ã§ç¢ºèªã§ããŸãã
+å©çšå¯èœãªããŒãžã§ã³ïŒäŸ: çŸåšã®ææ°ãäœãã確èªããããïŒã¯ã[Release Notes](../release-notes.md) ã§ç¢ºèªã§ããŸãã
## ããŒãžã§ã³ã«ã€ã㊠{ #about-versions }
ã¢ããªã±ãŒã·ã§ã³ã«ãã¹ãã远å ãã¹ãã§ãã
-**FastAPI** ã§ã¯éåžžã«ç°¡åã«å®çŸã§ããŸãïŒStarlette ã®ãããã§ãïŒãããã¥ã¡ã³ãã確èªããŠäžãã: [ãã¹ã](../tutorial/testing.md){.internal-link target=_blank}
+**FastAPI** ã§ã¯éåžžã«ç°¡åã«å®çŸã§ããŸãïŒStarlette ã®ãããã§ãïŒãããã¥ã¡ã³ãã確èªããŠäžãã: [ãã¹ã](../tutorial/testing.md)
ãã¹ãã远å ãããã**FastAPI** ã®ããŒãžã§ã³ãããæ°ãããã®ã«ã¢ããã°ã¬ãŒããããã¹ããå®è¡ããããšã§å
šãŠã®ã³ãŒããæ£ããåäœããã確èªã§ããŸãã
/// tip | è±ç¥è
-ã\82\82ã\81\97ã\80\81ã\80\8cç\92°å¢\83å€\89Ê\95°ã\80\8dã\81šã\81¯Àœ\95ã\81\8bã\80\81ã\81\9dã\82\8cã\82\92ã\81©ã\81\86Àœ¿ã\81\86ã\81\8bã\82\92Ê\97¢ã\81«ç\9f¥ã\81£ã\81Šã\81\84ã\82\8b堎å\90\88ã\81¯ã\80\81ã\81\93ã\81®ã\82ȋ\82¯ã\82·ã\83§ã\83³ã\82\92ã\82¹ã\82Âã\83\83ã\83\97ã\81\97ã\81ŠÊ§\8bã\81\84ã\81Ÿã\81\9bã\82\93ã\80\82
+ãããç°å¢å€æ°ããšã¯äœãããããã©ã䜿ãããæ¢ã«ç¥ã£ãŠããå Žåã¯ããã®ã»ã¯ã·ã§ã³ãã¹ãããããŠæ§ããŸããã
///
<div class="termy">
```console
-// You could create an env var MY_NAME with
+// ç°å¢å€æ° MY_NAME ãäœæããäŸ
$ export MY_NAME="Wade Wilson"
-// Then you could use it with other programs, like
+// ãã®åŸãä»ã®ããã°ã©ã ã§å©çšã§ããŸããäŸãã°
$ echo "Hello $MY_NAME"
Hello Wade Wilson
<div class="termy">
```console
-// Create an env var MY_NAME
+// ç°å¢å€æ° MY_NAME ãäœæ
$ $Env:MY_NAME = "Wade Wilson"
-// Use it with other programs, like
+// ä»ã®ããã°ã©ã ã§å©çšãäŸãã°
$ echo "Hello $Env:MY_NAME"
Hello Wade Wilson
/// tip | è±ç¥è
-<a href="https://docs.python.org/3.8/library/os.html#os.getenv" class="external-link" target="_blank">`os.getenv()`</a> ã®ç¬¬2åŒæ°ã¯ãããã©ã«ãã§è¿ãããå€ã§ãã
+[`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) ã®ç¬¬2åŒæ°ã¯ãè¿ãããããã©ã«ãå€ã§ãã
æå®ããªãå Žåãããã©ã«ãã¯`None`ã§ãããããã§ã¯äœ¿çšããããã©ã«ãå€ãšããŠ`"World"`ãæå®ããŠããŸãã
<div class="termy">
```console
-// Here we don't set the env var yet
+// ããã§ã¯ãŸã ç°å¢å€æ°ãèšå®ããŠããŸãã
$ python main.py
-// As we didn't set the env var, we get the default value
+// ç°å¢å€æ°ãèšå®ããŠããªããããããã©ã«ãå€ã䜿ãããŸã
Hello World from Python
-// But if we create an environment variable first
+// ããããå
ã«ç°å¢å€æ°ãäœæãããš
$ export MY_NAME="Wade Wilson"
-// And then call the program again
+// ããããããäžåºŠããã°ã©ã ãå®è¡ãããš
$ python main.py
-// Now it can read the environment variable
+// ãããšç°å¢å€æ°ãèªã¿åããŸã
Hello Wade Wilson from Python
```
<div class="termy">
```console
-// Here we don't set the env var yet
+// ããã§ã¯ãŸã ç°å¢å€æ°ãèšå®ããŠããŸãã
$ python main.py
-// As we didn't set the env var, we get the default value
+// ç°å¢å€æ°ãèšå®ããŠããªããããããã©ã«ãå€ã䜿ãããŸã
Hello World from Python
-// But if we create an environment variable first
+// ããããå
ã«ç°å¢å€æ°ãäœæãããš
$ $Env:MY_NAME = "Wade Wilson"
-// And then call the program again
+// ããããããäžåºŠããã°ã©ã ãå®è¡ãããš
$ python main.py
-// Now it can read the environment variable
+// ãããšç°å¢å€æ°ãèªã¿åããŸã
Hello Wade Wilson from Python
```
<div class="termy">
```console
-// Create an env var MY_NAME in line for this program call
+// ãã®ããã°ã©ã åŒã³åºãçšã«åãè¡ã§ç°å¢å€æ° MY_NAME ãäœæ
$ MY_NAME="Wade Wilson" python main.py
-// Now it can read the environment variable
+// ããã§ç°å¢å€æ°ãèªã¿åããŸã
Hello Wade Wilson from Python
-// The env var no longer exists afterwards
+// ãã®åŸã¯ç°å¢å€æ°ã¯ååšããŸãã
$ python main.py
Hello World from Python
/// tip | è±ç¥è
-詳ãã㯠<a href="https://12factor.net/config" class="external-link" target="_blank">The Twelve-Factor App: èšå®</a> ãåç
§ããŠãã ããã
+詳ãã㯠[The Twelve-Factor App: èšå®](https://12factor.net/config) ãåç
§ããŠãã ããã
///
ã€ãŸããç°å¢å€æ°ããPythonã§èªã¿åã**ããããå€**㯠**`str`ã«ãªã**ãä»ã®åãžã®å€æãããªããŒã·ã§ã³ã¯ã³ãŒãå
ã§è¡ãå¿
èŠããããŸãã
-ç°å¢å€æ°ã䜿ã£ãŠ**ã¢ããªã±ãŒã·ã§ã³èšå®**ãæ±ãæ¹æ³ã«ã€ããŠã¯ã[é«åºŠãªãŠãŒã¶ãŒã¬ã€ã - Settings and Environment Variables](./advanced/settings.md){.internal-link target=_blank} ã§è©³ããåŠã¹ãŸãã
+ç°å¢å€æ°ã䜿ã£ãŠ**ã¢ããªã±ãŒã·ã§ã³èšå®**ãæ±ãæ¹æ³ã«ã€ããŠã¯ã[é«åºŠãªãŠãŒã¶ãŒã¬ã€ã - Settings and Environment Variables](./advanced/settings.md)ã§è©³ããåŠã¹ãŸãã
## `PATH`ç°å¢å€æ° { #path-environment-variable }
////
-ãã®æ
å ±ã¯ã[Virtual Environments](virtual-environments.md){.internal-link target=_blank} ã«ã€ããŠåŠã¶éã«ã圹ç«ã¡ãŸãã
+ãã®æ
å ±ã¯ã[Virtual Environments](virtual-environments.md)ã«ã€ããŠåŠã¶éã«ã圹ç«ã¡ãŸãã
## ãŸãšã { #conclusion }
ããã§ã**ç°å¢å€æ°**ãšã¯äœããPythonã§ã©ã®ããã«äœ¿çšãããã«ã€ããŠãåºæ¬çãªçè§£ãåŸãããã¯ãã§ãã
-ç°å¢å€æ°ã«ã€ããŠã®è©³çްã¯ã<a href="https://en.wikipedia.org/wiki/Environment_variable" class="external-link" target="_blank">Wikipedia ã®ç°å¢å€æ°</a> ãåç
§ããŠãã ããã
+ç°å¢å€æ°ã«ã€ããŠã®è©³çްã¯ã[Wikipedia ã®ç°å¢å€æ°](https://en.wikipedia.org/wiki/Environment_variable)ãåç
§ããŠãã ããã
å€ãã®å Žåãç°å¢å€æ°ãã©ã®ããã«åœ¹ç«ã¡ãããã«é©çšã§ããã®ãã¯ããŸãæç¢ºã§ã¯ãããŸãããããããéçºäžã®ããŸããŸãªã·ããªãªã§äœåºŠãç»å Žãããããç¥ã£ãŠãããšããã§ãããã
# FastAPI CLI { #fastapi-cli }
-**FastAPI CLI** ã¯ãFastAPI ã¢ããªã®æäŸãFastAPI ãããžã§ã¯ãã®ç®¡çãªã©ã«äœ¿çšã§ããã³ãã³ãã©ã€ã³ããã°ã©ã ã§ãã
+**FastAPI <abbr title="command line interface - ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ãŒã¹">CLI</abbr>** ã¯ãFastAPI ã¢ããªã®æäŸãFastAPI ãããžã§ã¯ãã®ç®¡çãªã©ã«äœ¿çšã§ããã³ãã³ãã©ã€ã³ããã°ã©ã ã§ãã
-FastAPI ãã€ã³ã¹ããŒã«ãããšïŒäŸ: `pip install "fastapi[standard]"`ïŒã`fastapi-cli` ãšããããã±ãŒãžãå«ãŸããŸãããã®ããã±ãŒãžãã¿ãŒããã«ã§äœ¿çšãã `fastapi` ã³ãã³ããæäŸããŸãã
+FastAPI ãã€ã³ã¹ããŒã«ãããšïŒäŸ: `pip install "fastapi[standard]"`ïŒãã¿ãŒããã«ã§å®è¡ã§ããã³ãã³ãã©ã€ã³ããã°ã©ã ãä»å±ããŸãã
éçºçšã« FastAPI ã¢ããªãèµ·åããã«ã¯ã`fastapi dev` ã³ãã³ãã䜿çšã§ããŸã:
<div class="termy">
```console
-$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u>
+$ <font color="#4E9A06">fastapi</font> dev
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server ð
</div>
-`fastapi` ãšããã³ãã³ãã©ã€ã³ããã°ã©ã ã **FastAPI CLI** ã§ãã
+/// tip
-FastAPI CLI ã¯ãPython ããã°ã©ã ãžã®ãã¹ïŒäŸ: `main.py`ïŒãåãåãã`FastAPI` ã€ã³ã¹ã¿ã³ã¹ïŒé垞㯠`app`ïŒãèªåæ€åºããé©å㪠import æ¹æ³ã倿ããŠæäŸããŸãã
+æ¬çªã§ã¯ `fastapi dev` ã®ä»£ããã« `fastapi run` ã䜿çšããŸããð
-æ¬çªç°å¢ã§ã¯ä»£ããã« `fastapi run` ã䜿çšããŸããð
+///
+
+å
éšçã«ã¯ã**FastAPI CLI** 㯠[Uvicorn](https://www.uvicorn.dev)ïŒé«æ§èœã§æ¬çªéçšåãã® ASGI ãµãŒããŒïŒã䜿çšããŸããð
+
+`fastapi` CLI ã¯ãå®è¡ãã FastAPI ã¢ããªãèªåæ€åºããããšããŸããæ¢å®ã§ã¯ã`main.py` ã®äžã«ãã `app` ãšããååã®ãªããžã§ã¯ãïŒã»ãã«ãããã€ãã®å€çš®ïŒã§ãããšä»®å®ããŸãã
+
+ãã ãã䜿çšããã¢ããªãæç€ºçã«èšå®ããããšãã§ããŸãã
+
+## `pyproject.toml` ã§ã¢ããªã® `entrypoint` ãèšå® { #configure-the-app-entrypoint-in-pyproject-toml }
+
+`pyproject.toml` ã«æ¬¡ã®ããã«ãã¢ããªã®å Žæãèšå®ã§ããŸã:
+
+```toml
+[tool.fastapi]
+entrypoint = "main:app"
+```
+
+ãã® `entrypoint` ã«ããã`fastapi` ã³ãã³ãã¯æ¬¡ã®ããã«ã¢ããªã import ããå¿
èŠããããšèªèããŸã:
+
+```python
+from main import app
+```
+
+ããã³ãŒãæ§æãæ¬¡ã®ãããªå Žå:
+
+```
+.
+âââ backend
+â  âââ main.py
+â  âââ __init__.py
+```
+
+`entrypoint` ã¯æ¬¡ã®ããã«èšå®ããŸã:
+
+```toml
+[tool.fastapi]
+entrypoint = "backend.main:app"
+```
+
+ããã¯æ¬¡ãšåçã§ã:
+
+```python
+from backend.main import app
+```
+
+### ãã¹æå®ã§ã® `fastapi dev` { #fastapi-dev-with-path }
+
+`fastapi dev` ã³ãã³ãã«ãã¡ã€ã«ãã¹ãæž¡ãããšãã§ãã䜿çšãã FastAPI ã¢ããªãªããžã§ã¯ããæšæž¬ããŸã:
+
+```console
+$ fastapi dev main.py
+```
+
+ãã ãããã®ãã³ã« `fastapi` ã³ãã³ããåŒã³åºãéã«æ£ãããã¹ãæž¡ãå¿
èŠããããŸãã
-å
éšçã«ã¯ã**FastAPI CLI** 㯠<a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a>ïŒé«æ§èœã§æ¬çªéçšåãã® ASGI ãµãŒããŒïŒã䜿çšããŸããð
+ããã«ã[VS Code æ¡åŒµæ©èœ](editor-support.md) ã [FastAPI Cloud](https://fastapicloud.com) ãªã©ãã»ãã®ããŒã«ããããèŠã€ããããªãå ŽåããããŸãããã®ããã`pyproject.toml` ã® `entrypoint` ã䜿çšããããšãæšå¥šããŸãã
## `fastapi dev` { #fastapi-dev }
å€ãã®å ŽåïŒãããŠæšå¥šãããã®ã¯ïŒãäžäœã« HTTPS ãçµç«¯ãããtermination proxyãã眮ããŸããããã¯ã¢ããªã®ãããã€æ¹æ³ã«äŸåãããããã€ãã代è¡ããå Žåãããã°ãèªåã§èšå®ããå¿
èŠãããå ŽåããããŸãã
-/// tip | è±ç¥è
+/// tip
-詳ããã¯ã[ãããã€ã®ããã¥ã¡ã³ã](deployment/index.md){.internal-link target=_blank}ãåç
§ããŠãã ããã
+詳ããã¯ã[ãããã€ã®ããã¥ã¡ã³ã](deployment/index.md)ãåç
§ããŠãã ããã
///
### ãªãŒãã³ã¹ã¿ã³ããŒãæºæ { #based-on-open-standards }
-* 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 äœæã®ããã® [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification)ã<dfn title="å¥å: ãšã³ããã€ã³ããã«ãŒã">ãã¹</dfn> <dfn title="å¥å: HTTP ã¡ãœããïŒPOSTãGETãPUTãDELETE ãªã©ïŒ">ãªãã¬ãŒã·ã§ã³</dfn>ããã©ã¡ãŒã¿ããªã¯ãšã¹ãããã£ãã»ãã¥ãªãã£ãªã©ã®å®£èšãå«ã¿ãŸãã
+* [**JSON Schema**](https://json-schema.org/) ã«ããããŒã¿ã¢ãã«ã®èªåããã¥ã¡ã³ãåïŒOpenAPI èªäœã JSON Schema ã«åºã¥ããŠããŸãïŒã
* å
¥å¿µãªèª¿æ»ã®ããããããã®æšæºãäžå¿ã«èšèšãããŠããŸããåŸä»ãã®ã¬ã€ã€ãŒã§ã¯ãããŸããã
* ããã«ãããå€ãã®èšèªã§èªå **ã¯ã©ã€ã¢ã³ãã³ãŒãçæ** ãå¯èœã§ãã
察話ç㪠API ããã¥ã¡ã³ããšæ¢çŽ¢ç㪠Web ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ããã¬ãŒã ã¯ãŒã¯ã¯ OpenAPI ã«åºã¥ããŠãããããè€æ°ã®ãªãã·ã§ã³ããããããã©ã«ãã§ 2 ã€å«ãŸããŸãã
-* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank"><strong>Swagger UI</strong></a>ãã€ã³ã¿ã©ã¯ãã£ãã«æ¢çŽ¢ãã€ã€ããã©ãŠã¶ããçŽæ¥ API ãåŒã³åºããŠãã¹ãã§ããŸãã
+* [**Swagger UI**](https://github.com/swagger-api/swagger-ui)ãã€ã³ã¿ã©ã¯ãã£ãã«æ¢çŽ¢ãã€ã€ããã©ãŠã¶ããçŽæ¥ API ãåŒã³åºããŠãã¹ãã§ããŸãã

-* <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank"><strong>ReDoc</strong></a> ã«ãã代æ¿ã® API ããã¥ã¡ã³ãã
+* [**ReDoc**](https://github.com/Rebilly/ReDoc) ã«ãã代æ¿ã® API ããã¥ã¡ã³ãã

ãã¹ãŠæšæºã® **Python ã®å** 宣èšïŒPydantic ã«æè¬ïŒã«åºã¥ããŠããŸããæ°ããæ§æãåŠã¶å¿
èŠã¯ãããŸãããæšæºçã§ã¢ãã³ãª Python ã ãã§ãã
-ïŒFastAPI ã䜿ããªãå Žåã§ãïŒPython ã®åã®äœ¿ãæ¹ã 2 åã§åŸ©ç¿ãããå Žåã¯ãçããã¥ãŒããªã¢ã« [Python Types](python-types.md){.internal-link target=_blank} ãåç
§ããŠãã ããã
+ïŒFastAPI ã䜿ããªãå Žåã§ãïŒPython ã®åã®äœ¿ãæ¹ã 2 åã§åŸ©ç¿ãããå Žåã¯ãçããã¥ãŒããªã¢ã« [Python ã®å](python-types.md) ãåç
§ããŠãã ããã
åã䜿ã£ãæšæºç㪠Python ãèšè¿°ããŸã:
from pydantic import BaseModel
-# 倿°ã str ãšããŠå®£èš
-# ãããŠé¢æ°å
ã§ãšãã£ã¿æ¯æŽãåãã
+# Declare a variable as a str
+# and get editor support inside the function
def main(user_id: str):
return user_id
-# Pydantic ã¢ãã«
+# A Pydantic model
class User(BaseModel):
id: int
name: str
ãã¬ãŒã ã¯ãŒã¯å
šäœã䜿ããããçŽæçã«ãªãããèšèšãããŠãããæé«ã®éçºäœéšã確ä¿ãããããéçºéå§åããè€æ°ã®ãšãã£ã¿ã§ããããå€æãæ€èšŒãããŠããŸãã
-Python éçºè
調æ»ã§ã¯ã<a href="https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features" class="external-link" target="_blank">æããã䜿ãããæ©èœã® 1 ã€ãããªãŒãã³ã³ããªãŒããã§ããããšãæããã§ã</a>ã
+Python éçºè
調æ»ã§ã¯ã[æããã䜿ãããæ©èœã® 1 ã€ãããªãŒãã³ã³ããªãŒããã§ããããšãæããã§ã](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features)ã
**FastAPI** ã¯ãã®èŠæ±ãæºããããšãåºç€ã«ããŠããŸãããªãŒãã³ã³ããªãŒãã¯ã©ãã§ãæ©èœããŸãã
ãšãã£ã¿ãã©ã®ããã«åœ¹ç«ã€ãã®äŸã§ã:
-* <a href="https://code.visualstudio.com/" class="external-link" target="_blank">Visual Studio Code</a> ã®å Žå:
+* [Visual Studio Code](https://code.visualstudio.com/) ã®å Žå:

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

OpenAPI ã§å®çŸ©ããããã¹ãŠã®ã»ãã¥ãªãã£ã¹ããŒã ããµããŒãããŸã:
* HTTP Basicã
-* **OAuth2**ïŒ**JWT ããŒã¯ã³** ãå¯ïŒããã¥ãŒããªã¢ã« [JWT ãçšãã OAuth2](tutorial/security/oauth2-jwt.md){.internal-link target=_blank} ã確èªããŠãã ããã
+* **OAuth2**ïŒ**JWT ããŒã¯ã³** ãå¯ïŒããã¥ãŒããªã¢ã« [JWT ãçšãã OAuth2](tutorial/security/oauth2-jwt.md) ã確èªããŠãã ããã
* API ããŒïŒä»¥äžã®å ŽæïŒ:
* ããããŒã
* ã¯ãšãªãã©ã¡ãŒã¿ã
## Starletteã®æ©èœ { #starlette-features }
-**FastAPI** 㯠<a href="https://www.starlette.dev/" class="external-link" target="_blank"><strong>Starlette</strong></a> ãšå®å
šã«äºææ§ãããïŒãã€ããã«åºã¥ããŠããŸãïŒããã®ãããæå
ã® Starlette ã®è¿œå ã³ãŒããåäœããŸãã
+**FastAPI** 㯠[**Starlette**](https://www.starlette.dev/) ãšå®å
šã«äºææ§ãããïŒãã€ããã«åºã¥ããŠããŸãïŒããã®ãããæå
ã® Starlette ã®è¿œå ã³ãŒããåäœããŸãã
`FastAPI` ã¯å®éã«ã¯ `Starlette` ã®ãµãã¯ã©ã¹ã§ãããã§ã« Starlette ãç¥ã£ãŠããããããã¯äœ¿ã£ãŠãããªããã»ãšãã©ã®æ©èœã¯åãããã«åäœããŸãã
**FastAPI** ã§ã¯ **Starlette** ã®ãã¹ãŠã®æ©èœãå©çšã§ããŸãïŒFastAPI ã¯åŒ·åããã Starlette ã«ãããŸããïŒ:
-* å§åçãªããã©ãŒãã³ã¹ã<a href="https://github.com/encode/starlette#performance" class="external-link" target="_blank">å©çšå¯èœãªæéã¯ã©ã¹ã® Python ãã¬ãŒã ã¯ãŒã¯ã® 1 ã€ã§ã**NodeJS** ã **Go** ãšåçã§ã</a>ã
+* å§åçãªããã©ãŒãã³ã¹ã[å©çšå¯èœãªæéã¯ã©ã¹ã® Python ãã¬ãŒã ã¯ãŒã¯ã® 1 ã€ã§ã**NodeJS** ã **Go** ãšåçã§ã](https://github.com/encode/starlette#performance)ã
* **WebSocket** ã®ãµããŒãã
* ããã»ã¹å
ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã
* èµ·åããã³ã·ã£ããããŠã³ã€ãã³ãã
## Pydanticã®æ©èœ { #pydantic-features }
-**FastAPI** 㯠<a href="https://docs.pydantic.dev/" class="external-link" target="_blank"><strong>Pydantic</strong></a> ãšå®å
šã«äºææ§ãããïŒãã€ããã«åºã¥ããŠããŸãïŒããã®ãããæå
ã® Pydantic ã®è¿œå ã³ãŒããåäœããŸãã
+**FastAPI** 㯠[**Pydantic**](https://docs.pydantic.dev/) ãšå®å
šã«äºææ§ãããïŒãã€ããã«åºã¥ããŠããŸãïŒããã®ãããæå
ã® Pydantic ã®è¿œå ã³ãŒããåäœããŸãã
Pydantic ã«åºã¥ãå€éšã©ã€ãã©ãªïŒããŒã¿ããŒã¹çšã® <abbr title="Object-Relational Mapper - ãªããžã§ã¯ãé¢ä¿ããããŒ">ORM</abbr>ã<abbr title="Object-Document Mapper - ãªããžã§ã¯ãããã¥ã¡ã³ãããããŒ">ODM</abbr> ãªã©ïŒãå«ãŸããŸãã
## ãã¥ãŒã¹ã¬ã¿ãŒãè³Œèª { #subscribe-to-the-newsletter }
-[**FastAPI and friends** ãã¥ãŒã¹ã¬ã¿ãŒ](newsletter.md){.internal-link target=_blank}ïŒé
ä¿¡ã¯ãŸãã§ãïŒã賌èªãããšãæ¬¡ã®æ
å ±ããã£ããã¢ããã§ããŸã:
+[**FastAPI and friends** ãã¥ãŒã¹ã¬ã¿ãŒ](newsletter.md)ïŒé
ä¿¡ã¯ãŸãã§ãïŒã賌èªãããšãæ¬¡ã®æ
å ±ããã£ããã¢ããã§ããŸã:
* FastAPI ãšé¢é£ãããžã§ã¯ãã®ãã¥ãŒã¹ ð
* ã¬ã€ã ð
## X (Twitter) ã§ FastAPI ããã©ã㌠{ #follow-fastapi-on-x-twitter }
-<a href="https://x.com/fastapi" class="external-link" target="_blank">**X (Twitter)** ã§ @fastapi ããã©ããŒ</a>ããŠã**FastAPI** ã®ææ°æ
å ±ãåãåããŸããããðŠ
+[**X (Twitter)** ã§ @fastapi ããã©ããŒ](https://x.com/fastapi)ããŠã**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ã§FastAPIã«ãStarããã€ããããšãã§ããŸãïŒå³äžéšã®Starãã¿ã³ãã¯ãªãã¯ïŒ: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi)ãâïž
ã¹ã¿ãŒãå¢ããããšã§ãä»ã®ãŠãŒã¶ãŒã®ç®ã«ã€ãããããªãããã§ã«å€ãã®äººã®åœ¹ã«ç«ã£ãŠããããšãäŒãããŸãã
## 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>ãð
+GitHubã§FastAPIããWatchãã§ããŸãïŒå³äžéšã®ãWatchããã¿ã³ãã¯ãªãã¯ïŒ: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi)ãð
ããã§ãReleases onlyããéžæã§ããŸãã
## éçºè
ãšã€ãªãã { #connect-with-the-author }
-äœè
ã§ãã<a href="https://tiangolo.com" class="external-link" target="_blank">ç§ïŒSebastián RamÃrez / `tiangolo`ïŒ</a>ãšã€ãªãããŸãã
+äœè
ã§ãã[ç§ïŒSebastián RamÃrez / `tiangolo`ïŒ](https://tiangolo.com)ãšã€ãªãããŸãã
ã§ããããš:
-* <a href="https://github.com/tiangolo" class="external-link" target="_blank">**GitHub** ã§ãã©ããŒ</a>ã
+* [**GitHub** ã§ãã©ããŒ](https://github.com/tiangolo)ã
* 圹ã«ç«ã€ãããããªããç§ãäœæããä»ã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ããèŠãããŸãã
* æ°ãããªãŒãã³ãœãŒã¹ãããžã§ã¯ããäœæãããšãã«ããããŸãã
-* <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>ã
+* [**X (Twitter)** ã§ãã©ããŒ](https://x.com/tiangolo) ãŸã㯠[Mastodon](https://fosstodon.org/@tiangolo)ã
* ããªããã©ã®ããã«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) ã® @fastapi](https://x.com/fastapi)ïŒå¥ã¢ã«ãŠã³ãïŒããã©ããŒã§ããŸãã
+* [**LinkedIn** ã§ãã©ããŒ](https://www.linkedin.com/in/tiangolo/)ã
* æ°ããããŒã«ã®åç¥ããªãªãŒã¹ãèããŸãïŒãã ã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> ã§å·çå
容ãèªãïŒãŸãã¯ãã©ããŒïŒã
+* [**Dev.to**](https://dev.to/tiangolo) ã [**Medium**](https://medium.com/@tiangolo) ã§å·çå
容ãèªãïŒãŸãã¯ãã©ããŒïŒã
* ç§ã®ã¢ã€ãã¢ããäœæããããŒã«ã«é¢ããèšäºãèªããŸãã
* æ°ããèšäºãå
¬éãããšãã«èªããŸãã
## **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** ã«ã€ããŠãã€ãŒã](https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi)ããŠããªãæ°ã«å
¥ã£ãŠããã®ããç§ãä»ã®äººã«æããŠãã ãããð
**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>ã
+* [Slantã§ **FastAPI** ã«æç¥š](https://www.slant.co/options/34241/~fastapi-review)ã
+* [AlternativeToã§ **FastAPI** ã«æç¥š](https://alternativeto.net/software/fastapi/about/)ã
+* [StackShare ã§ **FastAPI** ã䜿ã£ãŠãããšå®£èš](https://stackshare.io/pypi-fastapi)ã
## 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>
+* [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered)
+* [GitHub Issues](https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+)
å€ãã®å Žåããã®è³ªåã®çãããã§ã«ç¥ã£ãŠãããããããŸãããð€
-ããå€ãã®äººã®è³ªåã«çããŠå©ããŠããããªããããªãã¯å
¬åŒã®[FastAPI Expert](fastapi-people.md#fastapi-experts){.internal-link target=_blank}ã«ãªããŸããð
+ããå€ãã®äººã®è³ªåã«çããŠå©ããŠããããªããããªãã¯å
¬åŒã®[FastAPI Expert](fastapi-people.md#fastapi-experts)ã«ãªããŸããð
æã倧äºãªãã€ã³ãã¯ã芪åã§ããããšããå¿ãããããšã§ãã人ã¯ãã©ã¹ãã¬ãŒã·ã§ã³ãæ±ããŠãã£ãŠæ¥ãã®ã§ãå¿
ãããæè¯ã®èãæ¹ãããŠãããšã¯éããŸããããã§ããéã芪åã«å¯Ÿå¿ããŸããããð€
* 質åãçè§£ã§ããªãå Žåã¯ãããã«ã詳现ããå°ããŸãã
-### åé¡ãåçŸãã { #reproduce-the-problem }
+### é®é¡ãåçŸãã { #reproduce-the-problem }
å€ãã®ã±ãŒã¹ã質åã¯ããã®äººã®ãå
ã®ã³ãŒããã«é¢ä¿ããŠããŸãã
ãã°ãã°ã³ãŒãã®æçã ããå
±æãããŸãããããã§ã¯åé¡ããåçŸãããã«ã¯äžååã§ãã
-* ããŒã«ã«ã§åããšã©ãŒãæåã確èªã§ããããã«ããŸãã¯ãŠãŒã¹ã±ãŒã¹ãããããçè§£ã§ããããã«ã**ã³ããŒ&ããŒã¹ã**ããŠå®è¡ã§ãã<a href="https://stackoverflow.com/help/minimal-reproducible-example" class="external-link" target="_blank">æå°ã®åçŸå¯èœãªäŸ</a>ã®æäŸãäŸé Œã§ããŸãã
+* ããŒã«ã«ã§åããšã©ãŒãæåã確èªã§ããããã«ããŸãã¯ãŠãŒã¹ã±ãŒã¹ãããããçè§£ã§ããããã«ã**ã³ããŒ&ããŒã¹ã**ããŠå®è¡ã§ãã[æå°ã®åçŸå¯èœãªäŸ](https://stackoverflow.com/help/minimal-reproducible-example)ã®æäŸãäŸé Œã§ããŸãã
* ãšãŠãå¯å€§ãªæ°åãªããåé¡ã®èª¬æã ããããšã«ãããªãèªèº«ã§ãã®ãããª**äŸãäœæ**ããŠã¿ãããšãã§ããŸãããã ãæéããããå¯èœæ§ãé«ãã®ã§ããŸãã¯åé¡ã®æç¢ºåãäŸé Œããæ¹ãè¯ãå ŽåããããŸãã
## 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>ãð
+GitHubã§FastAPIããWatchãã§ããŸãïŒå³äžéšã®ãWatchããã¿ã³ãã¯ãªãã¯ïŒ: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi)ãð
ã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>ãäœæã§ããŸããäŸãã°:
+GitHubã¬ããžããªã§[æ°ãã質å](https://github.com/fastapi/fastapi/discussions/new?category=questions)ãäœæã§ããŸããäŸãã°:
* **質å**ãããããŸãã¯**åé¡**ã«ã€ããŠå°ããã
* æ°ãã**æ©èœ**ãææ¡ããã
## ãã«ãªã¯ãšã¹ããäœæ { #create-a-pull-request }
-[è²¢ç®](contributing.md){.internal-link target=_blank}ãšããŠã次ã®ããã«ãã«ãªã¯ãšã¹ãã§ãœãŒã¹ã³ãŒãã«è²¢ç®ã§ããŸã:
+[è²¢ç®](contributing.md)ãšããŠã次ã®ããã«ãã«ãªã¯ãšã¹ãã§ãœãŒã¹ã³ãŒãã«è²¢ç®ã§ããŸã:
* ããã¥ã¡ã³ãã§èŠã€ããã¿ã€ãã®ä¿®æ£ã
-* èªåãäœæ/çºèŠãã FastAPI ã«é¢ããèšäºã»åç»ã»ããããã£ã¹ããã<a href="https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml" class="external-link" target="_blank">ãã®ãã¡ã€ã«ãç·šé</a>ããŠå
±æã
+* èªåãäœæ/çºèŠãã FastAPI ã«é¢ããèšäºã»åç»ã»ããããã£ã¹ããã[ãã®ãã¡ã€ã«ãç·šé](https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml)ããŠå
±æã
* 該åœã»ã¯ã·ã§ã³ã®å
é ã«ãªã³ã¯ã远å ããŠãã ããã
-* èªåã®èšèªãžã®[ããã¥ã¡ã³ã翻蚳ãæäŒã](contributing.md#translations){.internal-link target=_blank}ã
+* èªåã®èšèªãžã®[ããã¥ã¡ã³ã翻蚳ãæäŒã](contributing.md#translations)ã
* ä»ã®äººãäœæãã翻蚳ã®ã¬ãã¥ãŒãæäŒããŸãã
* æ°ããããã¥ã¡ã³ãã»ã¯ã·ã§ã³ã®ææ¡ã
* æ¢åã®issue/ãã°ã®ä¿®æ£ã
ä»ããã§ããäž»ãªã¿ã¹ã¯ã¯æ¬¡ã®ãšããã§ã:
-* [GitHubã§è³ªåã«å°ã£ãŠãã人ãå©ãã](#help-others-with-questions-in-github){.internal-link target=_blank}ïŒäžã®ã»ã¯ã·ã§ã³ãåç
§ïŒã
-* [ãã«ãªã¯ãšã¹ããã¬ãã¥ãŒ](#review-pull-requests){.internal-link target=_blank}ïŒäžã®ã»ã¯ã·ã§ã³ãåç
§ïŒã
+* [GitHubã§è³ªåã«å°ã£ãŠãã人ãå©ãã](#help-others-with-questions-in-github)ïŒäžã®ã»ã¯ã·ã§ã³ãåç
§ïŒã
+* [ãã«ãªã¯ãšã¹ããã¬ãã¥ãŒ](#review-pull-requests)ïŒäžã®ã»ã¯ã·ã§ã³ãåç
§ïŒã
ãã®2ã€ã**æãæéãæ¶è²»**ããŸããFastAPI ã®ã¡ã³ããã³ã¹äœæ¥ã®äžå¿ã§ãã
## ãã£ããã«åå { #join-the-chat }
-ð¥ <a href="https://discord.gg/VQjSZaeJmf" class="external-link" target="_blank">Discord ãã£ãããµãŒããŒ</a> ð¥ ã«åå ããFastAPI ã³ãã¥ããã£ã®ã¿ããªãšäº€æµããŸãããã
+ð¥ [Discord ãã£ãããµãŒããŒ](https://discord.gg/VQjSZaeJmf) ð¥ ã«åå ããFastAPI ã³ãã¥ããã£ã®ã¿ããªãšäº€æµããŸãããã
/// 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}ããå©ããŠããããå¯èœæ§ããã£ãšé«ãã§ãã
+質å㯠[GitHub Discussions](https://github.com/fastapi/fastapi/discussions/new?category=questions) ã«æçš¿ããŠãã ããããããªã[FastAPI Experts](fastapi-people.md#fastapi-experts)ããå©ããŠããããå¯èœæ§ããã£ãšé«ãã§ãã
ãã£ããã¯äžè¬çãªäŒè©±ã®ã¿ã«äœ¿ããŸãããã
GitHub ã§ã¯ããã³ãã¬ãŒããæ£ãã圢ã§è³ªåãæžãã®ãå©ããŠããããããè¯ãåçãåŸããããªããŸããã質åããåã«èªåã§åé¡ã解決ã§ããããšããããŸããããã«GitHubãªããæéãããã£ãŠãç§ãå¿
ããã¹ãŠã«åçã§ããããã«ã§ããŸãããã£ããã§ã¯ç§å人ã«ã¯ãããã§ããŸãããð
-ãã£ããã§ã®äŒè©±ã¯GitHubã»ã©æ€çŽ¢ãããããªãããã質åãšåçãäŒè©±ã«åãããã¡ã§ãããããŠã[FastAPI Expert](fastapi-people.md#fastapi-experts){.internal-link target=_blank}ã«ãªãããã«ã«ãŠã³ããããã®ã¯GitHubäžã®æŽ»åã ãã§ããã§ããããGitHubã®æ¹ã泚ç®ãéããããã§ãããã
+ãã£ããã§ã®äŒè©±ã¯GitHubã»ã©æ€çŽ¢ãããããªãããã質åãšåçãäŒè©±ã«åãããã¡ã§ãããããŠã[FastAPI Expert](fastapi-people.md#fastapi-experts)ã«ãªãããã«ã«ãŠã³ããããã®ã¯GitHubäžã®æŽ»åã ãã§ããã§ããããGitHubã®æ¹ã泚ç®ãéããããã§ãããã
äžæ¹ã§ããã£ããã«ã¯æ°å人ã®ãŠãŒã¶ãŒããããããã»ãŒåžžã«èª°ããšäŒè©±ã§ããå¯èœæ§ãé«ãã§ããð
## äœè
ãã¹ãã³ãµãŒ { #sponsor-the-author }
-ããªãã®**補å/äŒç€Ÿ**ã **FastAPI** ã«äŸåããŠããããŸãã¯é¢é£ããŠããããã®ãŠãŒã¶ãŒã«ãªãŒããããå Žåã¯ã<a href="https://github.com/sponsors/tiangolo" class="external-link" target="_blank">GitHub sponsors</a> ãéããŠäœè
ïŒç§ïŒãæ¯æŽã§ããŸãããã©ã³ã«å¿ããŠãããã¥ã¡ã³ãã«ãããžã衚瀺ããããªã©ã®ç¹å
žãããå ŽåããããŸããð
+ããªãã®**補å/äŒç€Ÿ**ã **FastAPI** ã«äŸåããŠããããŸãã¯é¢é£ããŠããããã®ãŠãŒã¶ãŒã«ãªãŒããããå Žåã¯ã[GitHub sponsors](https://github.com/sponsors/tiangolo) ãéããŠäœè
ïŒç§ïŒãæ¯æŽã§ããŸãããã©ã³ã«å¿ããŠãããã¥ã¡ã³ãã«ãããžã衚瀺ããããªã©ã®ç¹å
žãããå ŽåããããŸããð
---
# æŽå²ãèšèšããããŠãããã { #history-design-and-future }
-å°ãåã«ã<a href="https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920" class="external-link" target="_blank">**FastAPI**ã®ãŠãŒã¶ãŒã«ä»¥äžã®æ§ã«å°ããããŸãã</a>:
+ãã°ããåã«ã[ãã **FastAPI** ãŠãŒã¶ãŒã質åããŸãã](https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920):
> ãã®ãããžã§ã¯ãã®æŽå²ã¯ïŒäœããªããšãããããæ°é±éã§ããããã®ãã§ããŠããããã§ãã [...]
**FastAPI** ã®æŽå²ã¯ããã®åèº«ã®æŽå²ã倧éšåãå ããŠããŸãã
-[代æ¿ããŒã«ããåããã€ã³ã¹ãã¬ãŒã·ã§ã³ãšæ¯èŒ](alternatives.md){.internal-link target=_blank}ã®ã»ã¯ã·ã§ã³ã§ããè¿°ã¹ãŠããŸã:
+[ä»£æ¿ææ®µ](alternatives.md)ã®ã»ã¯ã·ã§ã³ã§ããè¿°ã¹ãŠããŸã:
<blockquote markdown="1">
ãã£ãšã人æ°ã®ããPythonãšãã£ã¿ãŒã§ããã€ãã®ã¢ã€ãã¢ããã¹ãããŸãããPyCharmãVS CodeãJediããŒã¹ã®ãšãã£ã¿ãŒã§ãã
-ææ°ã® <a href="https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools" class="external-link" target="_blank">Pythonéçºè
調æ»</a>ã§ããããã®ãšãã£ã¿ãŒããŠãŒã¶ãŒã®80%ãã«ããŒããŠããŸããã
+ææ°ã® [Pythonéçºè
調æ»](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools)ã§ããããã®ãšãã£ã¿ãŒããŠãŒã¶ãŒã®80%ãã«ããŒããŠããŸããã
ããã¯ã**FastAPI**ãPythonéçºè
ã®80%ã䜿çšããŠãããšãã£ã¿ãŒã§ç¹å¥ã«ãã¹ããããããšãæå³ããŸãããŸããã»ãšãã©ã®ä»ã®ãšãã£ã¿ãŒãåæ§ã«åäœããåŸåãããããããã®æ©æµã¯äºå®äžãã¹ãŠã®ãšãã£ã¿ãŒã§ãããããã¯ãã§ãã
## èŠä»¶ { #requirements }
-ããã€ãã®ä»£æ¿ææ³ã詊ããããšãç§ã¯<a href="https://docs.pydantic.dev/" class="external-link" target="_blank">**Pydantic**</a>ã®åŒ·ã¿ãå©çšããããšã決ããŸããã
+ããã€ãã®ä»£æ¿ææ³ã詊ããããšãç§ã¯[**Pydantic**](https://docs.pydantic.dev/)ã®åŒ·ã¿ãå©çšããããšã決ããŸããã
ãããŠãJSON Schemaã«å®å
šã«æºæ ããããã«ããããå¶çŽå®£èšãå®çŸ©ããããŸããŸãªæ¹æ³ããµããŒãããããããã€ãã®ãšãã£ã¿ãŒã§ã®ãã¹ãã«åºã¥ããŠãšãã£ã¿ãŒã®ãµããŒã (åãã§ãã¯ãèªåè£å®) ãæ¹åããããã«è²¢ç®ããŸããã
-éçºäžããã1ã€ã®éèŠãªéµãšãªã<a href="https://www.starlette.dev/" class="external-link" target="_blank">**Starlette**</a>ã«ãè²¢ç®ããŸããã
+éçºäžããã1ã€ã®éèŠãªéµãšãªã[**Starlette**](https://www.starlette.dev/)ã«ãè²¢ç®ããŸããã
## éçº { #development }
**FastAPI**ã«ã¯å€§ããªæªæ¥ãåŸ
ã£ãŠããŸãã
-ãããŠã[ããªãã®å©ã](help-fastapi.md){.internal-link target=_blank}ã倧ãã«æè¿ããŸãã
+ãããŠã[ããªãã®å©ã](help-fastapi.md)ã倧ãã«æè¿ããŸãã
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>ã
+FastAPI ããŒãžã§ã³ `0.122.0` 以éã§ã¯ãããé©å㪠HTTP ã¹ããŒã¿ã¹ã³ãŒã `401 Unauthorized` ã䜿çšããHTTP 仿§ã«åŸã£ãŠã¬ã¹ãã³ã¹ã«åŠ¥åœãª `WWW-Authenticate` ããããŒãå«ããŸãã[RFC 7235](https://datatracker.ietf.org/doc/html/rfc7235#section-3.1), [RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized)ã
ããããäœããã®çç±ã§ã¯ã©ã€ã¢ã³ããåŸæ¥ã®æåã«äŸåããŠããå Žåã¯ãã»ãã¥ãªãã£ã¯ã©ã¹ã§ã¡ãœãã `make_not_authenticated_error` ããªãŒããŒã©ã€ãããããšã§ããã®æåã«æ»ããŸãã
ããã»ãã¥ãªãã£äžã®æ¬ é¥ããœãŒã¹ã³ãŒãã«ãããªãã°ãããã¯ååšãããŸãŸã§ãã
-ããã¥ã¡ã³ããŒã·ã§ã³ãé衚瀺ã«ããã®ã¯ãåã«ããªãã®APIãžã®ã¢ã¯ã»ã¹æ¹æ³ãé£è§£ã«ããã ãã§ãªããåæã«ããªãèªèº«ã®æ¬çªç°å¢ã§ã®APIã®ãããã°ãå°é£ã«ããŠããŸãå¯èœæ§ããããŸããåçŽã«ã <a href="https://en.wikipedia.org/wiki/Security_through_obscurity" class="external-link" target="_blank">ç§å¿ã«ããã»ãã¥ãªãã£</a> ã®äžã€ã®åœ¢æ
ãšããŠèããããã§ãããã
+ããã¥ã¡ã³ããŒã·ã§ã³ãé衚瀺ã«ããã®ã¯ãåã«ããªãã®APIãžã®ã¢ã¯ã»ã¹æ¹æ³ãé£è§£ã«ããã ãã§ãªããåæã«ããªãèªèº«ã®æ¬çªç°å¢ã§ã®APIã®ãããã°ãå°é£ã«ããŠããŸãå¯èœæ§ããããŸããåçŽã«ã[ç§å¿ã«ããã»ãã¥ãªãã£](https://en.wikipedia.org/wiki/Security_through_obscurity) ã®äžã€ã®åœ¢æ
ãšããŠèããããã§ãããã
ããããªãã®APIã®ã»ãã¥ãªãã£ã匷åããããªããããã€ãã®ããããæ¹æ³ããããŸããäŸã瀺ããšã
# 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>ãèšå®ã§ããŸãã
+ããã€ãã®è¿œå ã® [Swagger UI ãã©ã¡ãŒã¿](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/)ãèšå®ã§ããŸãã
èšå®ããã«ã¯ã`FastAPI()` ã®ã¢ããªãªããžã§ã¯ããäœæãããšãããŸã㯠`get_swagger_ui_html()` 颿°ã« `swagger_ui_parameters` åŒæ°ãæž¡ããŸãã
## ãã®ä»ã® 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>ãåç
§ããŠãã ããã
+å©çšå¯èœãªä»ã®ãã¹ãŠã®èšå®ã«ã€ããŠã¯ãå
¬åŒã® [Swagger UI ãã©ã¡ãŒã¿ã®ããã¥ã¡ã³ã](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/)ãåç
§ããŠãã ããã
## JavaScript å°çšã®èšå® { #javascript-only-settings }
### ãã¹ã { #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 ãããããã®ã¢ã»ãããèªã¿èŸŒãŸããã¯ãã§ãã
+ããã§ã[http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) ã«ã¢ã¯ã»ã¹ããŠããŒãžãåèªã¿èŸŒã¿ãããšãæ°ãã CDN ãããããã®ã¢ã»ãããèªã¿èŸŒãŸããã¯ãã§ãã
## ããã¥ã¡ã³ãçš JavaScript ãš CSS ã®ã»ã«ããã¹ãã£ã³ã° { #self-hosting-javascript-and-css-for-docs }
**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>
+- [`swagger-ui-bundle.js`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js)
+- [`swagger-ui.css`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css)
ãã㊠**ReDoc** ã§ã¯æ¬¡ã®ãã¡ã€ã«ã䜿çšããŸã:
-- <a href="https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js" class="external-link" target="_blank">`redoc.standalone.js`</a>
+- [`redoc.standalone.js`](https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js)
ãã®åŸããã¡ã€ã«æ§æã¯æ¬¡ã®ããã«ãªããŸã:
### éçãã¡ã€ã«ã®ãã¹ã { #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> ã«ã¢ã¯ã»ã¹ããŸãã
+ã¢ããªã±ãŒã·ã§ã³ãèµ·åãã[http://127.0.0.1:8000/static/redoc.standalone.js](http://127.0.0.1:8000/static/redoc.standalone.js) ã«ã¢ã¯ã»ã¹ããŸãã
**ReDoc** çšã®éåžžã«é·ã JavaScript ãã¡ã€ã«ã衚瀺ãããã¯ãã§ãã
### éçãã¡ã€ã« 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> ã«ã¢ã¯ã»ã¹ããããŒãžãåèªã¿èŸŒã¿ã§ããã¯ãã§ãã
+ããã§ãWiFi ãåæã㊠[http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) ã«ã¢ã¯ã»ã¹ããããŒãžãåèªã¿èŸŒã¿ã§ããã¯ãã§ãã
ã€ã³ã¿ãŒãããã«æ¥ç¶ããŠããªããŠããAPI ã®ããã¥ã¡ã³ãã衚瀺ããAPI ãšå¯Ÿè©±ã§ããŸãã
ãŠãŒã¹ã±ãŒã¹ã®äŸ:
-* JSON ã§ã¯ãªããªã¯ãšã¹ãããã£ã JSON ã«å€æããïŒäŸ: <a href="https://msgpack.org/index.html" class="external-link" target="_blank">`msgpack`</a>ïŒã
+* JSON ã§ã¯ãªããªã¯ãšã¹ãããã£ã JSON ã«å€æããïŒäŸ: [`msgpack`](https://msgpack.org/index.html)ïŒã
* gzip å§çž®ããããªã¯ãšã¹ãããã£ã®è§£åã
* ãã¹ãŠã®ãªã¯ãšã¹ãããã£ã®èªåãã®ã³ã°ã
/// tip | è±ç¥è
-ããã¯ä»çµã¿ã瀺ãããã®ãµã³ãã«ã§ããGzip 察å¿ãå¿
èŠãªå Žåã¯ãçšæãããŠãã [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank} ã䜿çšã§ããŸãã
+ããã¯ä»çµã¿ã瀺ãããã®ãµã³ãã«ã§ããGzip 察å¿ãå¿
èŠãªå Žåã¯ãçšæãããŠãã [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware) ã䜿çšã§ããŸãã
///
ãããŠãã® 2 ã€ïŒ`scope` ãš `receive`ïŒããæ°ãã `Request` ã€ã³ã¹ã¿ã³ã¹ãäœæããããã«å¿
èŠãªãã®ã§ãã
-`Request` ã«ã€ããŠè©³ããã¯ã<a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">Starlette ã® Requests ã«é¢ããããã¥ã¡ã³ã</a> ãåç
§ããŠãã ããã
+`Request` ã«ã€ããŠè©³ããã¯ã[Starlette ã® Requests ã«é¢ããããã¥ã¡ã³ã](https://www.starlette.dev/requests/) ãåç
§ããŠãã ããã
///
/// tip | è±ç¥è
-åãåé¡ã解決ããã«ã¯ã`RequestValidationError` çšã®ã«ã¹ã¿ã ãã³ãã©ã§ `body` ãäœ¿ãæ¹ããã£ãšç°¡åã§ãããïŒ[ãšã©ãŒåŠç](../tutorial/handling-errors.md#use-the-requestvalidationerror-body){.internal-link target=_blank}ïŒã
+åãåé¡ã解決ããã«ã¯ã`RequestValidationError` çšã®ã«ã¹ã¿ã ãã³ãã©ã§ `body` ãäœ¿ãæ¹ããã£ãšç°¡åã§ãããïŒ[ãšã©ãŒåŠç](../tutorial/handling-errors.md#use-the-requestvalidationerror-body)ïŒã
ãã ãããã®äŸãæå¹ã§ãå
éšã³ã³ããŒãã³ããšã©ã®ããã«ããåããããã瀺ããŠããŸãã
äžèšã®æ
å ±ã䜿ã£ãŠãåããŠãŒãã£ãªãã£é¢æ°ã§ 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>ã远å ããŠã¿ãŸãããã
+ããšãã°ã[ã«ã¹ã¿ã ããŽãå«ããããã® ReDoc ã® OpenAPI æ¡åŒµ](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo)ã远å ããŠã¿ãŸãããã
### éåžžã® **FastAPI** { #normal-fastapi }
### ç¢ºèª { #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** ã®ããŽïŒã䜿ãããŠããããšã確èªã§ããŸã:
+[http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) ã«ã¢ã¯ã»ã¹ãããšãã«ã¹ã¿ã ããŽïŒãã®äŸã§ã¯ **FastAPI** ã®ããŽïŒã䜿ãããŠããããšã確èªã§ããŸã:
<img src="/img/tutorial/extending-openapi/image01.png">
## ããŒã¿ã®ãã£ã«ã¿ãªã³ã° - ã»ãã¥ãªã㣠{ #filter-data-security }
-è¿ãã¹ã以äžã®ããŒã¿ãè¿ããªãããã«ããã«ã¯ã[ãã¥ãŒããªã¢ã« - ã¬ã¹ãã³ã¹ã¢ãã« - æ»ãå€ã®å](../tutorial/response-model.md){.internal-link target=_blank} ãåç
§ããŠãã ããã
+è¿ãã¹ã以äžã®ããŒã¿ãè¿ããªãããã«ããã«ã¯ã[ãã¥ãŒããªã¢ã« - ã¬ã¹ãã³ã¹ã¢ãã« - æ»ãå€ã®å](../tutorial/response-model.md) ãåç
§ããŠãã ããã
+
+## ã¬ã¹ãã³ã¹æ§èœã®æé©å - ã¬ã¹ãã³ã¹ã¢ãã« - æ»ãå€ã®å { #optimize-response-performance-response-model-return-type }
+
+JSON ããŒã¿ãè¿ãéã®æ§èœãæé©åããã«ã¯ãæ»ãå€ã®åãŸãã¯ã¬ã¹ãã³ã¹ã¢ãã«ã䜿çšããŠãã ãããããããããšã§ãPydantic ã Python ãçµç±ããã« Rust åŽã§ JSON ãžã®ã·ãªã¢ã©ã€ãºãåŠçããŸãã詳现㯠[ãã¥ãŒããªã¢ã« - ã¬ã¹ãã³ã¹ã¢ãã« - æ»ãå€ã®å](../tutorial/response-model.md) ãåç
§ããŠãã ããã
## ããã¥ã¡ã³ãã®ã¿ã° - OpenAPI { #documentation-tags-openapi }
-*path operations* ã«ã¿ã°ã远å ããããã¥ã¡ã³ã UI ã§ã°ã«ãŒãåããã«ã¯ã[ãã¥ãŒããªã¢ã« - path operation ã®èšå® - ã¿ã°](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank} ãåç
§ããŠãã ããã
+*path operations* ã«ã¿ã°ã远å ããããã¥ã¡ã³ã UI ã§ã°ã«ãŒãåããã«ã¯ã[ãã¥ãŒããªã¢ã« - path operation ã®èšå® - ã¿ã°](../tutorial/path-operation-configuration.md#tags) ãåç
§ããŠãã ããã
## ããã¥ã¡ã³ãã®æŠèŠãšèª¬æ - OpenAPI { #documentation-summary-and-description-openapi }
-*path operations* ã«æŠèŠãšèª¬æã远å ããããã¥ã¡ã³ã UI ã«è¡šç€ºããã«ã¯ã[ãã¥ãŒããªã¢ã« - path operation ã®èšå® - æŠèŠãšèª¬æ](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank} ãåç
§ããŠãã ããã
+*path operations* ã«æŠèŠãšèª¬æã远å ããããã¥ã¡ã³ã UI ã«è¡šç€ºããã«ã¯ã[ãã¥ãŒããªã¢ã« - path operation ã®èšå® - æŠèŠãšèª¬æ](../tutorial/path-operation-configuration.md#summary-and-description) ãåç
§ããŠãã ããã
## ããã¥ã¡ã³ãã®ã¬ã¹ãã³ã¹èª¬æ - OpenAPI { #documentation-response-description-openapi }
-ããã¥ã¡ã³ã UI ã«è¡šç€ºãããã¬ã¹ãã³ã¹ã®èª¬æãå®çŸ©ããã«ã¯ã[ãã¥ãŒããªã¢ã« - path operation ã®èšå® - ã¬ã¹ãã³ã¹ã®èª¬æ](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank} ãåç
§ããŠãã ããã
+ããã¥ã¡ã³ã UI ã«è¡šç€ºãããã¬ã¹ãã³ã¹ã®èª¬æãå®çŸ©ããã«ã¯ã[ãã¥ãŒããªã¢ã« - path operation ã®èšå® - ã¬ã¹ãã³ã¹ã®èª¬æ](../tutorial/path-operation-configuration.md#response-description) ãåç
§ããŠãã ããã
## *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} ãåç
§ããŠãã ããã
+*path operation* ãéæšå¥šã«ããããã¥ã¡ã³ã UI ã«è¡šç€ºããã«ã¯ã[ãã¥ãŒããªã¢ã« - path operation ã®èšå® - éæšå¥š](../tutorial/path-operation-configuration.md#deprecate-a-path-operation) ãåç
§ããŠãã ããã
## ä»»æã®ããŒã¿ã JSON äºæã«å€æ { #convert-any-data-to-json-compatible }
-ä»»æã®ããŒã¿ã JSON äºæã«å€æããã«ã¯ã[ãã¥ãŒããªã¢ã« - JSON äºæãšã³ã³ãŒã](../tutorial/encoder.md){.internal-link target=_blank} ãåç
§ããŠãã ããã
+ä»»æã®ããŒã¿ã JSON äºæã«å€æããã«ã¯ã[ãã¥ãŒããªã¢ã« - JSON äºæãšã³ã³ãŒã](../tutorial/encoder.md) ãåç
§ããŠãã ããã
## OpenAPI ã¡ã¿ããŒã¿ - ããã¥ã¡ã³ã { #openapi-metadata-docs }
-ã©ã€ã»ã³ã¹ãããŒãžã§ã³ãé£çµ¡å
ãªã©ãå«ãã¡ã¿ããŒã¿ã OpenAPI ã¹ããŒãã«è¿œå ããã«ã¯ã[ãã¥ãŒããªã¢ã« - ã¡ã¿ããŒã¿ãšããã¥ã¡ã³ãã® URL](../tutorial/metadata.md){.internal-link target=_blank} ãåç
§ããŠãã ããã
+ã©ã€ã»ã³ã¹ãããŒãžã§ã³ãé£çµ¡å
ãªã©ãå«ãã¡ã¿ããŒã¿ã OpenAPI ã¹ããŒãã«è¿œå ããã«ã¯ã[ãã¥ãŒããªã¢ã« - ã¡ã¿ããŒã¿ãšããã¥ã¡ã³ãã® URL](../tutorial/metadata.md) ãåç
§ããŠãã ããã
## OpenAPI ã®ã«ã¹ã¿ã URL { #openapi-custom-url }
-OpenAPI ã® URL ãã«ã¹ã¿ãã€ãºïŒãŸãã¯åé€ïŒããã«ã¯ã[ãã¥ãŒããªã¢ã« - ã¡ã¿ããŒã¿ãšããã¥ã¡ã³ãã® URL](../tutorial/metadata.md#openapi-url){.internal-link target=_blank} ãåç
§ããŠãã ããã
+OpenAPI ã® URL ãã«ã¹ã¿ãã€ãºïŒãŸãã¯åé€ïŒããã«ã¯ã[ãã¥ãŒããªã¢ã« - ã¡ã¿ããŒã¿ãšããã¥ã¡ã³ãã® URL](../tutorial/metadata.md#openapi-url) ãåç
§ããŠãã ããã
## OpenAPI ããã¥ã¡ã³ãã® URL { #openapi-docs-urls }
-èªåçæãããããã¥ã¡ã³ã UI ã䜿çšãã URL ã倿Žããã«ã¯ã[ãã¥ãŒããªã¢ã« - ã¡ã¿ããŒã¿ãšããã¥ã¡ã³ãã® URL](../tutorial/metadata.md#docs-urls){.internal-link target=_blank} ãåç
§ããŠãã ããã
+èªåçæãããããã¥ã¡ã³ã UI ã䜿çšãã URL ã倿Žããã«ã¯ã[ãã¥ãŒããªã¢ã« - ã¡ã¿ããŒã¿ãšããã¥ã¡ã³ãã® URL](../tutorial/metadata.md#docs-urls) ãåç
§ããŠãã ããã
**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](https://strawberry.rocks/) ð
+ * [FastAPI åãããã¥ã¡ã³ã](https://strawberry.rocks/docs/integrations/fastapi)ãã
+* [Ariadne](https://ariadnegraphql.org/)
+ * [FastAPI åãããã¥ã¡ã³ã](https://ariadnegraphql.org/docs/fastapi-integration)ãã
+* [Tartiflette](https://tartiflette.io/)
+ * ASGI 飿ºçšã® [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) ãã
+* [Graphene](https://graphene-python.org/)
+ * [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3) ãã
## Strawberry ã§ GraphQL { #graphql-with-strawberry }
-**GraphQL** ãå¿
èŠããŸãã¯å©çšãããå Žåã¯ã<a href="https://strawberry.rocks/" class="external-link" target="_blank">**Strawberry**</a> ã**æšå¥š**ããŸãã**FastAPI** ã®èšèšã«æãè¿ãããã¹ãŠã**åã¢ãããŒã·ã§ã³**ã«åºã¥ããŠããŸãã
+**GraphQL** ãå¿
èŠããŸãã¯å©çšãããå Žåã¯ã[**Strawberry**](https://strawberry.rocks/) ã**æšå¥š**ããŸãã**FastAPI** ã®èšèšã«æãè¿ãããã¹ãŠã**åã¢ãããŒã·ã§ã³**ã«åºã¥ããŠããŸãã
ãŠãŒã¹ã±ãŒã¹ã«ãã£ãŠã¯ä»ã®ã©ã€ãã©ãªãéžã¶æ¹ãããå ŽåããããŸãããç§ã«å°ããããã°ããããã **Strawberry** ã詊ãããšãå§ããã§ãããã
{* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *}
-詳现㯠<a href="https://strawberry.rocks/" class="external-link" target="_blank">Strawberry ã®ããã¥ã¡ã³ã</a>ãã芧ãã ããã
+詳现㯠[Strawberry ã®ããã¥ã¡ã³ã](https://strawberry.rocks/)ãã芧ãã ããã
-ãŸãã<a href="https://strawberry.rocks/docs/integrations/fastapi" class="external-link" target="_blank">Strawberry ãš FastAPI</a> ã®é£æºã«é¢ããããã¥ã¡ã³ãããããŸãã
+ãŸãã[Strawberry ãš FastAPI](https://strawberry.rocks/docs/integrations/fastapi) ã®é£æºã«é¢ããããã¥ã¡ã³ãããããŸãã
## Starlette ã®æ§ `GraphQLApp` { #older-graphqlapp-from-starlette }
-以åã® Starlette ã«ã¯ã<a href="https://graphene-python.org/" class="external-link" target="_blank">Graphene</a> ãšçµ±åããããã® `GraphQLApp` ã¯ã©ã¹ãå«ãŸããŠããŸããã
+以åã® Starlette ã«ã¯ã[Graphene](https://graphene-python.org/) ãšçµ±åããããã® `GraphQLApp` ã¯ã©ã¹ãå«ãŸããŠããŸããã
-ãã㯠Starlette ããã¯éæšå¥šã«ãªããŸããããããããã䜿çšããŠããã³ãŒããããå Žåã¯ãåããŠãŒã¹ã±ãŒã¹ãã«ããŒãã**ã»ãŒåäžã®ã€ã³ã¿ãŒãã§ãŒã¹**ãæã€ <a href="https://github.com/ciscorn/starlette-graphene3" class="external-link" target="_blank">starlette-graphene3</a> ãžå®¹æã«**ç§»è¡**ã§ããŸãã
+ãã㯠Starlette ããã¯éæšå¥šã«ãªããŸããããããããã䜿çšããŠããã³ãŒããããå Žåã¯ãåããŠãŒã¹ã±ãŒã¹ãã«ããŒãã**ã»ãŒåäžã®ã€ã³ã¿ãŒãã§ãŒã¹**ãæã€ [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3) ãžå®¹æã«**ç§»è¡**ã§ããŸãã
/// tip | è±ç¥è
-GraphQL ãå¿
èŠã§ããã°ãäŸç¶ãšã㊠<a href="https://strawberry.rocks/" class="external-link" target="_blank">Strawberry</a> ã®å©çšãæšå¥šããŸããç¬èªã®ã¯ã©ã¹ãåã§ã¯ãªããåã¢ãããŒã·ã§ã³ã«åºã¥ããŠããããã§ãã
+GraphQL ãå¿
èŠã§ããã°ãäŸç¶ãšã㊠[Strawberry](https://strawberry.rocks/) ã®å©çšãæšå¥šããŸããç¬èªã®ã¯ã©ã¹ãåã§ã¯ãªããåã¢ãããŒã·ã§ã³ã«åºã¥ããŠããããã§ãã
///
## ããã«åŠã¶ { #learn-more }
-**GraphQL** ã«ã€ããŠã¯ã<a href="https://graphql.org/" class="external-link" target="_blank">å
¬åŒ GraphQL ããã¥ã¡ã³ã</a>ã§ããã«åŠã¹ãŸãã
+**GraphQL** ã«ã€ããŠã¯ã[å
¬åŒ GraphQL ããã¥ã¡ã³ã](https://graphql.org/)ã§ããã«åŠã¹ãŸãã
äžèšã®åã©ã€ãã©ãªã«ã€ããŠã¯ããªã³ã¯å
ã®ããã¥ã¡ã³ãããåç
§ãã ããã
/// tip | è±ç¥è
-**FastAPI ãåŠã¶**ããšãäœç³»çã«é²ãããå ŽåïŒæšå¥šïŒã代ããã« [ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã](../tutorial/index.md){.internal-link target=_blank} ãç« ããšã«èªãã§ãã ããã
+**FastAPI ãåŠã¶**ããšãäœç³»çã«é²ãããå ŽåïŒæšå¥šïŒã代ããã« [ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã](../tutorial/index.md) ãç« ããšã«èªãã§ãã ããã
///
## å
Œ΋‹ۋ { #official-guide }
-Pydantic ã«ã¯ v1 ãã v2 ãžã®å
¬åŒã® <a href="https://docs.pydantic.dev/latest/migration/" class="external-link" target="_blank">ç§»è¡ã¬ã€ã</a> ããããŸãã
+Pydantic ã«ã¯ v1 ãã v2 ãžã®å
¬åŒã® [ç§»è¡ã¬ã€ã](https://docs.pydantic.dev/latest/migration/) ããããŸãã
倿Žç¹ãæ€èšŒãããæ£ç¢ºã§å³å¯ã«ãªã£ãç¹ã泚æäºé
ãªã©ãå«ãŸããŸãã
## ãã¹ã { #tests }
-ã¢ããªã«å¯Ÿãã[ãã¹ã](../tutorial/testing.md){.internal-link target=_blank}ãçšæããç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒCIïŒã§å®è¡ããããã«ããŠãã ããã
+ã¢ããªã«å¯Ÿãã[ãã¹ã](../tutorial/testing.md)ãçšæããç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒCIïŒã§å®è¡ããããã«ããŠãã ããã
ããã«ãããã¢ããã°ã¬ãŒãåŸãæåŸ
ã©ããåäœããŠããããšã確èªã§ããŸãã
å€ãã®å Žåãã«ã¹ã¿ãã€ãºã®ãªãéåžžã® Pydantic ã¢ãã«ã䜿ã£ãŠããã°ãv1 ãã v2 ãžã®ç§»è¡äœæ¥ã®å€§åãèªååã§ããŸãã
-åã Pydantic ããŒã ãæäŸãã <a href="https://github.com/pydantic/bump-pydantic" class="external-link" target="_blank">`bump-pydantic`</a> ã䜿çšã§ããŸãã
+åã Pydantic ããŒã ãæäŸãã [`bump-pydantic`](https://github.com/pydantic/bump-pydantic) ã䜿çšã§ããŸãã
ãã®ããŒã«ã¯å¿
èŠãªã³ãŒã倿Žã®ã»ãšãã©ãèªåã§è¡ããŸãã
style V2Field fill:#f9fff3
```
-...but, you can have separated models using Pydantic v1 and v2 in the same app.
+...ããããåãã¢ããªå
ã§ Pydantic v1 ãš v2 ãå¥ã
ã®ã¢ãã«ãšããŠåããŠäœ¿ãããšã¯å¯èœã§ãã
```mermaid
graph TB
# ããŒã¿ããŒã¹ã®ãã¹ã { #testing-a-database }
-ããŒã¿ããŒã¹ãSQLãSQLModel ã«ã€ããŠã¯ã<a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel ããã¥ã¡ã³ã</a>ã§åŠã¹ãŸããð€
+ããŒã¿ããŒã¹ãSQLãSQLModel ã«ã€ããŠã¯ã[SQLModel ããã¥ã¡ã³ã](https://sqlmodel.tiangolo.com/)ã§åŠã¹ãŸããð€
-FastAPI ãšäžç·ã« SQLModel ã䜿ãããã®ãã <a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/" class="external-link" target="_blank">ãã¥ãŒããªã¢ã«</a>ããããŸããâš
+FastAPI ãšäžç·ã« SQLModel ã䜿ãããã®ãã [ãã¥ãŒããªã¢ã«](https://sqlmodel.tiangolo.com/tutorial/fastapi/)ããããŸããâš
-ãã®ãã¥ãŒããªã¢ã«ã«ã¯ã<a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/" class="external-link" target="_blank">SQL ããŒã¿ããŒã¹ã®ãã¹ã</a>ã«é¢ããã»ã¯ã·ã§ã³ãå«ãŸããŠããŸããð
+ãã®ãã¥ãŒããªã¢ã«ã«ã¯ã[SQL ããŒã¿ããŒã¹ã®ãã¹ã](https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/)ã«é¢ããã»ã¯ã·ã§ã³ãå«ãŸããŠããŸããð
<em>FastAPI ãã¬ãŒã ã¯ãŒã¯ãé«ããã©ãŒãã³ã¹ãåŠã³ããããçŽ æ©ãã³ãŒãã£ã³ã°ã§ãããæ¬çªéçšã«å¯Ÿå¿</em>
</p>
<p align="center">
-<a href="https://github.com/fastapi/fastapi/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster" target="_blank">
+<a href="https://github.com/fastapi/fastapi/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster">
<img src="https://github.com/fastapi/fastapi/actions/workflows/test.yml/badge.svg?event=push&branch=master" alt="Test">
</a>
-<a href="https://coverage-badge.samuelcolvin.workers.dev/redirect/fastapi/fastapi" target="_blank">
+<a href="https://coverage-badge.samuelcolvin.workers.dev/redirect/fastapi/fastapi">
<img src="https://coverage-badge.samuelcolvin.workers.dev/fastapi/fastapi.svg" alt="Coverage">
</a>
-<a href="https://pypi.org/project/fastapi" target="_blank">
+<a href="https://pypi.org/project/fastapi">
<img src="https://img.shields.io/pypi/v/fastapi?color=%2334D058&label=pypi%20package" alt="Package version">
</a>
-<a href="https://pypi.org/project/fastapi" target="_blank">
+<a href="https://pypi.org/project/fastapi">
<img src="https://img.shields.io/pypi/pyversions/fastapi.svg?color=%2334D058" alt="Supported Python versions">
</a>
</p>
---
-**ããã¥ã¡ã³ã**: <a href="https://fastapi.tiangolo.com/ja" target="_blank">https://fastapi.tiangolo.com</a>
+**ããã¥ã¡ã³ã**: [https://fastapi.tiangolo.com/ja](https://fastapi.tiangolo.com/ja)
-**ãœãŒã¹ã³ãŒã**: <a href="https://github.com/fastapi/fastapi" target="_blank">https://github.com/fastapi/fastapi</a>
+**ãœãŒã¹ã³ãŒã**: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi)
---
* **ç°¡å**: ç°¡åã«å©çšã»ç¿åŸã§ããããã«ãã¶ã€ã³ãããŠããŸããããã¥ã¡ã³ããèªãæéãåæžããŸãã
* **çã**: ã³ãŒãã®éè€ãæå°éã«ããŸããåãã©ã¡ãŒã¿å®£èšããè€æ°ã®æ©èœãåŸãããŸãããã°ãæžããŸãã
* **å
ç¢æ§**: èªå察話åããã¥ã¡ã³ãã«ãããæ¬çªç°å¢åãã®ã³ãŒããåŸãããŸãã
-* **Standards-based**: API ã®ãªãŒãã³ã¹ã¿ã³ããŒãã«åºã¥ããŠããïŒãããŠå®å
šã«äºææ§ããããŸãïŒã<a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a>ïŒä»¥å㯠Swagger ãšããŠç¥ãããŠããŸããïŒã <a href="https://json-schema.org/" class="external-link" target="_blank">JSON Schema</a> ããµããŒãããŸãã
+* **Standards-based**: API ã®ãªãŒãã³ã¹ã¿ã³ããŒãã«åºã¥ããŠããïŒãããŠå®å
šã«äºææ§ããããŸãïŒã[OpenAPI](https://github.com/OAI/OpenAPI-Specification)ïŒä»¥å㯠Swagger ãšããŠç¥ãããŠããŸããïŒã [JSON Schema](https://json-schema.org/) ããµããŒãããŸãã
<small>* æ¬çªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠãã瀟å
éçºããŒã ã®ãã¹ãã«åºã¥ãèŠç©ããã§ãã</small>
### Keystone Sponsor { #keystone-sponsor }
{% for sponsor in sponsors.keystone -%}
-<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
+<a href="{{ sponsor.url }}" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
{% endfor -%}
### Gold and Silver Sponsors { #gold-and-silver-sponsors }
{% for sponsor in sponsors.gold -%}
-<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
+<a href="{{ sponsor.url }}" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
{% endfor -%}
{%- for sponsor in sponsors.silver -%}
-<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
+<a href="{{ sponsor.url }}" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
{% endfor %}
<!-- /sponsors -->
-<a href="https://fastapi.tiangolo.com/ja/fastapi-people/#sponsors" class="external-link" target="_blank">ãã®ä»ã®ã¹ãã³ãµãŒ</a>
+[ãã®ä»ã®ã¹ãã³ãµãŒ](https://fastapi.tiangolo.com/ja/fastapi-people/#sponsors)
## è©äŸ¡ { #opinions }
"_[...] æè¿ **FastAPI** ã䜿ã£ãŠããŸãã [...] å®éã«ç§ã®ããŒã ã®å
šãŠã® **Microsoft ã®æ©æ¢°åŠç¿ãµãŒãã¹** ã§äœ¿çšããäºå®ã§ãã ãã®ãã¡ã®ããã€ãã®ã³ã¢ãª **Windows** 補åãš **Office** 補åã«çµ±åããã€ã€ãããŸãã_"
-<div style="text-align: right; margin-right: 10%;">Kabir Khan - <strong>Microsoft</strong> <a href="https://github.com/fastapi/fastapi/pull/26" target="_blank"><small>(ref)</small></a></div>
+<div style="text-align: right; margin-right: 10%;">Kabir Khan - <strong>Microsoft</strong> <a href="https://github.com/fastapi/fastapi/pull/26"><small>(ref)</small></a></div>
---
"_FastAPIã©ã€ãã©ãªãæ¡çšããã¯ãšãªã§ **äºæž¬å€** ãååŸã§ãã **REST** ãµãŒããæ§ç¯ããŸããã [for Ludwig]_"
-<div style="text-align: right; margin-right: 10%;">Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - <strong>Uber</strong> <a href="https://eng.uber.com/ludwig-v0-2/" target="_blank"><small>(ref)</small></a></div>
+<div style="text-align: right; margin-right: 10%;">Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - <strong>Uber</strong> <a href="https://eng.uber.com/ludwig-v0-2/"><small>(ref)</small></a></div>
---
"_**Netflix** ã¯ã**屿©ç®¡ç**ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ã**Dispatch** ã®ãªãŒãã³ãœãŒã¹ãªãªãŒã¹ãçºè¡šã§ããããšãããããæããŸãã [built with **FastAPI**]_"
-<div style="text-align: right; margin-right: 10%;">Kevin Glisson, Marc Vilanova, Forest Monsen - <strong>Netflix</strong> <a href="https://netflixtechblog.com/introducing-dispatch-da4b8a2a8072" target="_blank"><small>(ref)</small></a></div>
+<div style="text-align: right; margin-right: 10%;">Kevin Glisson, Marc Vilanova, Forest Monsen - <strong>Netflix</strong> <a href="https://netflixtechblog.com/introducing-dispatch-da4b8a2a8072"><small>(ref)</small></a></div>
---
"_ç§ã¯ **FastAPI** ã«ã¯ã¯ã¯ã¯ããŠããŸãã ãã¡ããã¡ã楜ããã§ãïŒ_"
-<div style="text-align: right; margin-right: 10%;">Brian Okken - <strong><a href="https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855" target="_blank">Python Bytes</a> podcast host</strong> <a href="https://x.com/brianokken/status/1112220079972728832" target="_blank"><small>(ref)</small></a></div>
+<div style="text-align: right; margin-right: 10%;">Brian Okken - <strong>[Python Bytes](https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855) podcast host</strong> <a href="https://x.com/brianokken/status/1112220079972728832"><small>(ref)</small></a></div>
---
"_æ£çŽãããªããäœã£ããã®ã¯è¶
å
å®ã§æŽç·ŽãããŠããããã«èŠããŸããããããªæå³ã§ãããã¯ç§ã **Hug** ã«ãããªã£ãŠã»ããã£ããã®ã§ãã誰ãããããäœãã®ãèŠãã®ã¯æ¬åœã«åºæ¿çã§ãã_"
-<div style="text-align: right; margin-right: 10%;">Timothy Crosley - <strong><a href="https://github.com/hugapi/hug" target="_blank">Hug</a> creator</strong> <a href="https://news.ycombinator.com/item?id=19455465" target="_blank"><small>(ref)</small></a></div>
+<div style="text-align: right; margin-right: 10%;">Timothy Crosley - <strong>[Hug](https://github.com/hugapi/hug) creator</strong> <a href="https://news.ycombinator.com/item?id=19455465"><small>(ref)</small></a></div>
---
"_ç§ãã¡ã® **API** 㯠**FastAPI** ã«åãæ¿ããŸãã [...] ãã£ãšæ°ã«å
¥ããšæããŸã [...]_"
-<div style="text-align: right; margin-right: 10%;">Ines Montani - Matthew Honnibal - <strong><a href="https://explosion.ai" target="_blank">Explosion AI</a> founders - <a href="https://spacy.io" target="_blank">spaCy</a> creators</strong> <a href="https://x.com/_inesmontani/status/1144173225322143744" target="_blank"><small>(ref)</small></a> - <a href="https://x.com/honnibal/status/1144031421859655680" target="_blank"><small>(ref)</small></a></div>
+<div style="text-align: right; margin-right: 10%;">Ines Montani - Matthew Honnibal - <strong>[Explosion AI](https://explosion.ai) founders - [spaCy](https://spacy.io) creators</strong> <a href="https://x.com/_inesmontani/status/1144173225322143744"><small>(ref)</small></a> - <a href="https://x.com/honnibal/status/1144031421859655680"><small>(ref)</small></a></div>
---
"_æ¬çªéçšã® Python API ãæ§ç¯ãããæ¹ã«ã¯ã**FastAPI** ã匷ãããããããŸãã**çŸããèšèš**ãããŠããã**䜿ãããã**ã**é«ãã¹ã±ãŒã©ããªãã£**ããããŸããç§ãã¡ã® API ãã¡ãŒã¹ãéçºæŠç¥ã® **äž»èŠã³ã³ããŒãã³ã** ãšãªããVirtual TAC Engineer ãªã©ã®å€ãã®èªååããµãŒãã¹ãæšé²ããŠããŸãã_"
-<div style="text-align: right; margin-right: 10%;">Deon Pillsbury - <strong>Cisco</strong> <a href="https://www.linkedin.com/posts/deonpillsbury_cisco-cx-python-activity-6963242628536487936-trAp/" target="_blank"><small>(ref)</small></a></div>
+<div style="text-align: right; margin-right: 10%;">Deon Pillsbury - <strong>Cisco</strong> <a href="https://www.linkedin.com/posts/deonpillsbury_cisco-cx-python-activity-6963242628536487936-trAp/"><small>(ref)</small></a></div>
---
## FastAPI ããããã¥ã¡ã³ã¿ãªãŒ { #fastapi-mini-documentary }
-2025 幎æ«ã«å
¬éããã <a href="https://www.youtube.com/watch?v=mpR8ngthqiE" class="external-link" target="_blank">FastAPI ããããã¥ã¡ã³ã¿ãªãŒ</a>ããããŸãããªã³ã©ã€ã³ã§èŠèŽã§ããŸã:
+2025 幎æ«ã«å
¬éããã [FastAPI ããããã¥ã¡ã³ã¿ãªãŒ](https://www.youtube.com/watch?v=mpR8ngthqiE)ããããŸãããªã³ã©ã€ã³ã§èŠèŽã§ããŸã:
-<a href="https://www.youtube.com/watch?v=mpR8ngthqiE" target="_blank"><img src="https://fastapi.tiangolo.com/img/fastapi-documentary.jpg" alt="FastAPI Mini Documentary"></a>
+<a href="https://www.youtube.com/watch?v=mpR8ngthqiE"><img src="https://fastapi.tiangolo.com/img/fastapi-documentary.jpg" alt="FastAPI Mini Documentary"></a>
## **Typer**ãCLI ç FastAPI { #typer-the-fastapi-of-clis }
-<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>
+<a href="https://typer.tiangolo.com"><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> ã¢ããªãæ§ç¯ããå Žåã¯ã[**Typer**](https://typer.tiangolo.com/) ã確èªããŠãã ããã
**Typer** 㯠FastAPI ã®åŒåã§ãããããŠã**CLI ç FastAPI** ãæå³ããŠããŸãã âšïž ð
FastAPI ã¯å·šäººã®è©ã®äžã«ç«ã£ãŠããŸãã
-* Web ã®éšå㯠<a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a>
-* ããŒã¿ã®éšå㯠<a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>
+* [Starlette](https://www.starlette.dev/)ïŒWeb éšåïŒ
+* [Pydantic](https://docs.pydantic.dev/)ïŒããŒã¿éšåïŒ
## ã€ã³ã¹ããŒã« { #installation }
-<a href="https://fastapi.tiangolo.com/ja/virtual-environments/" class="external-link" target="_blank">virtual environment</a> ãäœæããŠæå¹åãããããã FastAPI ãã€ã³ã¹ããŒã«ããŸãã
+[ä»®æ³ç°å¢](https://fastapi.tiangolo.com/ja/virtual-environments/) ãäœæããŠæå¹åãããããã FastAPI ãã€ã³ã¹ããŒã«ããŸãã
<div class="termy">
**泚**:
-ããããªãå Žåã¯ã<a href="https://fastapi.tiangolo.com/ja/async/#in-a-hurry" target="_blank">ããã¥ã¡ã³ãã® `async` ãš `await` ã® _"In a hurry?"_ ã»ã¯ã·ã§ã³</a>ã確èªããŠãã ããã
+ããããªãå Žåã¯ã_ãIn a hurry?ã_ ã»ã¯ã·ã§ã³ã® [ããã¥ã¡ã³ãã® `async` ãš `await`](https://fastapi.tiangolo.com/ja/async/#in-a-hurry) ã確èªããŠãã ããã
</details>
<div class="termy">
```console
-$ fastapi dev main.py
+$ fastapi dev
âââââââââââ FastAPI CLI - Development mode ââââââââââââ®
â â
</div>
<details markdown="1">
-<summary><code>fastapi dev main.py</code> ã³ãã³ãã«ã€ããŠ</summary>
+<summary><code>fastapi dev</code> ã³ãã³ãã«ã€ããŠ</summary>
-`fastapi dev` ã\82³ã\83\9eã\83³ã\83\89ã\81¯ `main.py` ã\83\95ã\82¡ã\82ۋ\83«ã\82\92ÚªÂã\81¿å\8f\96ã\82\8aã\80\81ã\81\9dã\81®ÀžÂã\81® **FastAPI** ã\82¢ã\83\97ã\83ªã\82\92ʀ\9cÃ¥\87ºã\81\97ã\80\81<a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a> ã䜿çšããŠãµãŒããŒãèµ·åããŸãã
+`fastapi dev` ã\82³ã\83\9eã\83³ã\83\89ã\81¯ `main.py` ã\83\95ã\82¡ã\82ۋ\83«ã\82\92Ú\87ªå\8b\95ç\9a\84ã\81«ÚªÂã\81¿å\8f\96ã\82\8aã\80\81ã\81\9dã\81®ÀžÂã\81® **FastAPI** ã\82¢ã\83\97ã\83ªã\82\92ʀ\9cÃ¥\87ºã\81\97ã\80\81[Uvicorn](https://www.uvicorn.dev) ã䜿çšããŠãµãŒããŒãèµ·åããŸãã
ããã©ã«ãã§ã¯ã`fastapi dev` ã¯ããŒã«ã«éçºåãã«èªåãªããŒããæå¹ã«ããŠèµ·åããŸãã
-詳ãã㯠<a href="https://fastapi.tiangolo.com/ja/fastapi-cli/" target="_blank">FastAPI CLI docs</a> ãåç
§ããŠãã ããã
+詳ãã㯠[FastAPI CLI docs](https://fastapi.tiangolo.com/ja/fastapi-cli/) ãåç
§ããŠãã ããã
</details>
### åäœç¢ºèª { #check-it }
-ãã©ãŠã¶ã§ <a href="http://127.0.0.1:8000/items/5?q=somequery" class="external-link" target="_blank">http://127.0.0.1:8000/items/5?q=somequery</a> ãéããŸãã
+ãã©ãŠã¶ã§ [http://127.0.0.1:8000/items/5?q=somequery](http://127.0.0.1:8000/items/5?q=somequery) ãéããŸãã
以äžã® JSON ã®ã¬ã¹ãã³ã¹ã確èªã§ããŸãã
### èªå察話å API ããã¥ã¡ã³ã { #interactive-api-docs }
-次ã«ã<a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> ã«ã¢ã¯ã»ã¹ããŸãã
+次ã«ã[http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) ã«ã¢ã¯ã»ã¹ããŸãã
-èªå察話å API ããã¥ã¡ã³ãã衚瀺ãããŸãïŒ<a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a> ãæäŸããŠããŸãïŒã
+èªå察話å API ããã¥ã¡ã³ãã衚瀺ãããŸãïŒ[Swagger UI](https://github.com/swagger-api/swagger-ui) ãæäŸããŠããŸãïŒã

### ä»£æ¿ API ããã¥ã¡ã³ã { #alternative-api-docs }
-次ã«ã<a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a> ã«ã¢ã¯ã»ã¹ããŸãã
+次ã«ã[http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) ã«ã¢ã¯ã»ã¹ããŸãã
-代æ¿ã®èªåããã¥ã¡ã³ãã衚瀺ãããŸãïŒ<a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a> ãæäŸããŠããŸãïŒã
+代æ¿ã®èªåããã¥ã¡ã³ãã衚瀺ãããŸãïŒ[ReDoc](https://github.com/Rebilly/ReDoc) ãæäŸããŠããŸãïŒã

### èªå察話å API ããã¥ã¡ã³ãã®ã¢ããã°ã¬ãŒã { #interactive-api-docs-upgrade }
-次ã«ã<a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> ã«ã¢ã¯ã»ã¹ããŸãã
+次ã«ã[http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) ã«ã¢ã¯ã»ã¹ããŸãã
* èªå察話å API ããã¥ã¡ã³ãã¯æ°ããããã£ãå«ããŠèªåã§ã¢ããããŒããããŸãã
### ä»£æ¿ API ããã¥ã¡ã³ãã®ã¢ããã°ã¬ãŒã { #alternative-api-docs-upgrade }
-次ã«ã<a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a> ã«ã¢ã¯ã»ã¹ããŸãã
+次ã«ã[http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) ã«ã¢ã¯ã»ã¹ããŸãã
* 代æ¿ã®ããã¥ã¡ã³ãã«ãæ°ããã¯ãšãªãã©ã¡ãŒã¿ãããã£ãåæ ãããŸãã
* éåžžã«åŒ·åã§äœ¿ãããã **<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** çµ±åã
+* [Strawberry](https://strawberry.rocks) ããã³ä»ã®ã©ã€ãã©ãªã«ãã **GraphQL** çµ±åã
* 以äžã®ãããªããããã®ããŸãæ©èœïŒStarlette ã®ãããã§ãïŒ:
* **WebSockets**
* HTTPX ãš `pytest` ã«åºã¥ã極ããŠç°¡åãªãã¹ã
### ã¢ããªããããã€ïŒä»»æïŒ { #deploy-your-app-optional }
-å¿
èŠã«å¿ã㊠FastAPI ã¢ããªã <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a> ã«ãããã€ã§ããŸãããŸã ã®å Žåã¯ãŠã§ã€ãã£ã³ã°ãªã¹ãã«åå ããŠãã ããã ð
+å¿
èŠã«å¿ã㊠FastAPI ã¢ããªã [FastAPI Cloud](https://fastapicloud.com) ã«ãããã€ã§ããŸãããŸã ã®å Žåã¯ãŠã§ã€ãã£ã³ã°ãªã¹ãã«åå ããŠãã ããã ð
ãã§ã« **FastAPI Cloud** ã¢ã«ãŠã³ãïŒãŠã§ã€ãã£ã³ã°ãªã¹ãããæåŸ
ãããŸãã ðïŒãããå Žåã¯ã1 ã³ãã³ãã§ã¢ããªã±ãŒã·ã§ã³ããããã€ã§ããŸãã
-ãããã€åã«ããã°ã€ã³ããŠããããšã確èªããŠãã ããã
-
-<div class="termy">
-
-```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud ð
-```
-
-</div>
-
-次ã«ãã¢ããªããããã€ããŸãã
-
<div class="termy">
```console
#### FastAPI Cloud ã«ã€ã㊠{ #about-fastapi-cloud }
-**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** 㯠**FastAPI** ã®äœè
ãšåãããŒã ã«ãã£ãŠäœãããŠããŸãã
+**[FastAPI Cloud](https://fastapicloud.com)** 㯠**FastAPI** ã®äœè
ãšåãããŒã ã«ãã£ãŠäœãããŠããŸãã
æå°éã®åŽåã§ API ã **æ§ç¯**ã**ãããã€**ã**ã¢ã¯ã»ã¹** ããããã®ããã»ã¹ãå¹çåããŸãã
## ããã©ãŒãã³ã¹ { #performance }
-ç¬ç«ãã TechEmpower ã®ãã³ãããŒã¯ã§ã¯ãUvicorn ã§åäœãã **FastAPI** ã¢ããªã±ãŒã·ã§ã³ãã<a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">å©çšå¯èœãªæãé«é㪠Python ãã¬ãŒã ã¯ãŒã¯ã®äžã€</a>ã§ãããStarlette ãš UvicornïŒFastAPI ã§å
éšçã«äœ¿çšãããŠããŸãïŒã«ã®ã¿äžåã£ãŠãããšç€ºãããŠããŸããïŒ*ïŒ
+ç¬ç«ãã TechEmpower ã®ãã³ãããŒã¯ã§ã¯ãUvicorn ã§åäœãã **FastAPI** ã¢ããªã±ãŒã·ã§ã³ãã[å©çšå¯èœãªæãé«é㪠Python ãã¬ãŒã ã¯ãŒã¯ã®äžã€](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7)ã§ãããStarlette ãš UvicornïŒFastAPI ã§å
éšçã«äœ¿çšãããŠããŸãïŒã«ã®ã¿äžåã£ãŠãããšç€ºãããŠããŸããïŒ*ïŒ
-詳现㯠<a href="https://fastapi.tiangolo.com/ja/benchmarks/" class="internal-link" target="_blank">Benchmarks</a> ã»ã¯ã·ã§ã³ãã芧ãã ããã
+詳现㯠[Benchmarks](https://fastapi.tiangolo.com/ja/benchmarks/) ã»ã¯ã·ã§ã³ãã芧ãã ããã
## äŸåé¢ä¿ { #dependencies }
Pydantic ã«ãã£ãŠäœ¿çšããããã®:
-* <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email-validator</code></a> - ã¡ãŒã«æ€èšŒã®ããã
+* [`email-validator`](https://github.com/JoshData/python-email-validator) - ã¡ãŒã«æ€èšŒã®ããã
Starlette ã«ãã£ãŠäœ¿çšããããã®:
-* <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()` ãšãšãã«ããã©ãŒã ã® <dfn title="HTTP ãªã¯ãšã¹ãããå±ãæååã Python ããŒã¿ã«å€æããããš">ãparsingã</dfn> ããµããŒããããå Žåã«å¿
èŠã§ãã
+* [`httpx`](https://www.python-httpx.org) - `TestClient` ã䜿çšãããå Žåã«å¿
èŠã§ãã
+* [`jinja2`](https://jinja.palletsprojects.com) - ããã©ã«ãã®ãã³ãã¬ãŒãèšå®ã䜿çšãããå Žåã«å¿
èŠã§ãã
+* [`python-multipart`](https://github.com/Kludex/python-multipart) - `request.form()` ãšãšãã«ããã©ãŒã ã® <dfn title="HTTP ãªã¯ãšã¹ãããå±ãæååã Python ããŒã¿ã«å€æããããš">ãparsingã</dfn> ããµããŒããããå Žåã«å¿
èŠã§ãã
FastAPI ã«ãã£ãŠäœ¿çšããããã®:
-* <a href="https://www.uvicorn.dev" target="_blank"><code>uvicorn</code></a> - ã¢ããªã±ãŒã·ã§ã³ãããŒãããŠæäŸãããµãŒããŒã®ãããããã«ã¯ `uvicorn[standard]` ãå«ãŸãã髿§èœãªãµãŒãã³ã°ã«å¿
èŠãªäŸåé¢ä¿ïŒäŸ: `uvloop`ïŒãå«ãŸããŸãã
+* [`uvicorn`](https://www.uvicorn.dev) - ã¢ããªã±ãŒã·ã§ã³ãããŒãããŠæäŸãããµãŒããŒã®ãããããã«ã¯ `uvicorn[standard]` ãå«ãŸãã髿§èœãªãµãŒãã³ã°ã«å¿
èŠãªäŸåé¢ä¿ïŒäŸ: `uvloop`ïŒãå«ãŸããŸãã
* `fastapi-cli[standard]` - `fastapi` ã³ãã³ããæäŸããŸãã
- * ããã«ã¯ `fastapi-cloud-cli` ãå«ãŸããFastAPI ã¢ããªã±ãŒã·ã§ã³ã <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a> ã«ãããã€ã§ããŸãã
+ * ããã«ã¯ `fastapi-cloud-cli` ãå«ãŸããFastAPI ã¢ããªã±ãŒã·ã§ã³ã [FastAPI Cloud](https://fastapicloud.com) ã«ãããã€ã§ããŸãã
### `standard` äŸåé¢ä¿ãªã { #without-standard-dependencies }
远å ã®ãªãã·ã§ã³ Pydantic äŸåé¢ä¿:
-* <a href="https://docs.pydantic.dev/latest/usage/pydantic_settings/" target="_blank"><code>pydantic-settings</code></a> - èšå®ç®¡çã®ããã
-* <a href="https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/" target="_blank"><code>pydantic-extra-types</code></a> - Pydantic ã§äœ¿çšãã远å ã®åã®ããã
+* [`pydantic-settings`](https://docs.pydantic.dev/latest/usage/pydantic_settings/) - èšå®ç®¡çã®ããã
+* [`pydantic-extra-types`](https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/) - Pydantic ã§äœ¿çšãã远å ã®åã®ããã
远å ã®ãªãã·ã§ã³ FastAPI äŸåé¢ä¿:
-* <a href="https://github.com/ijl/orjson" target="_blank"><code>orjson</code></a> - `ORJSONResponse` ã䜿çšãããå Žåã«å¿
èŠã§ãã
-* <a href="https://github.com/esnme/ultrajson" target="_blank"><code>ujson</code></a> - `UJSONResponse` ã䜿çšãããå Žåã«å¿
èŠã§ãã
+* [`orjson`](https://github.com/ijl/orjson) - `ORJSONResponse` ã䜿çšãããå Žåã«å¿
èŠã§ãã
+* [`ujson`](https://github.com/esnme/ultrajson) - `UJSONResponse` ã䜿çšãããå Žåã«å¿
èŠã§ãã
## ã©ã€ã»ã³ã¹ { #license }
ãã®ãã³ãã¬ãŒãã䜿ã£ãŠéå§ã§ããŸããåæã»ããã¢ãããã»ãã¥ãªãã£ãããŒã¿ããŒã¹ãããã€ãã®APIãšã³ããã€ã³ãããã§ã«çšæãããŠããŸãã
-GitHubãªããžããª: <a href="https://github.com/tiangolo/full-stack-fastapi-template" class="external-link" target="_blank">Full Stack FastAPI Template</a>
+GitHubãªããžããª: [Full Stack FastAPI Template](https://github.com/tiangolo/full-stack-fastapi-template)
## Full Stack FastAPI ãã³ãã¬ãŒã - æè¡ã¹ã¿ãã¯ãšæ©èœ { #full-stack-fastapi-template-technology-stack-and-features }
{!> ../../docs_src/python_types/tutorial008b_py310.py!}
```
-ãã㯠`item` ã `int` ãŸã㯠`str` ã«ãªãåŸãããšãæå³ããŸã.
+ãã㯠`item` ã `int` ãŸã㯠`str` ã«ãªãåŸãããšãæå³ããŸãã
#### `None` ã®å¯èœæ§ { #possibly-none }
## Pydantic ã®ã¢ãã« { #pydantic-models }
-<a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> ã¯ããŒã¿æ€èšŒãè¡ãããã® Python ã©ã€ãã©ãªã§ãã
+[Pydantic](https://docs.pydantic.dev/) ã¯ããŒã¿æ€èšŒãè¡ãããã® Python ã©ã€ãã©ãªã§ãã
ããŒã¿ã®ã圢ãã屿§ä»ãã®ã¯ã©ã¹ãšããŠå®£èšããŸãã
/// info | æ
å ±
-<a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic ã®è©³çްã¯ããã¥ã¡ã³ããåç
§ããŠãã ãã</a>ã
+[ Pydantic ã®è©³çްã¯ããã¥ã¡ã³ããåç
§ããŠãã ãã](https://docs.pydantic.dev/)ã
///
**FastAPI** ã¯ãã¹ãŠ Pydantic ãããŒã¹ã«ããŠããŸãã
-ãã¹ãŠã®ããšã¯ [ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã](tutorial/index.md){.internal-link target=_blank} ã§å®éã«èŠãããšãã§ããŸãã
+ãã¹ãŠã®ããšã¯ [ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã](tutorial/index.md) ã§å®éã«èŠãããšãã§ããŸãã
## ã¡ã¿ããŒã¿ã¢ãããŒã·ã§ã³ä»ãåãã³ã { #type-hints-with-metadata-annotations }
* OpenAPI ã䜿çšã㊠API ã **ããã¥ã¡ã³ãå** ããŸã:
* ããã¯èªåã®å¯Ÿè©±åããã¥ã¡ã³ãã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã§äœ¿ãããŸãã
-ãã¹ãŠãæœè±¡çã«èããããããããŸãããå¿é
ããªãã§ãã ããã ãã®å
šãŠã®åäœã¯ [ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã](tutorial/index.md){.internal-link target=_blank} ã§èŠãããšãã§ããŸãã
+ãã¹ãŠãæœè±¡çã«èããããããããŸãããå¿é
ããªãã§ãã ããã ãã®å
šãŠã®åäœã¯ [ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã](tutorial/index.md) ã§èŠãããšãã§ããŸãã
éèŠãªã®ã¯ãPython ã®æšæºçãªåã䜿ãããšã§ãïŒã¯ã©ã¹ããã³ã¬ãŒã¿ãªã©ã远å ããã®ã§ã¯ãªãïŒ1 ã€ã®å Žæã§ **FastAPI** ãå€ãã®äœæ¥ã代ããã«ãã£ãŠãããŠãããšããããšã§ãã
/// info | æ
å ±
-ãã§ã«ãã¹ãŠã®ãã¥ãŒããªã¢ã«ãçµããŠãåã«ã€ããŠã®è©³çްãèŠãããã«ãã®ããŒãžã«æ»ã£ãŠããå Žåã¯ãè¯ããªãœãŒã¹ãšã㊠<a href="https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html" class="external-link" target="_blank">`mypy` ã®ãããŒãã·ãŒãã</a> ããããŸãã
+ãã§ã«ãã¹ãŠã®ãã¥ãŒããªã¢ã«ãçµããŠãåã«ã€ããŠã®è©³çްãèŠãããã«ãã®ããŒãžã«æ»ã£ãŠããå Žåã¯ãè¯ããªãœãŒã¹ãšã㊠[`mypy` ã®ãããŒãã·ãŒã`](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html) ããããŸãã
///
## æè¡çãªè©³çް { #technical-details }
-`BackgroundTasks` ã¯ã©ã¹ã¯ã<a href="https://www.starlette.dev/background/" class="external-link" target="_blank">`starlette.background`</a>ããçŽæ¥ååŸãããŸãã
+`BackgroundTasks` ã¯ã©ã¹ã¯ã[`starlette.background`](https://www.starlette.dev/background/) ããçŽæ¥ååŸãããŸãã
ããã¯ãFastAPI ã«çŽæ¥ã€ã³ããŒã/ã€ã³ã¯ã«ãŒããããããã`fastapi` ããã€ã³ããŒãã§ããäžã«ã`starlette.background`ããå¥ã® `BackgroundTask` (æ«å°Ÿã« `s` ããªã) ã誀ã£ãŠã€ã³ããŒãããããšãåé¿ã§ããŸãã
ããã§ããFastAPI ã§ `BackgroundTask` ãåç¬ã§äœ¿çšããããšã¯å¯èœã§ãããã³ãŒãå
ã§ãªããžã§ã¯ããäœæãããããå«ãStarlette `Response` ãè¿ãå¿
èŠããããŸãã
-詳现ã«ã€ããŠã¯ã<a href="https://www.starlette.dev/background/" class="external-link" target="_blank">Starlette ã®ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã«é¢ããå
¬åŒããã¥ã¡ã³ã</a>ãåç
§ããŠäžããã
+詳现ã«ã€ããŠã¯ã[Starlette ã®ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã«é¢ããå
¬åŒããã¥ã¡ã³ã](https://www.starlette.dev/background/)ãåç
§ããŠäžããã
## 泚æ { #caveat }
-倧éã®ããã¯ã°ã©ãŠã³ãèšç®ãå¿
èŠã§ãããå¿
ãããåãããã»ã¹ã§å®è¡ããå¿
èŠããªãå Žå (ããšãã°ãã¡ã¢ãªã倿°ãªã©ãå
±æããå¿
èŠããªãå Žå)ã<a href="https://docs.celeryq.dev" class="external-link" target="_blank">Celery</a> ã®ãããªãã倧ããªä»ã®ããŒã«ã䜿çšãããšã¡ãªããããããããããŸããã
+倧éã®ããã¯ã°ã©ãŠã³ãèšç®ãå¿
èŠã§ãããå¿
ãããåãããã»ã¹ã§å®è¡ããå¿
èŠããªãå Žå (ããšãã°ãã¡ã¢ãªã倿°ãªã©ãå
±æããå¿
èŠããªãå Žå)ã[Celery](https://docs.celeryq.dev) ã®ãããªãã倧ããªä»ã®ããŒã«ã䜿çšãããšã¡ãªããããããããããŸããã
ãããã¯ãããè€éãªæ§æãRabbitMQ ã Redis ãªã©ã®ã¡ãã»ãŒãž/ãžã§ããã¥ãŒãããŒãžã£ãŒãå¿
èŠãšããåŸåããããŸãããè€æ°ã®ããã»ã¹ãç¹ã«è€æ°ã®ãµãŒããŒã§ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ãå®è¡ã§ããŸãã
```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
+âââ app # "app" 㯠Python ããã±ãŒãž
+â  âââ __init__.py # ãã®ãã¡ã€ã«ã«ãã "app" ã¯ãPython ããã±ãŒãžãã«ãªã
+â  âââ main.py # "main" ã¢ãžã¥ãŒã«ïŒäŸ: import app.mainïŒ
+â  âââ dependencies.py # "dependencies" ã¢ãžã¥ãŒã«ïŒäŸ: import app.dependenciesïŒ
+â  âââ routers # "routers" ã¯ãPython ãµãããã±ãŒãžã
+â  â âââ __init__.py # ãã®ãã¡ã€ã«ã«ãã "routers" ã¯ãPython ãµãããã±ãŒãžãã«ãªã
+â  â âââ items.py # "items" ãµãã¢ãžã¥ãŒã«ïŒäŸ: import app.routers.itemsïŒ
+â  â âââ users.py # "users" ãµãã¢ãžã¥ãŒã«ïŒäŸ: import app.routers.usersïŒ
+â  âââ internal # "internal" ã¯ãPython ãµãããã±ãŒãžã
+â  âââ __init__.py # ãã®ãã¡ã€ã«ã«ãã "internal" ã¯ãPython ãµãããã±ãŒãžãã«ãªã
+â  âââ admin.py # "admin" ãµãã¢ãžã¥ãŒã«ïŒäŸ: import app.internal.adminïŒ
```
## `APIRouter` { #apirouter }
ãã®äŸãç°¡åã«ããããã«æ¶ç©ºã®ããããŒã䜿ã£ãŠããŸãã
-ãããå®éã«ã¯ãçµã¿èŸŒã¿ã® [Security utilities](security/index.md){.internal-link target=_blank} ãäœ¿ãæ¹ãè¯ãçµæã«ãªããŸãã
+ãããå®éã«ã¯ãçµã¿èŸŒã¿ã® [Security utilities](security/index.md) ãäœ¿ãæ¹ãè¯ãçµæã«ãªããŸãã
///
/// tip | è±ç¥è
-[*path operation ãã³ã¬ãŒã¿*ã®äŸåé¢ä¿](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} ãšåæ§ã«ã*path operation 颿°*ã«ã¯å€ã¯æž¡ãããªãç¹ã«æ³šæããŠãã ããã
+[*path operation ãã³ã¬ãŒã¿*ã®äŸåé¢ä¿](dependencies/dependencies-in-path-operation-decorators.md) ãšåæ§ã«ã*path operation 颿°*ã«ã¯å€ã¯æž¡ãããªãç¹ã«æ³šæããŠãã ããã
///
* ãã¹ãŠã«äºåå®çŸ©ãã `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} ã远å ããããšãã§ããŸãã
+ * ã«ãŒã¿ãŒã®äŸåé¢ä¿ãå
ã«å®è¡ããããã®åŸã«[ãã³ã¬ãŒã¿å
ã® `dependencies`](dependencies/dependencies-in-path-operation-decorators.md)ãæ¬¡ã«éåžžã®ãã©ã¡ãŒã¿äŸåé¢ä¿ãç¶ããŸãã
+ * [`scopes` ã䌎ã `Security` äŸåé¢ä¿](../advanced/security/oauth2-scopes.md) ã远å ããããšãã§ããŸãã
/// tip | è±ç¥è
éåžžã©ãã `FastAPI` ã¯ã©ã¹ãã€ã³ããŒãããŠäœæããŸãã
-ããã«ãå `APIRouter` ã®äŸåé¢ä¿ãšçµã¿åãããã[ã°ããŒãã«äŸåé¢ä¿](dependencies/global-dependencies.md){.internal-link target=_blank}ã宣èšã§ããŸã:
+ããã«ãå `APIRouter` ã®äŸåé¢ä¿ãšçµã¿åãããã[ã°ããŒãã«äŸåé¢ä¿](dependencies/global-dependencies.md)ã宣èšã§ããŸã:
{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[1,3,7] title["app/main.py"] *}
from app.routers import items, users
```
-Python ã®ããã±ãŒãžãšã¢ãžã¥ãŒã«ã«ã€ããŠè©³ããã¯ã<a href="https://docs.python.org/3/tutorial/modules.html" class="external-link" target="_blank">å
¬åŒã® Python ã¢ãžã¥ãŒã«ã«é¢ããããã¥ã¡ã³ã</a>ãã芧ãã ããã
+Python ã®ããã±ãŒãžãšã¢ãžã¥ãŒã«ã«ã€ããŠè©³ããã¯ã[å
¬åŒã® Python ã¢ãžã¥ãŒã«ã«é¢ããããã¥ã¡ã³ã](https://docs.python.org/3/tutorial/modules.html)ãã芧ãã ããã
///
///
+## `pyproject.toml` ã® `entrypoint` ãèšå® { #configure-the-entrypoint-in-pyproject-toml }
+
+FastAPI ã® `app` ãªããžã§ã¯ã㯠`app/main.py` ã«ããã®ã§ã`pyproject.toml` ã§ `entrypoint` ãæ¬¡ã®ããã«èšå®ã§ããŸã:
+
+```toml
+[tool.fastapi]
+entrypoint = "app.main:app"
+```
+
+ããã¯æ¬¡ã®ããã«ã€ã³ããŒãããã®ãšåçã§ã:
+
+```python
+from app.main import app
+```
+
+ãã®ããã«ãããšã`fastapi` ã³ãã³ããã¢ããªã®å Žæãææ¡ã§ããŸãã
+
+/// Note | åè
+
+ã³ãã³ãã«ãã¹ãæž¡ãããšãã§ããŸããäŸãã°:
+
+```console
+$ fastapi dev app/main.py
+```
+
+ãããããã®ãã³ã« `fastapi` ã³ãã³ããåŒã¶éãæ£ãããã¹ãæž¡ãã®ãå¿ããªãããã«ããå¿
èŠããããŸãã
+
+ããã«ã[VS Code Extension](../editor-support.md) ã [FastAPI Cloud](https://fastapicloud.com) ãªã©ãä»ã®ããŒã«ãèŠã€ããããªãå ŽåããããŸãããã®ããã`pyproject.toml` ã® `entrypoint` ã䜿ãããšãæšå¥šããŸãã
+
+///
+
## èªåAPIããã¥ã¡ã³ãã®ç¢ºèª { #check-the-automatic-api-docs }
ã¢ããªãå®è¡ããŸã:
<div class="termy">
```console
-$ fastapi dev app/main.py
+$ fastapi dev
<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> ãéããŸãã
+ãã㊠[http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) ãéããŸãã
ãã¹ãŠã®ãµãã¢ãžã¥ãŒã«ç±æ¥ã®ãã¹ãå«ãèªå API ããã¥ã¡ã³ãã衚瀺ãããæ£ãããã¹ïŒããã³ prefixïŒãšæ£ããã¿ã°ã䜿ãããŠããã®ãåãããŸã:
`str`ã`int`ã`float`ãªã©ã®éåžžã®åæ°åã®ä»ã«ãã`str`ãç¶æ¿ããããè€éãªåæ°åã䜿ãããšãã§ããŸãã
-ãã¹ãŠã®ãªãã·ã§ã³ãã¿ãã«ã¯ã<a href="https://docs.pydantic.dev/latest/concepts/types/" class="external-link" target="_blank">Pydanticã®åã®æŠèŠ</a>ã確èªããŠãã ãããæ¬¡ã®ç« ã§ããã€ãã®äŸãã¿ãããšãã§ããŸãã
+ãã¹ãŠã®ãªãã·ã§ã³ãã¿ãã«ã¯ã[Pydantic ã®åã®æŠèŠ](https://docs.pydantic.dev/latest/concepts/types/)ã確èªããŠãã ãããæ¬¡ã®ç« ã§ããã€ãã®äŸãã¿ãããšãã§ããŸãã
äŸãã°ã`Image`ã¢ãã«ã®ããã«`url`ãã£ãŒã«ããããå Žåã`str`ã®ä»£ããã«Pydanticã®`HttpUrl`ã®ã€ã³ã¹ã¿ã³ã¹ãšããŠå®£èšããããšãã§ããŸã:
## `PUT`ã«ãã眮æã§ã®æŽæ° { #update-replacing-with-put }
-é
ç®ãæŽæ°ããã«ã¯<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT" class="external-link" target="_blank">HTTPã®`PUT`</a>æäœã䜿çšããããšãã§ããŸãã
+é
ç®ãæŽæ°ããã«ã¯[HTTPã®`PUT`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT)æäœã䜿çšããããšãã§ããŸãã
`jsonable_encoder`ãçšããŠãå
¥åããŒã¿ãJSONãšããŠä¿åã§ããããŒã¿ã«å€æããããšãã§ããŸãïŒäŸïŒNoSQLããŒã¿ããŒã¹ïŒãäŸãã°ã`datetime`ã`str`ã«å€æããŸãã
## `PATCH`ã«ããéšåçãªæŽæ° { #partial-updates-with-patch }
-ãŸãã<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH" class="external-link" target="_blank">HTTPã®`PATCH`</a>æäœã§ããŒã¿ã*éšåçã«*æŽæ°ããããšãã§ããŸãã
+ãŸãã[HTTPã®`PATCH`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH)æäœã§ããŒã¿ã*éšåçã«*æŽæ°ããããšãã§ããŸãã
ã€ãŸããæŽæ°ãããããŒã¿ã ããéä¿¡ããŠãæ®ãã¯ãã®ãŸãŸã«ããŠããããšãã§ããŸãã
ãŸãšãããšãéšåçãªæŽæ°ãé©çšããã«ã¯ã次ã®ããã«ããŸã:
-* (ãªãã·ã§ã³ã§)`PATCH`ã®ä»£ããã«`PUT`ã䜿çšããŸãã
+* (ãªãã·ã§ã³ã§)`PUT`ã®ä»£ããã«`PATCH`ã䜿çšããŸãã
* ä¿åãããŠããããŒã¿ãååŸããŸãã
* ãã®ããŒã¿ãPydanticã¢ãã«ã«ãããŸãã
* å
¥åã¢ãã«ããããã©ã«ãå€ãå«ãŸãªã`dict`ãçæããŸãïŒ`exclude_unset`ã䜿çšããŸãïŒã
ãã®ããããã¹ãŠã®å±æ§ãçç¥ã§ããéšåçãªå€æŽãåãåãããå Žåã¯ããã¹ãŠã®å±æ§ããªãã·ã§ã³ãšããŠããŒã¯ããã¢ãã«ãçšæããå¿
èŠããããŸãïŒããã©ã«ãå€ãŸãã¯`None`ã䜿çšããŠïŒã
-**æŽæ°** ã®ããã®ãªãã·ã§ã³å€ããã¹ãŠèšå®ãããŠããã¢ãã«ãšã**äœæ** ã®ããã®å¿
é å€ãèšå®ãããŠããã¢ãã«ãåºå¥ããã«ã¯ã[远å ã¢ãã«](extra-models.md){.internal-link target=_blank}ã§èª¬æãããŠããèãæ¹ãå©çšããããšãã§ããŸãã
+**æŽæ°** ã®ããã®ãªãã·ã§ã³å€ããã¹ãŠèšå®ãããŠããã¢ãã«ãšã**äœæ** ã®ããã®å¿
é å€ãèšå®ãããŠããã¢ãã«ãåºå¥ããã«ã¯ã[远å ã¢ãã«](extra-models.md)ã§èª¬æãããŠããèãæ¹ãå©çšããããšãã§ããŸãã
///
APIã¯ã»ãšãã©ã®å Žå **ã¬ã¹ãã³ã¹** ããã£ãéä¿¡ããå¿
èŠããããŸãããããã¯ã©ã€ã¢ã³ãã¯ãåžžã« **ãªã¯ãšã¹ãããã£** ãéä¿¡ããå¿
èŠããããšã¯éããŸãããå Žåã«ãã£ãŠã¯ãã¯ãšãªãã©ã¡ãŒã¿ä»ãã®ãã¹ã ãããªã¯ãšã¹ãããŠãããã£ãéä¿¡ããªãããšããããŸãã
-**ãªã¯ãšã¹ã**ããã£ã宣èšããã«ã¯ã<a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> ã¢ãã«ã䜿çšãããã®åŒ·åãªæ©èœãšã¡ãªããããã¹ãŠå©çšããŸãã
+**ãªã¯ãšã¹ã**ããã£ã宣èšããã«ã¯ã[Pydantic](https://docs.pydantic.dev/) ã¢ãã«ã䜿çšãããã®åŒ·åãªæ©èœãšã¡ãªããããã¹ãŠå©çšããŸãã
/// info | æ
å ±
* ããŒã¿ãç¡å¹ãªå Žåã¯ãã©ãã§äœãäžæ£ãªããŒã¿ã ã£ãã®ããæ£ç¢ºã«ç€ºããåãããããæç¢ºãªãšã©ãŒãè¿ããŸãã
* åãåã£ãããŒã¿ããã©ã¡ãŒã¿ `item` ã«æž¡ããŸãã
* 颿°å
ã§ `Item` åãšããŠå®£èšããããããã¹ãŠã®å±æ§ãšãã®åã«ã€ããŠããšãã£ã¿ãµããŒãïŒè£å®ãªã©ïŒãå©çšã§ããŸãã
-* ã¢ãã«åãã® <a href="https://json-schema.org" class="external-link" target="_blank">JSON Schema</a> å®çŸ©ãçæããŸãããããžã§ã¯ãã«ãšã£ãŠæå³ããããªããä»ã®å Žæã§ã奜ããªããã«å©çšã§ããŸãã
+* ã¢ãã«åãã® [JSON Schema](https://json-schema.org) å®çŸ©ãçæããŸãããããžã§ã¯ãã«ãšã£ãŠæå³ããããªããä»ã®å Žæã§ã奜ããªããã«å©çšã§ããŸãã
* ãããã®ã¹ããŒãã¯çæãããOpenAPIã¹ããŒãã®äžéšãšãªããèªåããã¥ã¡ã³ãã® <abbr title="User Interfaces - ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹">UIs</abbr> ã§äœ¿çšãããŸãã
## èªåããã¥ã¡ã³ã { #automatic-docs }
ããããµããŒãããããã«ãPydanticèªäœã«ãããã€ãã®å€æŽãå ããããŸããã
-åè¿°ã®ã¹ã¯ãªãŒã³ã·ã§ãã㯠<a href="https://code.visualstudio.com" class="external-link" target="_blank">Visual Studio Code</a> ã§æ®åœ±ããããã®ã§ãã
+åè¿°ã®ã¹ã¯ãªãŒã³ã·ã§ãã㯠[Visual Studio Code](https://code.visualstudio.com) ã§æ®åœ±ããããã®ã§ãã
-ãã ãã<a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a> ããä»ã®ã»ãšãã©ã®Pythonãšãã£ã¿ã§ãåããšãã£ã¿ãµããŒããåŸãããŸã:
+ãã ãã[PyCharm](https://www.jetbrains.com/pycharm/) ããä»ã®ã»ãšãã©ã®Pythonãšãã£ã¿ã§ãåããšãã£ã¿ãµããŒããåŸãããŸã:
<img src="/img/tutorial/body/image05.png">
/// tip | è±ç¥è
-ãšãã£ã¿ãšã㊠<a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a> ã䜿çšããŠããå Žåã<a href="https://github.com/koxudaxi/pydantic-pycharm-plugin/" class="external-link" target="_blank">Pydantic PyCharm Plugin</a> ã䜿çšã§ããŸãã
+ãšãã£ã¿ãšã㊠[PyCharm](https://www.jetbrains.com/pycharm/) ã䜿çšããŠããå Žåã[Pydantic PyCharm Plugin](https://github.com/koxudaxi/pydantic-pycharm-plugin/) ã䜿çšã§ããŸãã
以äžã«ãããPydanticã¢ãã«ã«å¯Ÿãããšãã£ã¿ãµããŒããæ¹åãããŸã:
## Pydanticã䜿ããªãæ¹æ³ { #without-pydantic }
-Pydanticã¢ãã«ã䜿ããããªãå Žåã¯ã**Body** ãã©ã¡ãŒã¿ã䜿çšã§ããŸãã[Body - Multiple Parameters: Singular values in body](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank} ã®ããã¥ã¡ã³ããåç
§ããŠãã ããã
+Pydanticã¢ãã«ã䜿ããããªãå Žåã¯ã**Body** ãã©ã¡ãŒã¿ã䜿çšã§ããŸãã[Body - è€æ°ã®ãã©ã¡ãŒã¿: ããã£å
ã®åäžå€](body-multiple-params.md#singular-values-in-body) ã®ããã¥ã¡ã³ããåç
§ããŠãã ããã
# CORS (Cross-Origin Resource Sharing) { #cors-cross-origin-resource-sharing }
-<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">CORSãŸãã¯ãCross-Origin Resource Sharingã</a> ã¯ããã©ãŠã¶ã§å®è¡ãããŠããããã³ããšã³ãã«ããã¯ãšã³ããšéä¿¡ããJavaScriptã³ãŒããããããã®ããã¯ãšã³ããããã³ããšã³ããšã¯ç°ãªãããªãªãžã³ãã«ããç¶æ³ãæããŸãã
+[CORSãŸãã¯ãCross-Origin Resource Sharingã](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) ã¯ããã©ãŠã¶ã§å®è¡ãããŠããããã³ããšã³ãã«ããã¯ãšã³ããšéä¿¡ããJavaScriptã³ãŒããããããã®ããã¯ãšã³ããããã³ããšã³ããšã¯ç°ãªãããªãªãžã³ãã«ããç¶æ³ãæããŸãã
## ãªãªãžã³ { #origin }
* `allow_origins` - ãªãªãžã³éãªã¯ãšã¹ããèš±å¯ãããªãªãžã³ã®ãªã¹ããäŸãã°ã`['https://example.org', 'https://www.example.org']`ã`['*']`ã䜿çšããŠä»»æã®ãªãªãžã³ãèš±å¯ã§ããŸãã
* `allow_origin_regex` - ãªãªãžã³éãªã¯ãšã¹ããèš±å¯ãããªãªãžã³ã®æ£èŠè¡šçŸæååãäŸãã°ã`'https://.*\.example\.org'`ã
* `allow_methods` - ãªãªãžã³éãªã¯ãšã¹ãã§èš±å¯ããHTTPã¡ãœããã®ãªã¹ããããã©ã«ã㯠`['GET']` ã§ãã`['*']`ã䜿çšããŠãã¹ãŠã®æšæºã¡ãœãããèš±å¯ã§ããŸãã
-* `allow_headers` - ãªãªãžã³éãªã¯ãšã¹ãã§ãµããŒãããHTTPãªã¯ãšã¹ãããããŒã®ãªã¹ããããã©ã«ã㯠`[]` ã§ãã`['*']`ã䜿çšããŠããã¹ãŠã®ããããŒãèš±å¯ã§ããŸãã<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests" class="external-link" rel="noopener" target="_blank">ã·ã³ãã«ãªCORSãªã¯ãšã¹ã</a>ã§ã¯ã `Accept` ã `Accept-Language` ã `Content-Language` ã `Content-Type` ããããŒãåžžã«èš±å¯ãããŸãã
+* `allow_headers` - ãªãªãžã³éãªã¯ãšã¹ãã§ãµããŒãããHTTPãªã¯ãšã¹ãããããŒã®ãªã¹ããããã©ã«ã㯠`[]` ã§ãã`['*']`ã䜿çšããŠããã¹ãŠã®ããããŒãèš±å¯ã§ããŸãã[ã·ã³ãã«ãªCORSãªã¯ãšã¹ã](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests)ã§ã¯ã `Accept` ã `Accept-Language` ã `Content-Language` ã `Content-Type` ããããŒãåžžã«èš±å¯ãããŸãã
* `allow_credentials` - ãªãªãžã³éãªã¯ãšã¹ãã§CookieããµããŒãããå¿
èŠãããããšã瀺ããŸããããã©ã«ã㯠`False` ã§ãã
- `allow_credentials` ã `True` ã«èšå®ãããŠããå Žåã`allow_origins`ã`allow_methods`ã`allow_headers` ã®ãããã `['*']` ã«èšå®ã§ããŸããããããã¯ãã¹ãŠ<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards" class="external-link" rel="noopener" target="_blank">æç€ºçã«æå®</a>ããå¿
èŠããããŸãã
+ `allow_credentials` ã `True` ã«èšå®ãããŠããå Žåã`allow_origins`ã`allow_methods`ã`allow_headers` ã®ãããã `['*']` ã«èšå®ã§ããŸããããããã¯ãã¹ãŠ[æç€ºçã«æå®](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards)ããå¿
èŠããããŸãã
* `expose_headers` - ãã©ãŠã¶ããã¢ã¯ã»ã¹ã§ããããã«ããã¬ã¹ãã³ã¹ããããŒã瀺ããŸããããã©ã«ã㯠`[]` ã§ãã
* `max_age` - ãã©ãŠã¶ãCORSã¬ã¹ãã³ã¹ããã£ãã·ã¥ããæå€§æéãç§åäœã§èšå®ããŸããããã©ã«ã㯠`600` ã§ãã
## ãã詳ããæ
å ± { #more-info }
-<abbr title="Cross-Origin Resource Sharing â ãªãªãžã³éãªãœãŒã¹å
±æ">CORS</abbr>ã«ã€ããŠãã詳ããæ
å ±ã¯ã<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">Mozilla CORS documentation</a> ãåç
§ããŠäžããã
+<abbr title="Cross-Origin Resource Sharing - ãªãªãžã³éãªãœãŒã¹å
±æ">CORS</abbr>ã«ã€ããŠãã詳ããæ
å ±ã¯ã[Mozilla CORS documentation](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) ãåç
§ããŠäžããã
/// note | æè¡è©³çް
```Python
from myapp import app
-# Some more code
+# ãã®ä»ã®ã³ãŒã
```
ãã®å Žåã`myapp.py` å
ã®èªåçã«äœæããã倿° `__name__` ã¯ãå€ãšã㊠`"__main__"` ãæã¡ãŸããã
/// info | æ
å ±
-ãã詳ããæ
å ±ã¯ã<a href="https://docs.python.org/3/library/__main__.html" class="external-link" target="_blank">å
¬åŒPythonããã¥ã¡ã³ã</a>ãåç
§ããŠãã ããã
+ãã詳ããæ
å ±ã¯ã[å
¬åŒPythonããã¥ã¡ã³ã](https://docs.python.org/3/library/__main__.html)ãåç
§ããŠãã ããã
///
ãã®äŸã§ã¯ãæ¶ç©ºã®ã«ã¹ã¿ã ããã㌠`X-Key` ãš `X-Token` ã䜿çšããŠããŸãã
-ãããå®éã®ã±ãŒã¹ã§ã»ãã¥ãªãã£ãå®è£
ããéã¯ãçµ±åããã[Security utilitiesïŒæ¬¡ã®ç« ïŒ](../security/index.md){.internal-link target=_blank}ã䜿ãããšã§ãããå€ãã®å©ç¹ãåŸãããŸãã
+ãããå®éã®ã±ãŒã¹ã§ã»ãã¥ãªãã£ãå®è£
ããéã¯ãçµ±åããã[Security utilitiesïŒæ¬¡ã®ç« ïŒ](../security/index.md)ã䜿ãããšã§ãããå€ãã®å©ç¹ãåŸãããŸãã
///
## *path operation*ã®ã°ã«ãŒãã«å¯ŸããäŸåé¢ä¿ { #dependencies-for-a-group-of-path-operations }
-åŸã§ããã倧ããªã¢ããªã±ãŒã·ã§ã³ãïŒããããè€æ°ãã¡ã€ã«ã§ïŒæ§é åããæ¹æ³ïŒ[Bigger Applications - Multiple Files](../../tutorial/bigger-applications.md){.internal-link target=_blank}ïŒã«ã€ããŠèªããšãã«ã*path operation*ã®ã°ã«ãŒãã«å¯ŸããŠåäžã®`dependencies`ãã©ã¡ãŒã¿ã宣èšããæ¹æ³ãåŠã³ãŸãã
+åŸã§ããã倧ããªã¢ããªã±ãŒã·ã§ã³ãïŒããããè€æ°ãã¡ã€ã«ã§ïŒæ§é åããæ¹æ³ïŒ[Bigger Applications - Multiple Files](../../tutorial/bigger-applications.md)ïŒã«ã€ããŠèªããšãã«ã*path operation*ã®ã°ã«ãŒãã«å¯ŸããŠåäžã®`dependencies`ãã©ã¡ãŒã¿ã宣èšããæ¹æ³ãåŠã³ãŸãã
## ã°ããŒãã«äŸåé¢ä¿ { #global-dependencies }
以äžãšäžç·ã«äœ¿çšã§ãã颿°ãªãäœã§ãæå¹ã§ã:
-* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager" class="external-link" target="_blank">`@contextlib.contextmanager`</a>ãŸãã¯
-* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager" class="external-link" target="_blank">`@contextlib.asynccontextmanager`</a>
+* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) ãŸãã¯
+* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager)
ããã㯠**FastAPI** ã®äŸåé¢ä¿ãšããŠäœ¿çšããã®ã«æå¹ã§ãã
/// note | æè¡è©³çް
-ããã¯Pythonã®<a href="https://docs.python.org/3/library/contextlib.html" class="external-link" target="_blank">Context Managers</a>ã®ãããã§åäœããŸãã
+ããã¯Pythonã®[ã³ã³ããã¹ããããŒãžã£](https://docs.python.org/3/library/contextlib.html)ã®ãããã§åäœããŸãã
**FastAPI** ã¯ãããå®çŸããããã«å
éšçã«äœ¿çšããŠããŸãã
{* ../../docs_src/dependencies/tutorial008b_an_py310.py hl[18:22,31] *}
-äŸå€ããã£ããããŠãããã«åºã¥ããŠã«ã¹ã¿ã ã¬ã¹ãã³ã¹ãäœæãããå Žåã¯ã[ã«ã¹ã¿ã äŸå€ãã³ãã©](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}ãäœæããŠãã ããã
+äŸå€ããã£ããããŠãããã«åºã¥ããŠã«ã¹ã¿ã ã¬ã¹ãã³ã¹ãäœæãããå Žåã¯ã[ã«ã¹ã¿ã äŸå€ãã³ãã©](../handling-errors.md#install-custom-exception-handlers)ãäœæããŠãã ããã
## `yield`ãš`except`ãæã€äŸåé¢ä¿ { #dependencies-with-yield-and-except }
`yield`ãæã€äŸåé¢ä¿ã¯ãããŸããŸãªãŠãŒã¹ã±ãŒã¹ãã«ããŒããããã€ãã®åé¡ãä¿®æ£ããããã«ãæéãšãšãã«é²åããŠããŸããã
-FastAPIã®ç°ãªãããŒãžã§ã³ã§äœãå€ãã£ãã®ããç¥ãããå Žåã¯ãäžçŽã¬ã€ãã®[äžçŽã®äŸåé¢ä¿ - `yield`ã`HTTPException`ã`except`ãããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ãæã€äŸåé¢ä¿](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks){.internal-link target=_blank}ã§è©³ããèªããŸãã
+FastAPIã®ç°ãªãããŒãžã§ã³ã§äœãå€ãã£ãã®ããç¥ãããå Žåã¯ãäžçŽã¬ã€ãã®[äžçŽã®äŸåé¢ä¿ - `yield`ã`HTTPException`ã`except`ãããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ãæã€äŸåé¢ä¿](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks)ã§è©³ããèªããŸãã
## ã³ã³ããã¹ããããŒãžã£ { #context-managers }
### ãã³ã³ããã¹ããããŒãžã£ããšã¯ { #what-are-context-managers }
ãã³ã³ããã¹ããããŒãžã£ããšã¯ã`with`æã®äžã§äœ¿çšã§ããPythonãªããžã§ã¯ãã®ããšã§ãã
-äŸãã°ã<a href="https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files" class="external-link" target="_blank">ãã¡ã€ã«ãèªã¿èŸŒãã«ã¯`with`ã䜿çšããããšãã§ããŸã</a>:
+äŸãã°ã[ãã¡ã€ã«ãèªã¿èŸŒãã«ã¯`with`ã䜿çšããããšãã§ããŸã](https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files):
```Python
with open("./somefile.txt") as f:
///
-Pythonã§ã¯ã<a href="https://docs.python.org/3/reference/datamodel.html#context-managers" class="external-link" target="_blank">以äžã®ïŒã€ã®ã¡ãœãããæã€ã¯ã©ã¹ãäœæãã: `__enter__()`ãš`__exit__()`</a>ããšã§ã³ã³ããã¹ããããŒãžã£ãäœæããããšãã§ããŸãã
+Pythonã§ã¯ã[以äžã®ïŒã€ã®ã¡ãœãããæã€ã¯ã©ã¹ãäœæãã: `__enter__()`ãš`__exit__()`](https://docs.python.org/3/reference/datamodel.html#context-managers)ããšã§ã³ã³ããã¹ããããŒãžã£ãäœæããããšãã§ããŸãã
ãŸããäŸå颿°ã®äžã§`with`ã`async with`æã䜿çšããããšã«ãã£ãŠ`yield`ãæã€ **FastAPI** ã®äŸåé¢ä¿ã®äžã§ãããã䜿çšããããšãã§ããŸã:
/// tip | è±ç¥è
-ã³ã³ããã¹ããããŒãžã£ãäœæããããäžã€ã®æ¹æ³ã¯withã§ã:
+ã³ã³ããã¹ããããŒãžã£ãäœæããããäžã€ã®æ¹æ³ã¯æ¬¡ã®æ¹æ³ã§ã:
-* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager" class="external-link" target="_blank">`@contextlib.contextmanager`</a> ãŸãã¯
-* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager" class="external-link" target="_blank">`@contextlib.asynccontextmanager`</a>
+* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) ãŸãã¯
+* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager)
ãããã䜿ã£ãŠã颿°ãåäžã®`yield`ã§ãã³ã¬ãŒãããããšãã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®çš®é¡ã«ãã£ãŠã¯ãã¢ããªå
šäœã«äŸåé¢ä¿ã远å ãããå ŽåããããŸãã
-[`dependencies` ã path operation ã®ãã³ã¬ãŒã¿ã«è¿œå ](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}ã§ããã®ãšåæ§ã«ã`FastAPI` ã¢ããªã±ãŒã·ã§ã³èªäœã«ã远å ã§ããŸãã
+[`dependencies` ã path operation ã®ãã³ã¬ãŒã¿ã«è¿œå ](dependencies-in-path-operation-decorators.md)ã§ããã®ãšåæ§ã«ã`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 ã«å¯ŸããŠé©çšãããŸãã
+ãŸãã[`dependencies` ã path operation ã®ãã³ã¬ãŒã¿ã«è¿œå ](dependencies-in-path-operation-decorators.md)ããç¯ã§èª¬æããèãæ¹ã¯ãã¹ãŠåŒãç¶ãåœãŠã¯ãŸããŸããããã®å Žåã¯ã¢ããªå
ã®ãã¹ãŠã® path operation ã«å¯ŸããŠé©çšãããŸãã
## path operation ã®ã°ã«ãŒãã«å¯ŸããäŸåé¢ä¿ { #dependencies-for-groups-of-path-operations }
-åŸã§ãè€æ°ãã¡ã€ã«ãå«ãå€§èŠæš¡ã¢ããªã±ãŒã·ã§ã³ã®æ§ææ¹æ³ïŒ[å€§èŠæš¡ã¢ããªã±ãŒã·ã§ã³ - è€æ°ãã¡ã€ã«](../../tutorial/bigger-applications.md){.internal-link target=_blank}ïŒãèªããšãpath operation ã®ã°ã«ãŒãã«å¯Ÿã㊠1 ã€ã® `dependencies` ãã©ã¡ãŒã¿ã宣èšããæ¹æ³ãåŠã³ãŸãã
+åŸã§ãè€æ°ãã¡ã€ã«ãå«ãå€§èŠæš¡ã¢ããªã±ãŒã·ã§ã³ã®æ§ææ¹æ³ïŒ[å€§èŠæš¡ã¢ããªã±ãŒã·ã§ã³ - è€æ°ãã¡ã€ã«](../../tutorial/bigger-applications.md)ïŒãèªããšãpath operation ã®ã°ã«ãŒãã«å¯Ÿã㊠1 ã€ã® `dependencies` ãã©ã¡ãŒã¿ã宣èšããæ¹æ³ãåŠã³ãŸãã
å€ãããŒãžã§ã³ã䜿çšããŠããå Žåã`Annotated` ã䜿ãããšãããšãšã©ãŒã«ãªããŸãã
-`Annotated` ã䜿çšããåã«ãå°ãªããšã 0.95.1 ãŸã§ [FastAPI ã®ããŒãžã§ã³ãã¢ããã°ã¬ãŒã](../../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} ããŠãã ããã
+`Annotated` ã䜿çšããåã«ãå°ãªããšã 0.95.1 ãŸã§ [FastAPI ã®ããŒãžã§ã³ãã¢ããã°ã¬ãŒã](../../deployment/versions.md#upgrading-the-fastapi-versions) ããŠãã ããã
///
/// note | åè
-ããããªãå Žåã¯ãããã¥ã¡ã³ãã®[Async: *"In a hurry?"*](../../async.md#in-a-hurry){.internal-link target=_blank}ã®äžã®`async`ãš`await`ã«ã€ããŠã®ã»ã¯ã·ã§ã³ã確èªããŠãã ããã
+ããããªãå Žåã¯ãããã¥ã¡ã³ãã®[Async: *ãæ¥ãã§ããŸããïŒã*](../../async.md#in-a-hurry)ã®äžã®`async`ãš`await`ã«ã€ããŠã®ã»ã¯ã·ã§ã³ã確èªããŠãã ããã
///
äŸãã°ã`datetime`ãªããžã§ã¯ãã¯JSONãšäºææ§ããªãã®ã§ãåãåãããŸããã
-ãã®ããã`datetime`ãªããžã§ã¯ãã¯<a href="https://en.wikipedia.org/wiki/ISO_8601" class="external-link" target="_blank">ISO圢åŒ</a>ã®ããŒã¿ãå«ã`str`ã«å€æãããªããã°ãªããŸããã
+ãã®ããã`datetime`ãªããžã§ã¯ãã¯[ISO圢åŒ](https://en.wikipedia.org/wiki/ISO_8601)ã®ããŒã¿ãå«ã`str`ã«å€æãããªããã°ãªããŸããã
åæ§ã«ããã®ããŒã¿ããŒã¹ã¯Pydanticã¢ãã«ïŒå±æ§ãæã€ãªããžã§ã¯ãïŒãåãåããã`dict`ã ããåãåããŸãã
ãã®äŸã§ã¯ãPydanticã¢ãã«ã`dict`ã«ã`datetime`ã`str`ã«å€æããŸãã
-åŒã³åºããçµæã¯ãPythonã®æšæºã®<a href="https://docs.python.org/3/library/json.html#json.dumps" class="external-link" target="_blank">`json.dumps()`</a>ã§ãšã³ã³ãŒãã§ãããã®ã§ãã
+åŒã³åºããçµæã¯ãPythonã®æšæºã®[`json.dumps()`](https://docs.python.org/3/library/json.html#json.dumps)ã§ãšã³ã³ãŒãã§ãããã®ã§ãã
ããã¯JSON圢åŒã®ããŒã¿ãå«ã倧ããª`str`ãïŒæååãšããŠïŒè¿ããŸãããJSONãšäºææ§ã®ããå€ãšãµãã®å€ãæã€Pythonæšæºã®ããŒã¿æ§é ïŒäŸïŒ`dict`ïŒãè¿ããŸãã
* `datetime.timedelta`:
* Pythonã®`datetime.timedelta`ã§ãã
* ãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã§ã¯åèšç§æ°ã®`float`ã§è¡šçŸãããŸãã
- * Pydanticã§ã¯ãISO 8601 time diff encodingããšããŠè¡šçŸããããšãå¯èœã§ãã<a href="https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers" class="external-link" target="_blank">詳现ã¯ããã¥ã¡ã³ããåç
§ããŠãã ãã</a>ã
+ * Pydanticã§ã¯ãISO 8601 time diff encodingããšããŠè¡šçŸããããšãå¯èœã§ãã[詳现ã¯ããã¥ã¡ã³ããåç
§ããŠãã ãã](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers)ã
* `frozenset`:
* ãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã§ã¯`set`ãšåãããã«æ±ãããŸã:
* ãªã¯ãšã¹ãã§ã¯ããªã¹ããèªã¿èŸŒãŸããéè€ãæé€ããŠ`set`ã«å€æãããŸãã
* `Decimal`:
* Pythonã®æšæºçãª`Decimal`ã§ãã
* ãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã§ã¯`float`ãšåãããã«æ±ãããŸãã
-* Pydanticã®å
šãŠã®æå¹ãªåã¯ãã¡ãã§ç¢ºèªã§ããŸã: <a href="https://docs.pydantic.dev/latest/usage/types/types/" class="external-link" target="_blank">Pydantic data types</a>ã
+* æå¹ãªPydanticã®ããŒã¿åã¯ããã§ç¢ºèªã§ããŸã: [Pydantic ã®ããŒã¿å](https://docs.pydantic.dev/latest/usage/types/types/)ã
## äŸ { #example }
ãŠãŒã¶ãŒã®å¹³æã®ãã¹ã¯ãŒãã¯çµ¶å¯Ÿã«ä¿åããªãã§ãã ãããåžžã«æ€èšŒã§ãããå®å
šãªããã·ã¥ããä¿åããŠãã ããã
-ç¥ããªãæ¹ã¯ã[ã»ãã¥ãªãã£ã®ç« ](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}ã§ããã¹ã¯ãŒãããã·ã¥ããšã¯äœããåŠã¶ããšãã§ããŸãã
+ç¥ããªãæ¹ã¯ã[ã»ãã¥ãªãã£ã®ç« ](security/simple-oauth2.md#password-hashing)ã§ããã¹ã¯ãŒãããã·ã¥ããšã¯äœããåŠã¶ããšãã§ããŸãã
///
OpenAPIã§ã¯`anyOf`ã§å®çŸ©ãããŸãã
-ãã®ããã«ã¯ãæšæºçãªPythonã®åãã³ã<a href="https://docs.python.org/3/library/typing.html#typing.Union" class="external-link" target="_blank">`typing.Union`</a>ã䜿çšããŸã:
+ãã®ããã«ã¯ãæšæºçãªPythonã®åãã³ã[`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union)ã䜿çšããŸã:
/// note | åè
-<a href="https://docs.pydantic.dev/latest/concepts/types/#unions" class="external-link" target="_blank">`Union`</a>ãå®çŸ©ããå Žåã¯ãæãå
·äœçãªåãå
ã«ããã®åŸã«ããå
·äœæ§ã®äœãåãå«ããŠãã ããã以äžã®äŸã§ã¯ãããå
·äœçãª`PlaneItem`ã`Union[PlaneItem, CarItem]`å
ã§`CarItem`ããåã«æ¥ãŠããŸãã
+[`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions)ãå®çŸ©ããå Žåã¯ãæãå
·äœçãªåãå
ã«ããã®åŸã«ããå
·äœæ§ã®äœãåãå«ããŠãã ããã以äžã®äŸã§ã¯ãããå
·äœçãª`PlaneItem`ã`Union[PlaneItem, CarItem]`å
ã§`CarItem`ããåã«æ¥ãŠããŸãã
///
<div class="termy">
```console
-$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u>
+$ <font color="#4E9A06">fastapi</font> dev
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server ð
### ãã§ã㯠{ #check-it }
-ãã©ãŠã¶ã§<a href="http://127.0.0.1:8000" class="external-link" target="_blank">http://127.0.0.1:8000</a>ãéããŸãã
+ãã©ãŠã¶ã§[http://127.0.0.1:8000](http://127.0.0.1:8000)ãéããŸãã
次ã®ãããªJSONã¬ã¹ãã³ã¹ã衚瀺ãããŸã:
### 察話çAPIããã¥ã¡ã³ã { #interactive-api-docs }
-次ã«ã<a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>ã«ã¢ã¯ã»ã¹ããŸãã
+次ã«ã[http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)ã«ã¢ã¯ã»ã¹ããŸãã
-èªåçæããã察話çAPIããã¥ã¡ã³ãã衚瀺ãããŸã (<a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>ã§æäŸ):
+èªåçæããã察話çAPIããã¥ã¡ã³ãã衚瀺ãããŸãïŒ[Swagger UI](https://github.com/swagger-api/swagger-ui)ã§æäŸïŒ:

### 代æ¿APIããã¥ã¡ã³ã { #alternative-api-docs }
-次ã«ã<a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>ã«ã¢ã¯ã»ã¹ããŸãã
+次ã«ã[http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc)ã«ã¢ã¯ã»ã¹ããŸãã
-å
ã»ã©ãšã¯ç°ãªããèªåçæããã察話çAPIããã¥ã¡ã³ãã衚瀺ãããŸã (<a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>ã«ãã£ãŠæäŸ):
+å
ã»ã©ãšã¯ç°ãªããèªåçæããã察話çAPIããã¥ã¡ã³ãã衚瀺ãããŸãïŒ[ReDoc](https://github.com/Rebilly/ReDoc)ã«ãã£ãŠæäŸïŒ:

#### APIãã¹ããŒãã { #api-schema }
-ããã§ã¯ã<a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a>ã¯APIã®ã¹ããŒãå®çŸ©ã®æ¹æ³ãèŠå®ãã仿§ã§ãã
+ããã§ã¯ã[OpenAPI](https://github.com/OAI/OpenAPI-Specification)ã¯APIã®ã¹ããŒãå®çŸ©ã®æ¹æ³ãèŠå®ãã仿§ã§ãã
ãã®ã¹ããŒãå®çŸ©ã¯APIãã¹ãåãåãå¯èœãªãã©ã¡ãŒã¿ãªã©ãå«ãŸããŸãã
çŽ ã®OpenAPIã¹ããŒããã©ã®ãããªãã®ãèå³ãããå ŽåãFastAPIã¯ãã¹ãŠã®APIã®èª¬æãå«ãJSONïŒã¹ããŒãïŒãèªåçã«çæããŸãã
-次ã®å Žæã§çŽæ¥ç¢ºèªã§ããŸã: <a href="http://127.0.0.1:8000/openapi.json" class="external-link" target="_blank">http://127.0.0.1:8000/openapi.json</a>.
+次ã®å Žæã§çŽæ¥ç¢ºèªã§ããŸã: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json).
次ã®ãããªJSONã衚瀺ãããŸãã
ãŸããAPIãšéä¿¡ããã¯ã©ã€ã¢ã³ãçšã®ã³ãŒããèªåçã«çæããããã«äœ¿çšããããšãã§ããŸããããšãã°ãããã³ããšã³ããã¢ãã€ã«ããŸãã¯IoTã¢ããªã±ãŒã·ã§ã³ã§ãã
+### `pyproject.toml`ã§ã¢ããªã®`entrypoint`ãèšå® { #configure-the-app-entrypoint-in-pyproject-toml }
+
+`pyproject.toml`ã§ã¢ããªã®å Žæãæ¬¡ã®ããã«èšå®ã§ããŸã:
+
+```toml
+[tool.fastapi]
+entrypoint = "main:app"
+```
+
+ãã®`entrypoint`ã¯ã`fastapi`ã³ãã³ãã«å¯ŸããŠã次ã®ããã«ã¢ããªãã€ã³ããŒããã¹ãã§ããããšãäŒããŸã:
+
+```python
+from main import app
+```
+
+ããã³ãŒãæ§æãæ¬¡ã®ããã«ãªã£ãŠããå Žå:
+
+```
+.
+âââ backend
+â  âââ main.py
+â  âââ __init__.py
+```
+
+ãã®ãšãã¯`entrypoint`ãæ¬¡ã®ããã«èšå®ããŸã:
+
+```toml
+[tool.fastapi]
+entrypoint = "backend.main:app"
+```
+
+ããã¯æ¬¡ãšåçã§ã:
+
+```python
+from backend.main import app
+```
+
+### ãã¹ä»ãã®`fastapi dev` { #fastapi-dev-with-path }
+
+`fastapi dev`ã³ãã³ãã«ãã¡ã€ã«ãã¹ãæž¡ãããšãã§ãã䜿çšãã¹ãFastAPIã®appãªããžã§ã¯ããæšæž¬ããŸã:
+
+```console
+$ fastapi dev main.py
+```
+
+ãã ãããã®å Žåã¯æ¯å`fastapi`ã³ãã³ããåŒã¶ãã³ã«æ£ãããã¹ãæž¡ãããšãèŠããŠããå¿
èŠããããŸãã
+
+ããã«ãä»ã®ããŒã«ïŒããšãã°ã[VS Code æ¡åŒµæ©èœ](../editor-support.md)ã[FastAPI Cloud](https://fastapicloud.com)ïŒãèŠã€ããããªãå ŽåããããŸãããã®ããã`pyproject.toml`ã®`entrypoint`ã䜿ãããšãæšå¥šããŸãã
+
### ã¢ããªããããã€ïŒä»»æïŒ { #deploy-your-app-optional }
-ä»»æã§FastAPIã¢ããªã<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>ã«ãããã€ã§ããŸãããŸã ãªããåŸ
æ©ãªã¹ãã«ç»é²ããŠãã ããã ð
+ä»»æã§FastAPIã¢ããªã[FastAPI Cloud](https://fastapicloud.com)ã«ãããã€ã§ããŸãããŸã ãªããåŸ
æ©ãªã¹ãã«ç»é²ããŠãã ããã ð
ãã§ã«**FastAPI Cloud**ã¢ã«ãŠã³ããããå ŽåïŒåŸ
æ©ãªã¹ãããæåŸ
æžã¿ã®å ŽåðïŒã1ã³ãã³ãã§ã¢ããªã±ãŒã·ã§ã³ããããã€ã§ããŸãã
`FastAPI`ã¯`Starlette`ãçŽæ¥ç¶æ¿ããã¯ã©ã¹ã§ãã
-`FastAPI`ã§ã<a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a>ã®ãã¹ãŠã®æ©èœãå©çšå¯èœã§ãã
+`FastAPI`ã§ã[Starlette](https://www.starlette.dev/)ã®ãã¹ãŠã®æ©èœãå©çšå¯èœã§ãã
///
* ãã¹ `/`
* <dfn title="HTTP GET ã¡ãœãã"><code>get</code> ãªãã¬ãŒã·ã§ã³</dfn>
-/// info | `@decorator` Info
+/// info | `@decorator` æ
å ±
Pythonã«ããã`@something`ã·ã³ã¿ãã¯ã¹ã¯ãã³ã¬ãŒã¿ãšåŒã°ããŸãã
/// note | åè
-éããåãããªãå Žåã¯ã[Async: *"æ¥ãã§ããŸããïŒ"*](../async.md#in-a-hurry){.internal-link target=_blank}ã確èªããŠãã ããã
+éããåãããªãå Žåã¯ã[Async: *ãæ¥ãã§ããŸããïŒã*](../async.md#in-a-hurry)ã確èªããŠãã ããã
///
### Step 6: ãããã€ãã { #step-6-deploy-it }
-**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>**ã«1ã³ãã³ãã§ã¢ããªããããã€ããŸã: `fastapi deploy`. ð
+**[FastAPI Cloud](https://fastapicloud.com)**ã«1ã³ãã³ãã§ã¢ããªããããã€ããŸã: `fastapi deploy`. ð
#### FastAPI Cloudã«ã€ã㊠{ #about-fastapi-cloud }
-**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>**ã¯ã**FastAPI**ã®äœè
ãšãã®ããŒã ã«ãã£ãŠéçºãããŠããŸãã
+**[FastAPI Cloud](https://fastapicloud.com)**ã¯ã**FastAPI**ã®äœè
ãšãã®ããŒã ã«ãã£ãŠéçºãããŠããŸãã
æå°éã®åŽåã§APIã®**æ§ç¯**ã**ãããã€**ã**ã¢ã¯ã»ã¹**ãè¡ãããã»ã¹ãåçåããŸãã
## ã«ã¹ã¿ã äŸå€ãã³ãã©ã®ã€ã³ã¹ããŒã« { #install-custom-exception-handlers }
-ã«ã¹ã¿ã äŸå€ãã³ãã©ã¯<a href="https://www.starlette.dev/exceptions/" class="external-link" target="_blank">StarletteãšåãäŸå€ãŠãŒãã£ãªãã£</a>ã䜿çšããŠè¿œå ããããšãã§ããŸãã
+ã«ã¹ã¿ã äŸå€ãã³ãã©ã¯[StarletteãšåãäŸå€ãŠãŒãã£ãªãã£](https://www.starlette.dev/exceptions/)ã䜿çšããŠè¿œå ããããšãã§ããŸãã
ããªãïŒãŸãã¯äœ¿çšããŠããã©ã€ãã©ãªïŒã`raise`ãããããããªãã«ã¹ã¿ã äŸå€`UnicornException`ããããšããŸãããã
<div class="termy">
```console
-$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u>
+$ <font color="#4E9A06">fastapi</font> dev
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server ð
æåã®ã¹ãããã¯ãFastAPIã®ã€ã³ã¹ããŒã«ã§ãã
-[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank} ãäœæããŠæå¹åãããããã **FastAPIãã€ã³ã¹ããŒã«** ããŠãã ãã:
+[ä»®æ³ç°å¢](../virtual-environments.md) ãäœæããŠæå¹åãããããã **FastAPIãã€ã³ã¹ããŒã«** ããŠãã ãã:
<div class="termy">
/// note | åè
-`pip install "fastapi[standard]"` ã§ã€ã³ã¹ããŒã«ãããšã`fastapi-cloud-cli` ãå«ãããã€ãã®ããã©ã«ãã®ãªãã·ã§ã³æšæºäŸåé¢ä¿ãä»å±ããŸããããã«ããã<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a> ã«ãããã€ã§ããŸãã
+`pip install "fastapi[standard]"` ã§ã€ã³ã¹ããŒã«ãããšã`fastapi-cloud-cli` ãå«ãããã€ãã®ããã©ã«ãã®ãªãã·ã§ã³æšæºäŸåé¢ä¿ãä»å±ããŸããããã«ããã[FastAPI Cloud](https://fastapicloud.com) ã«ãããã€ã§ããŸãã
ãããã®ãªãã·ã§ã³äŸåé¢ä¿ãäžèŠãªå Žåã¯ã代ããã« `pip install fastapi` ãã€ã³ã¹ããŒã«ã§ããŸãã
///
+/// tip | è±ç¥è
+
+FastAPI ã«ã¯ [VS Code ã®å
¬åŒæ¡åŒµæ©èœ](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode)ïŒããã³ CursorïŒããããŸããpath operation ãšã¯ã¹ãããŒã©ãŒãpath operation æ€çŽ¢ããã¹ãå
ã® CodeLens ããã²ãŒã·ã§ã³ïŒãã¹ãããå®çŸ©ãžãžã£ã³ãïŒããã㊠FastAPI Cloud ãžã®ãããã€ããã°ãªã©ãããŸããŸãªæ©èœããšãã£ã¿ãŒããå©çšã§ããŸãã
+
+///
+
## é«åºŠãªãŠãŒã¶ãŒã¬ã€ã { #advanced-user-guide }
ãã® **ãã¥ãŒããªã¢ã« - ãŠãŒã¶ãŒã¬ã€ã** ã®åŸã§ãåŸããèªãã **é«åºŠãªãŠãŒã¶ãŒã¬ã€ã** ããããŸãã
| `version` | `string` | APIã®ããŒãžã§ã³ã§ããããã¯OpenAPIã®ããŒãžã§ã³ã§ã¯ãªããããªãèªèº«ã®ã¢ããªã±ãŒã·ã§ã³ã®ããŒãžã§ã³ã§ããããšãã° `2.5.0` ã§ãã |
| `terms_of_service` | `str` | APIã®å©çšèŠçŽãžã®URLã§ããæå®ããå ŽåãURLã§ããå¿
èŠããããŸãã |
| `contact` | `dict` | å
¬éãããAPIã®é£çµ¡å
æ
å ±ã§ããè€æ°ã®ãã£ãŒã«ããå«ããããŸãã <details><summary><code>contact</code> fields</summary><table><thead><tr><th>Parameter</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td>é£çµ¡å
ã®å人/çµç¹ãèå¥ããååã§ãã</td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>é£çµ¡å
æ
å ±ãæãURLã§ããURL圢åŒã§ããå¿
èŠããããŸãã</td></tr><tr><td><code>email</code></td><td><code>str</code></td><td>é£çµ¡å
ã®å人/çµç¹ã®ã¡ãŒã«ã¢ãã¬ã¹ã§ããã¡ãŒã«ã¢ãã¬ã¹åœ¢åŒã§ããå¿
èŠããããŸãã</td></tr></tbody></table></details> |
-| `license_info` | `dict` | å
¬éãããAPIã®ã©ã€ã»ã³ã¹æ
å ±ã§ããè€æ°ã®ãã£ãŒã«ããå«ããããŸãã <details><summary><code>license_info</code> fields</summary><table><thead><tr><th>Parameter</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td><strong>å¿
é </strong>ïŒ<code>license_info</code> ãèšå®ãããŠããå ŽåïŒãAPIã«äœ¿çšãããã©ã€ã»ã³ã¹åã§ãã</td></tr><tr><td><code>identifier</code></td><td><code>str</code></td><td>APIã® <a href="https://spdx.org/licenses/" class="external-link" target="_blank">SPDX</a> ã©ã€ã»ã³ã¹åŒã§ãã<code>identifier</code> ãã£ãŒã«ã㯠<code>url</code> ãã£ãŒã«ããšåæã«æå®ã§ããŸããã <small>OpenAPI 3.1.0ãFastAPI 0.99.0 以éã§å©çšã§ããŸãã</small></td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>APIã«äœ¿çšãããã©ã€ã»ã³ã¹ãžã®URLã§ããURL圢åŒã§ããå¿
èŠããããŸãã</td></tr></tbody></table></details> |
+| `license_info` | `dict` | å
¬éãããAPIã®ã©ã€ã»ã³ã¹æ
å ±ã§ããè€æ°ã®ãã£ãŒã«ããå«ããããŸãã <details><summary><code>license_info</code> fields</summary><table><thead><tr><th>Parameter</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td><strong>å¿
é </strong>ïŒ<code>license_info</code> ãèšå®ãããŠããå ŽåïŒãAPIã«äœ¿çšãããã©ã€ã»ã³ã¹åã§ãã</td></tr><tr><td><code>identifier</code></td><td><code>str</code></td><td>APIã® [SPDX](https://spdx.org/licenses/) ã©ã€ã»ã³ã¹åŒã§ãã<code>identifier</code> ãã£ãŒã«ã㯠<code>url</code> ãã£ãŒã«ããšåæã«æå®ã§ããŸããã <small>OpenAPI 3.1.0ãFastAPI 0.99.0 以éã§å©çšã§ããŸãã</small></td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>APIã«äœ¿çšãããã©ã€ã»ã³ã¹ãžã®URLã§ããURL圢åŒã§ããå¿
èŠããããŸãã</td></tr></tbody></table></details> |
以äžã®ããã«èšå®ã§ããŸã:
/// info | æ
å ±
-ã¿ã°ã®è©³çŽ°ã¯ [Path Operation Configuration](path-operation-configuration.md#tags){.internal-link target=_blank} ãåç
§ããŠãã ããã
+ã¿ã°ã®è©³çŽ°ã¯ [Path Operation ã®èšå®](path-operation-configuration.md#tags) ãåç
§ããŠãã ããã
///
`yield` ã䜿ã£ãäŸåé¢ä¿ããã€å Žåã¯ãçµäºã³ãŒãã¯ããã«ãŠã§ã¢ã® *åŸã«* å®è¡ãããŸãã
-ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ ([ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯](background-tasks.md){.internal-link target=_blank} ã»ã¯ã·ã§ã³ã§èª¬æããŸããåŸã§ç¢ºèªã§ããŸã) ãããå Žåã¯ããããã¯å
šãŠã®ããã«ãŠã§ã¢ã® *åŸã«* å®è¡ãããŸãã
+ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ ([ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯](background-tasks.md) ã»ã¯ã·ã§ã³ã§èª¬æããŸããåŸã§ç¢ºèªã§ããŸã) ãããå Žåã¯ããããã¯å
šãŠã®ããã«ãŠã§ã¢ã® *åŸã«* å®è¡ãããŸãã
///
/// tip | è±ç¥è
-ã«ã¹ã¿ã ã®ç¬èªããããŒã¯ <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">`X-` ãã¬ãã£ãã¯ã¹ã䜿çš</a>ããŠè¿œå ã§ããç¹ã«æ³šæããŠãã ããã
+ã«ã¹ã¿ã ã®ç¬èªããããŒã¯ [`X-` ãã¬ãã£ãã¯ã¹ã䜿çš](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)ããŠè¿œå ã§ããç¹ã«æ³šæããŠãã ããã
-ãã ãããã©ãŠã¶ã®ã¯ã©ã€ã¢ã³ãã«è¡šç€ºããããã«ã¹ã¿ã ããããŒãããå Žåã¯ã<a href="https://www.starlette.dev/middleware/#corsmiddleware" class="external-link" target="_blank">Starletteã®CORSããã¥ã¡ã³ã</a>ã«èšèŒãããŠãããã©ã¡ãŒã¿ `expose_headers` ã䜿çšããŠãããããCORSèšå®ã«è¿œå ããå¿
èŠããããŸã ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank})ã
+ãã ãããã©ãŠã¶ã®ã¯ã©ã€ã¢ã³ãã«è¡šç€ºããããã«ã¹ã¿ã ããããŒãããå Žåã¯ã[CORS (Cross-Origin Resource Sharing)](cors.md) ã®èšå®ã«ã[Starletteã®CORSããã¥ã¡ã³ã](https://www.starlette.dev/middleware/#corsmiddleware)ã«èšèŒãããŠãããã©ã¡ãŒã¿ `expose_headers` ã䜿çšããŠããããã远å ããå¿
èŠããããŸãã
///
/// tip | è±ç¥è
-ããã§ã¯ããããã®ãŠãŒã¹ã±ãŒã¹ã«å¯ŸããŠããæ£ç¢ºã«ãªãåŸãããã`time.time()` ã®ä»£ããã« <a href="https://docs.python.org/3/library/time.html#time.perf_counter" class="external-link" target="_blank">`time.perf_counter()`</a> ã䜿çšããŠããŸãã ð€
+ããã§ã¯ããããã®ãŠãŒã¹ã±ãŒã¹ã«å¯ŸããŠããæ£ç¢ºã«ãªãåŸãããã`time.time()` ã®ä»£ããã« [`time.perf_counter()`](https://docs.python.org/3/library/time.html#time.perf_counter) ã䜿çšããŠããŸãã ð€
///
## ãã®ä»ã®ããã«ãŠã§ã¢ { #other-middlewares }
-ä»ã®ããã«ãŠã§ã¢ã®è©³çްã«ã€ããŠã¯ã[é«åºŠãªãŠãŒã¶ãŒã¬ã€ã: é«åºŠãªããã«ãŠã§ã¢](../advanced/middleware.md){.internal-link target=_blank}ãåç
§ããŠãã ããã
+ä»ã®ããã«ãŠã§ã¢ã®è©³çްã«ã€ããŠã¯ã[é«åºŠãªãŠãŒã¶ãŒã¬ã€ã: é«åºŠãªããã«ãŠã§ã¢](../advanced/middleware.md)ãåç
§ããŠãã ããã
次ã®ã»ã¯ã·ã§ã³ã§ã¯ãããã«ãŠã§ã¢ã䜿çšã㊠<abbr title="Cross-Origin Resource Sharing - ã¯ãã¹ãªãªãžã³ãªãœãŒã¹å
±æ">CORS</abbr> ãåŠçããæ¹æ³ã«ã€ããŠèª¬æããŸãã
説ææã¯é·ããŠè€æ°è¡ã«ããã¶åŸåãããã®ã§ã颿°<dfn title="颿°å
ã®æåã®åŒïŒã©ã®å€æ°ã«ã代å
¥ãããªãïŒãšããŠèšè¿°ããããããã¥ã¡ã³ãçšã®è€æ°è¡ã®æåå">docstring</dfn>å
ã«*path operation*ã®èª¬ææã宣èšã§ããŸãããããšã**FastAPI** ã¯èª¬ææãèªã¿èŸŒãã§ãããŸãã
-docstringã«<a href="https://en.wikipedia.org/wiki/Markdown" class="external-link" target="_blank">Markdown</a>ãèšè¿°ããã°ãæ£ããè§£éãããŠè¡šç€ºãããŸããïŒdocstringã®ã€ã³ãã³ããèæ
®ããŠïŒ
+docstringã«[Markdown](https://en.wikipedia.org/wiki/Markdown)ãèšè¿°ããã°ãæ£ããè§£éãããŠè¡šç€ºãããŸããïŒdocstringã®ã€ã³ãã³ããèæ
®ããŠïŒ
{* ../../docs_src/path_operation_configuration/tutorial004_py310.py hl[17:25] *}
å€ãããŒãžã§ã³ã®å Žåã`Annotated`ã䜿ãããšãããšãšã©ãŒã«ãªããŸãã
-`Annotated`ã䜿çšããåã«ãFastAPI ã®ããŒãžã§ã³ãå°ãªããšã 0.95.1 ãŸã§[ã¢ããã°ã¬ãŒãããŠãã ãã](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank}ã
+`Annotated`ã䜿çšããåã«ãFastAPI ã®ããŒãžã§ã³ãå°ãªããšã 0.95.1 ãŸã§[ã¢ããã°ã¬ãŒãããŠãã ãã](../deployment/versions.md#upgrading-the-fastapi-versions)ã
///
## ãŸãšã { #recap }
-`Query`ãš`Path`ïŒãããŠãŸã èŠãããšãªãä»ã®ãã®ïŒã§ã¯ã[ã¯ãšãªãã©ã¡ãŒã¿ãšæååã®æ€èšŒ](query-params-str-validations.md){.internal-link target=_blank}ãšåãããã«ã¡ã¿ããŒã¿ãšæååã®æ€èšŒã宣èšããããšãã§ããŸãã
+`Query`ãš`Path`ïŒãããŠãŸã èŠãããšãªãä»ã®ãã®ïŒã§ã¯ã[ã¯ãšãªãã©ã¡ãŒã¿ãšæååã®æ€èšŒ](query-params-str-validations.md)ãšåãããã«ã¡ã¿ããŒã¿ãšæååã®æ€èšŒã宣èšããããšãã§ããŸãã
ãŸããæ°å€ã®ããªããŒã·ã§ã³ã宣èšããããšãã§ããŸã:
ãã¹ãã©ã¡ãŒã¿ `item_id` ã®å€ã¯ãåŒæ° `item_id` ãšããŠé¢æ°ã«æž¡ãããŸãã
-ãããã£ãŠããã®äŸãå®è¡ã㊠<a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a> ã«ã¢ã¯ã»ã¹ãããšã次ã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸãã
+ãããã£ãŠããã®äŸãå®è¡ã㊠[http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo) ã«ã¢ã¯ã»ã¹ãããšã次ã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸãã
```JSON
{"item_id":"foo"}
## ããŒã¿<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> ãéããšã次ã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸã:
+ãã®äŸãå®è¡ãããã©ãŠã¶ã§ [http://127.0.0.1:8000/items/3](http://127.0.0.1:8000/items/3) ãéããšã次ã®ã¬ã¹ãã³ã¹ã衚瀺ãããŸã:
```JSON
{"item_id":3}
## ããŒã¿ããªããŒã·ã§ã³ { #data-validation }
-ããããã©ãŠã¶ã§ <a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a> ãéããšã次ã®HTTPãšã©ãŒã衚瀺ãããŸã:
+ããããã©ãŠã¶ã§ [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo) ãéããšã次ã®HTTPãšã©ãŒã衚瀺ãããŸã:
```JSON
{
ããã¯ããã¹ãã©ã¡ãŒã¿ `item_id` ã `int` ã§ã¯ãªãå€ `"foo"` ã ããã§ãã
-<a href="http://127.0.0.1:8000/items/4.2" class="external-link" target="_blank">http://127.0.0.1:8000/items/4.2</a> ã§èŠãããããã«ã`int` ã®ãããã« `float` ãäžããããå Žåã«ãåæ§ãªãšã©ãŒã衚瀺ãããŸãã
+[http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2) ã§èŠãããããã«ã`int` ã®ãããã« `float` ãäžããããå Žåã«ãåæ§ãªãšã©ãŒã衚瀺ãããŸãã
/// check | 確èª
## ããã¥ã¡ã³ã { #documentation }
-ãããŠãã©ãŠã¶ã§ <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> ãéããšã以äžã®æ§ãªèªåçã«çæããã察話çãªAPIããã¥ã¡ã³ãã衚瀺ãããŸãã
+ãããŠãã©ãŠã¶ã§ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) ãéããšã以äžã®æ§ãªèªåçã«çæããã察話çãªAPIããã¥ã¡ã³ãã衚瀺ãããŸãã
<img src="/img/tutorial/path-params/image01.png">
## æšæºããŒã¹ã®ã¡ãªãããããã¥ã¡ã³ããŒã·ã§ã³ã®ä»£æ¿ç© { #standards-based-benefits-alternative-documentation }
-ãŸããçæãããã¹ããŒãã <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md" class="external-link" target="_blank">OpenAPI</a> æšæºã«åŸã£ãŠããã®ã§ãäºææ§ã®ããããŒã«ã倿°ãããŸãã
+ãŸããçæãããã¹ããŒãã [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md) æšæºã«åŸã£ãŠããã®ã§ãäºææ§ã®ããããŒã«ã倿°ãããŸãã
-ãã®ããã**FastAPI**èªäœã代æ¿ã®APIããã¥ã¡ã³ããæäŸããŸãïŒReDocã䜿çšïŒãããã¯ã <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a> ã«ã¢ã¯ã»ã¹ãããšç¢ºèªã§ããŸãã
+ãã®ããã**FastAPI**èªäœã代æ¿ã®APIããã¥ã¡ã³ããæäŸããŸãïŒReDocã䜿çšïŒãããã¯ã [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) ã«ã¢ã¯ã»ã¹ãããšç¢ºèªã§ããŸãã
<img src="/img/tutorial/path-params/image02.png">
## Pydantic { #pydantic }
-ãã¹ãŠã®ããŒã¿ããªããŒã·ã§ã³ã¯ <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> ã«ãã£ãŠå
éšã§å®è¡ããããããPydanticã®å
šãŠã®ã¡ãªãããåŸãããŸãããããŠãå®å¿ããŠå©çšããããšãã§ããŸãã
+ãã¹ãŠã®ããŒã¿ããªããŒã·ã§ã³ã¯ [Pydantic](https://docs.pydantic.dev/) ã«ãã£ãŠå
éšã§å®è¡ããããããPydanticã®å
šãŠã®ã¡ãªãããåŸãããŸãããããŠãå®å¿ããŠå©çšããããšãã§ããŸãã
`str`ã `float` ã `bool` ããã³ä»ã®å€ãã®è€éãªããŒã¿åãå宣èšã«äœ¿çšã§ããŸãã
å€ãããŒãžã§ã³ã®å Žåã`Annotated` ã䜿ãããšãããšãšã©ãŒã«ãªããŸãã
-`Annotated` ã䜿ãåã«ãFastAPI ã®ããŒãžã§ã³ãå°ãªããšã 0.95.1 ã«ããããã«ã[FastAPI ã®ããŒãžã§ã³ãã¢ããã°ã¬ãŒã](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank}ããŠãã ããã
+`Annotated` ã䜿ãåã«ãFastAPI ã®ããŒãžã§ã³ãå°ãªããšã 0.95.1 ã«ããããã«ã[FastAPI ã®ããŒãžã§ã³ãã¢ããã°ã¬ãŒã](../deployment/versions.md#upgrading-the-fastapi-versions)ããŠãã ããã
///
## `q` ãã©ã¡ãŒã¿ã®åã§ `Annotated` ã䜿ã { #use-annotated-in-the-type-for-the-q-parameter }
-以åã[Python Types Intro](../python-types.md#type-hints-with-metadata-annotations){.internal-link target=_blank} ã§ `Annotated` ã䜿ã£ãŠãã©ã¡ãŒã¿ã«ã¡ã¿ããŒã¿ã远å ã§ãããšèª¬æããããšãèŠããŠããŸããïŒ
+以åã[Python Types Intro](../python-types.md#type-hints-with-metadata-annotations) ã§ `Annotated` ã䜿ã£ãŠãã©ã¡ãŒã¿ã«ã¡ã¿ããŒã¿ã远å ã§ãããšèª¬æããããšãèŠããŠããŸããïŒ
ãããã FastAPI ã§äœ¿ããšãã§ãã ð
`Annotated` ã䜿ããã« **ïŒå€ãïŒããã©ã«ãå€ã¹ã¿ã€ã«** ã䜿ãå ŽåãFastAPI ãªãã§ãã®é¢æ°ã **å¥ã®å Žæ** ã§åŒã³åºããšããæ£ããåããããã«é¢æ°ãžåŒæ°ãæž¡ãããšã **èŠããŠãã** å¿
èŠããããŸããããããªããšå€ãæåŸ
ãšç°ãªããŸãïŒäŸãã° `str` ã®ä»£ããã« `QueryInfo` ããããã«é¡ãããã®ã«ãªããŸãïŒããŸãããšãã£ã¿ãŒãèŠåãããPython ããã®é¢æ°ã®å®è¡ã§æå¥ãèšããŸãããå
éšã®åŠçããšã©ãŒã«ãªããšãã«åããŠåé¡ãåºãŸãã
-`Annotated` ã¯è€æ°ã®ã¡ã¿ããŒã¿ã¢ãããŒã·ã§ã³ãæãŠãã®ã§ã<a href="https://typer.tiangolo.com/" class="external-link" target="_blank">Typer</a> ã®ãããªå¥ããŒã«ãšåã颿°ã䜿ãããšãã§ããŸãã ð
+`Annotated` ã¯è€æ°ã®ã¡ã¿ããŒã¿ã¢ãããŒã·ã§ã³ãæãŠãã®ã§ã[Typer](https://typer.tiangolo.com/) ã®ãããªå¥ããŒã«ãšåã颿°ã䜿ãããšãã§ããŸãã ð
## ããªããŒã·ã§ã³ãããã«è¿œå ãã { #add-more-validations }
ããŠããã®ãã©ã¡ãŒã¿ãæ°ã«å
¥ããªããªã£ããšããŸãããã
-ããã䜿ã£ãŠããã¯ã©ã€ã¢ã³ããããã®ã§ããã°ããã¯æ®ããŠããå¿
èŠããããŸãããããã¥ã¡ã³ãã«ã¯<abbr title="obsolete, recommended not to use it - 廿¢äºå®ã䜿çšã¯æšå¥šãããŸãã">deprecated</abbr>ãšæèšããŠããããã§ãã
+ããã䜿ã£ãŠããã¯ã©ã€ã¢ã³ããããã®ã§ããã°ããã¯æ®ããŠããå¿
èŠããããŸãããããã¥ã¡ã³ãã«ã¯<dfn title="廿¢äºå®ã䜿çšã¯æšå¥šãããŸãã">廿¢äºå®</dfn>ãšæèšããŠããããã§ãã
ãã®å Žåã`Query`ã«ãã©ã¡ãŒã¿`deprecated=True`ãæž¡ããŸã:
ãã®å Žåãéåžžã®ããªããŒã·ã§ã³ïŒäŸ: å€ã `str` ã§ããããšã®æ€èšŒïŒã®åŸã«é©çšããã **ã«ã¹ã¿ã ããªããŒã¿é¢æ°** ã䜿ããŸãã
-ãããè¡ãã«ã¯ã`Annotated` ã®äžã§ <a href="https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator" class="external-link" target="_blank">Pydantic ã® `AfterValidator`</a> ã䜿ããŸãã
+ãããè¡ãã«ã¯ã`Annotated` ã®äžã§ [Pydantic ã® `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) ã䜿ããŸãã
/// tip | è±ç¥è
-Pydantic ã«ã¯ <a href="https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator" class="external-link" target="_blank">`BeforeValidator`</a> ãªã©ããããŸãã ð€
+Pydantic ã«ã¯ [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator) ãªã©ããããŸãã ð€
///
/// tip | è±ç¥è
-[ãã¹ãã©ã¡ãŒã¿](path-params.md#predefined-values){.internal-link target=_blank}ãšåæ§ã« `Enum` ã䜿çšã§ããŸãã
+[ãã¹ãã©ã¡ãŒã¿](path-params.md#predefined-values)ãšåæ§ã« `Enum` ã䜿çšã§ããŸãã
///
/// info | æ
å ±
-ã¢ããããŒãããããã¡ã€ã«ãåãåãã«ã¯ããŸã <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a> ãã€ã³ã¹ããŒã«ããŸãã
+ã¢ããããŒãããããã¡ã€ã«ãåãåãã«ã¯ããŸã [`python-multipart`](https://github.com/Kludex/python-multipart) ãã€ã³ã¹ããŒã«ããŸãã
-[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank}ãäœæããŠæå¹åããæ¬¡ã®ããã«ã€ã³ã¹ããŒã«ããŠãã ãã:
+[ä»®æ³ç°å¢](../virtual-environments.md)ãäœæããŠæå¹åããæ¬¡ã®ããã«ã€ã³ã¹ããŒã«ããŠãã ãã:
```console
$ pip install python-multipart
- æå€§ãµã€ãºãŸã§ã¯ã¡ã¢ãªã«ä¿æãããããè¶
ãããšãã£ã¹ã¯ã«æ ŒçŽããããã¡ã€ã«ã§ãã
- ãã®ãããç»åã»åç»ã»å€§ããªãã€ããªãªã©ã®å€§ããªãã¡ã€ã«ã§ããã¡ã¢ãªã䜿ãæããããšãªãããŸãåäœããŸãã
- ã¢ããããŒãããããã¡ã€ã«ããã¡ã¿ããŒã¿ãååŸã§ããŸãã
-- <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 ãªããžã§ã¯ããæåŸ
ããä»ã®ã©ã€ãã©ãªã«ãã®ãŸãŸæž¡ããŸãã
+- [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) 㪠`async` ã€ã³ã¿ãŒãã§ãŒã¹ãæã¡ãŸãã
+- å®éã® Python ã® [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) ãªããžã§ã¯ããå
¬éããŠãããfile-like ãªããžã§ã¯ããæåŸ
ããä»ã®ã©ã€ãã©ãªã«ãã®ãŸãŸæž¡ããŸãã
### `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ããªããžã§ã¯ããæåŸ
ãã颿°ãã©ã€ãã©ãªã«çŽæ¥æž¡ããŸãã
+- `file`: [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile)ïŒ[file-like](https://docs.python.org/3/glossary.html#term-file-like-object) ãªãªããžã§ã¯ãïŒãããã¯å®éã® Python ã®ãã¡ã€ã«ãªããžã§ã¯ãã§ããfile-likeããªããžã§ã¯ããæåŸ
ãã颿°ãã©ã€ãã©ãªã«çŽæ¥æž¡ããŸãã
`UploadFile` ã«ã¯æ¬¡ã® `async` ã¡ãœããããããŸããããããå
éšã§å¯Ÿå¿ãããã¡ã€ã«ã¡ãœããïŒå
éšã® `SpooledTemporaryFile`ïŒãåŒã³åºããŸãã
ãã ããã©ãŒã ã«ãã¡ã€ã«ãå«ãŸããå Žåã¯ã`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> ãåç
§ããŠãã ããã
+ãããã®ãšã³ã³ãŒãã£ã³ã°ããã©ãŒã ãã£ãŒã«ãã®è©³çްã¯ã[<abbr title="Mozilla Developer Network - Mozilla éçºè
ãããã¯ãŒã¯">MDN</abbr> Web Docs ã® `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) ãåç
§ããŠãã ããã
///
# ãã©ãŒã ã¢ãã« { #form-models }
-FastAPI ã§ã¯ããã©ãŒã ãã£ãŒã«ãã宣èšããããã« Pydantic ã¢ãã«ã䜿çšã§ããŸãã
+FastAPI ã§ã¯ããã©ãŒã ãã£ãŒã«ãã宣èšããããã« **Pydantic ã¢ãã«**ã䜿çšã§ããŸãã
/// info | æ
å ±
-ãã©ãŒã ã䜿ãã«ã¯ããŸã <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a> ãã€ã³ã¹ããŒã«ããŸãã
+ãã©ãŒã ã䜿ãã«ã¯ããŸã [`python-multipart`](https://github.com/Kludex/python-multipart) ãã€ã³ã¹ããŒã«ããŸãã
-ãŸã [ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank} ãäœæããŠæå¹åãããã®ããã§ã€ã³ã¹ããŒã«ããŠãã ãããäŸãã°:
+ãŸã [ä»®æ³ç°å¢](../virtual-environments.md) ãäœæããŠæå¹åãããã®ããã§ã€ã³ã¹ããŒã«ããŠãã ãããäŸãã°:
```console
$ pip install python-multipart
/// info | æ
å ±
-ã¢ããããŒãããããã¡ã€ã«ããã©ãŒã ããŒã¿ãåä¿¡ããã«ã¯ããŸã<a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>ãã€ã³ã¹ããŒã«ããŸãã
+ã¢ããããŒãããããã¡ã€ã«ããã©ãŒã ããŒã¿ãåä¿¡ããã«ã¯ããŸã[`python-multipart`](https://github.com/Kludex/python-multipart)ãã€ã³ã¹ããŒã«ããŸãã
-[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank}ãäœæãããããæå¹åããŠãããäŸãã°æ¬¡ã®ããã«ã€ã³ã¹ããŒã«ããŠãã ãã:
+[ä»®æ³ç°å¢](../virtual-environments.md)ãäœæãããããæå¹åããŠãããäŸãã°æ¬¡ã®ããã«ã€ã³ã¹ããŒã«ããŠãã ãã:
```console
$ pip install python-multipart
/// info | æ
å ±
-ãã©ãŒã ã䜿ãããã«ã¯ããŸã<a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>ãã€ã³ã¹ããŒã«ããŸãã
+ãã©ãŒã ã䜿ãããã«ã¯ããŸã[`python-multipart`](https://github.com/Kludex/python-multipart)ãã€ã³ã¹ããŒã«ããŸãã
-å¿
ã[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank}ãäœæããŠæå¹åããŠãããäŸãã°æ¬¡ã®ããã«ã€ã³ã¹ããŒã«ããŠãã ãã:
+å¿
ã[ä»®æ³ç°å¢](../virtual-environments.md)ãäœæããŠæå¹åããŠãããäŸãã°æ¬¡ã®ããã«ã€ã³ã¹ããŒã«ããŠãã ãã:
```console
$ pip install python-multipart
ãããããã©ãŒã ããã¡ã€ã«ãå«ãå Žåã¯ã`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 - Mozilla éçºè
ãããã¯ãŒã¯">MDN</abbr>ã®<code>POST</code></a>ã®ãŠã§ãããã¥ã¡ã³ããåç
§ããŠãã ããã
+ãããã®ãšã³ã³ãŒãã£ã³ã°ããã©ãŒã ãã£ãŒã«ãã®è©³çްã«ã€ããŠã¯ã[<abbr title="Mozilla Developer Network - Mozilla éçºè
ãããã¯ãŒã¯">MDN</abbr> ã® `POST` ãŠã§ãããã¥ã¡ã³ã](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST)ãåç
§ããŠãã ããã
///
* OpenAPIã® *path operation* ã«ãã¬ã¹ãã³ã¹çšã® **JSON Schema** ã远å ããŸãã
* ããã¯**èªåããã¥ã¡ã³ã**ã§äœ¿çšãããŸãã
* èªåã¯ã©ã€ã¢ã³ãã³ãŒãçæããŒã«ã§ã䜿çšãããŸãã
+* è¿åŽããŒã¿ã Pydantic ã䜿ã£ãŠJSONã«**ã·ãªã¢ã©ã€ãº**ããŸããPydantic ã¯å
éšã**Rust**ã§å®è£
ãããŠããããã**éåžžã«é«é**ã§ãã
ããããæãéèŠãªã®ã¯:
/// info | æ
å ±
-`EmailStr` ã䜿çšããã«ã¯ãæåã« <a href="https://github.com/JoshData/python-email-validator" class="external-link" target="_blank">`email-validator`</a> ãã€ã³ã¹ããŒã«ããŠãã ããã
+`EmailStr` ã䜿çšããã«ã¯ãæåã« [`email-validator`](https://github.com/JoshData/python-email-validator) ãã€ã³ã¹ããŒã«ããŠãã ããã
-[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank}ãäœæããŠæå¹åããŠãããäŸãã°æ¬¡ã®ããã«ã€ã³ã¹ããŒã«ããŠãã ãã:
+[ä»®æ³ç°å¢](../virtual-environments.md)ãäœæããŠæå¹åããŠãããäŸãã°æ¬¡ã®ããã«ã€ã³ã¹ããŒã«ããŠãã ãã:
```console
$ pip install email-validator
### ã¬ã¹ãã³ã¹ãçŽæ¥è¿ã { #return-a-response-directly }
-æãäžè¬çãªã±ãŒã¹ã¯ã[é«åºŠãªããã¥ã¡ã³ãã§åŸè¿°ãããResponseãçŽæ¥è¿ãã](../advanced/response-directly.md){.internal-link target=_blank}å Žåã§ãã
+æãäžè¬çãªã±ãŒã¹ã¯ã[é«åºŠãªããã¥ã¡ã³ãã§åŸè¿°ãããResponseãçŽæ¥è¿ãã](../advanced/response-directly.md)å Žåã§ãã
{* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *}
* `response_model_exclude_defaults=True`
* `response_model_exclude_none=True`
-`exclude_defaults` ãš `exclude_none` ã«ã€ããŠã¯ã<a href="https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict" class="external-link" target="_blank">Pydanticã®ããã¥ã¡ã³ã</a>ã§èª¬æãããŠããéãã§ãã
+`exclude_defaults` ãš `exclude_none` ã«ã€ããŠã¯ã[Pydanticã®ããã¥ã¡ã³ã](https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict)ã§èª¬æãããŠããéãã§ãã
///
/// info | æ
å ±
-`status_code`ã¯ä»£ããã«ãPythonã®<a href="https://docs.python.org/3/library/http.html#http.HTTPStatus" class="external-link" target="_blank">`http.HTTPStatus`</a>ã®ããã«ã`IntEnum`ãåãåãããšãã§ããŸãã
+`status_code`ã¯ä»£ããã«ãPythonã®[`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus)ã®ããã«ã`IntEnum`ãåãåãããšãã§ããŸãã
///
/// tip | è±ç¥è
-ããããã®ã¹ããŒã¿ã¹ã³ãŒããšã©ã®ã³ãŒããäœã®ããã®ã³ãŒããªã®ãã«ã€ããŠè©³çްã¯<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status" class="external-link" target="_blank"><abbr title="Mozilla Developer Network">MDN</abbr> documentation about HTTP status codes</a>ãåç
§ããŠãã ããã
+ããããã®ã¹ããŒã¿ã¹ã³ãŒããšã©ã®ã³ãŒããäœã®ããã®ã³ãŒããªã®ãã«ã€ããŠã®è©³çްã¯ã[<abbr title="Mozilla Developer Network - Mozilla éçºè
ãããã¯ãŒã¯">MDN</abbr> ã®HTTPã¹ããŒã¿ã¹ã³ãŒãã«é¢ããããã¥ã¡ã³ã](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status)ãåç
§ããŠãã ããã
///
ãŸãã`from starlette import status`ã䜿ãããšãã§ããŸãã
-**FastAPI** ã¯ã`éçºè
ã®å©äŸ¿æ§ãèæ
®ããŠãfastapi.status`ãšåã`starlette.status`ãæäŸããŠããŸããããããããã¯StarletteããçŽæ¥æäŸãããŠããŸãã
+**FastAPI** ã¯ãéçºè
ã®å©äŸ¿æ§ãèæ
®ããŠãfastapi.statusãšåã`starlette.status`ãæäŸããŠããŸããããããããã¯StarletteããçŽæ¥æäŸãããŠããŸãã
///
## ããã©ã«ãã®å€æŽ { #changing-the-default }
-åŸã«ã[é«åºŠãªãŠãŒã¶ãŒã¬ã€ã](../advanced/response-change-status-code.md){.internal-link target=_blank}ã§ãããã§å®£èšããŠããããã©ã«ããšã¯ç°ãªãã¹ããŒã¿ã¹ã³ãŒããè¿ãæ¹æ³ãèŠãŠãããŸãã
+åŸã«ã[é«åºŠãªãŠãŒã¶ãŒã¬ã€ã](../advanced/response-change-status-code.md)ã§ãããã§å®£èšããŠããããã©ã«ããšã¯ç°ãªãã¹ããŒã¿ã¹ã³ãŒããè¿ãæ¹æ³ãèŠãŠãããŸãã
ãã®è¿œå æ
å ±ã¯ããã®ã¢ãã«ã®åºå**JSON Schema**ã«ãã®ãŸãŸè¿œå ãããAPIããã¥ã¡ã³ãã§äœ¿çšãããŸãã
-<a href="https://docs.pydantic.dev/latest/api/config/" class="external-link" target="_blank">Pydanticã®ããã¥ã¡ã³ã: Configuration</a>ã§èª¬æãããŠããããã«ã`dict`ãåãåã屿§`model_config`ã䜿çšã§ããŸãã
+[Pydanticã®ããã¥ã¡ã³ã: Configuration](https://docs.pydantic.dev/latest/api/config/)ã§èª¬æãããŠããããã«ã`dict`ãåãåã屿§`model_config`ã䜿çšã§ããŸãã
çæãããJSON Schemaã«è¡šç€ºããã远å ããŒã¿ïŒ`examples`ãå«ãïŒãå«ã`dict`ã䜿ã£ãŠã`"json_schema_extra"`ãèšå®ã§ããŸãã
OpenAPIã¯ã仿§ã®ä»ã®éšåã«ã`example`ãš`examples`ãã£ãŒã«ãã远å ããŸãã:
-* <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object" class="external-link" target="_blank">`Parameter Object`ïŒä»æ§å
ïŒ</a>ãFastAPIã®ä»¥äžã§äœ¿çšãããŸãã:
+* [`Parameter Object`ïŒä»æ§å
ïŒ](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object)ãFastAPIã®ä»¥äžã§äœ¿çšãããŸãã:
* `Path()`
* `Query()`
* `Header()`
* `Cookie()`
-* <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object" class="external-link" target="_blank">`Request Body Object`ã仿§å
ã®`Media Type Object`ã®`content`ãã£ãŒã«ãïŒä»æ§å
ïŒ</a>ãFastAPIã®ä»¥äžã§äœ¿çšãããŸãã:
+* [`Request Body Object`ã`Media Type Object`ã®`content`ãã£ãŒã«ãïŒä»æ§å
ïŒ](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object)ãFastAPIã®ä»¥äžã§äœ¿çšãããŸãã:
* `Body()`
* `File()`
* `Form()`
### JSON Schemaã®`examples`ãã£ãŒã«ã { #json-schemas-examples-field }
-ããããã®åŸãJSON Schemaã¯æ°ããããŒãžã§ã³ã®ä»æ§ã«<a href="https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5" class="external-link" target="_blank">`examples`</a>ãã£ãŒã«ãã远å ããŸããã
+ããããã®åŸãJSON Schemaã¯æ°ããããŒãžã§ã³ã®ä»æ§ã«[`examples`](https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5)ãã£ãŒã«ãã远å ããŸããã
ãããŠãæ°ããOpenAPI 3.1.0ã¯ããã®æ°ãããã£ãŒã«ã`examples`ãå«ãææ°ããŒãžã§ã³ïŒJSON Schema 2020-12ïŒã«åºã¥ãããã«ãªããŸããã
/// info | æ
å ±
-<a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a> ããã±ãŒãžã¯ã`pip install "fastapi[standard]"` ã³ãã³ããå®è¡ãããš **FastAPI** ãšäžç·ã«èªåçã«ã€ã³ã¹ããŒã«ãããŸãã
+[`python-multipart`](https://github.com/Kludex/python-multipart) ããã±ãŒãžã¯ã`pip install "fastapi[standard]"` ã³ãã³ããå®è¡ãããš **FastAPI** ãšäžç·ã«èªåçã«ã€ã³ã¹ããŒã«ãããŸãã
ãããã`pip install fastapi` ã³ãã³ãã䜿çšããå Žåã`python-multipart` ããã±ãŒãžã¯ããã©ã«ãã§ã¯å«ãŸããŸããã
-æåã§ã€ã³ã¹ããŒã«ããã«ã¯ã[ä»®æ³ç°å¢](../../virtual-environments.md){.internal-link target=_blank}ãäœæããŠæå¹åããæ¬¡ã®ã³ãã³ãã§ã€ã³ã¹ããŒã«ããŠãã ãã:
+æåã§ã€ã³ã¹ããŒã«ããã«ã¯ã[ä»®æ³ç°å¢](../../virtual-environments.md)ãäœæããŠæå¹åããæ¬¡ã®ã³ãã³ãã§ã€ã³ã¹ããŒã«ããŠãã ãã:
```console
$ pip install python-multipart
<div class="termy">
```console
-$ fastapi dev main.py
+$ fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
## ç¢ºèª { #check-it }
-次ã®ã€ã³ã¿ã©ã¯ãã£ããªããã¥ã¡ã³ãã«ã¢ã¯ã»ã¹ããŠãã ãã: <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>ã
+次ã®ã€ã³ã¿ã©ã¯ãã£ããªããã¥ã¡ã³ãã«ã¢ã¯ã»ã¹ããŠãã ãã: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)ã
äžèšã®ããã«èŠããã§ããã:
çžå¯ŸURLã䜿ã£ãŠããã®ã§ãAPIã`https://example.com/`ã«ããå Žåã`https://example.com/token`ãåç
§ããŸããããããAPIã`https://example.com/api/v1/`ã«ããå Žåã¯`https://example.com/api/v1/token`ãåç
§ããããšã«ãªããŸãã
-çžå¯Ÿ URL ã䜿ãããšã¯ã[ãããã·ã®èåŸ](../../advanced/behind-a-proxy.md){.internal-link target=_blank}ã®ãããªé«åºŠãªãŠãŒã¹ã±ãŒã¹ã§ãã¢ããªã±ãŒã·ã§ã³ãåäœããç¶ããããã«éèŠã§ãã
+çžå¯Ÿ URL ã䜿ãããšã¯ã[ãããã·ã®èåŸ](../../advanced/behind-a-proxy.md)ã®ãããªé«åºŠãªãŠãŒã¹ã±ãŒã¹ã§ãã¢ããªã±ãŒã·ã§ã³ãåäœããç¶ããããã«éèŠã§ãã
///
1é±éåŸãããŒã¯ã³ãæéåããšãªããšã©ããªãã§ããããïŒãŠãŒã¶ãŒã¯èªå¯ããããæ°ããããŒã¯ã³ãåŸãããã«åã³ãµã€ã³ã€ã³ããªããã°ãªããŸããããŸãããŠãŒã¶ãŒïŒãŸãã¯ç¬¬äžè
ïŒãããŒã¯ã³ãä¿®æ£ããŠæå¹æéã倿Žããããšããå Žåã眲åãäžèŽããªããããããŒã¯ã³ã®ä¿®æ£ãæ€ç¥ã§ããŸãã
-JWT ããŒã¯ã³ã䜿ã£ãŠéãã§ã¿ãããšããæ¹ã¯ã<a href="https://jwt.io/" class="external-link" target="_blank">https://jwt.io</a> ããã§ãã¯ããŠãã ããã
+JWT ããŒã¯ã³ã䜿ã£ãŠéãã§ã¿ãããšããæ¹ã¯ã[https://jwt.io](https://jwt.io/) ããã§ãã¯ããŠãã ããã
## `PyJWT` ã®ã€ã³ã¹ããŒã« { #install-pyjwt }
Pythonã§JWTããŒã¯ã³ã®çæãšæ€èšŒãè¡ãããã«ã`PyJWT`ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
-[ä»®æ³ç°å¢](../../virtual-environments.md){.internal-link target=_blank}ãäœæããã¢ã¯ãã£ããŒãããŠããã`pyjwt`ãã€ã³ã¹ããŒã«ããŠãã ããã
+[ä»®æ³ç°å¢](../../virtual-environments.md)ãäœæããã¢ã¯ãã£ããŒãããŠããã`pyjwt`ãã€ã³ã¹ããŒã«ããŠãã ããã
<div class="termy">
RSAãECDSAã®ãããªããžã¿ã«çœ²åã¢ã«ãŽãªãºã ã䜿çšããäºå®ãããå Žåã¯ãcryptographyã©ã€ãã©ãªã®äŸåé¢ä¿`pyjwt[crypto]`ãã€ã³ã¹ããŒã«ããŠãã ããã
-詳现ã¯<a href="https://pyjwt.readthedocs.io/en/latest/installation.html" class="external-link" target="_blank">PyJWT Installation docs</a>ã§ç¢ºèªã§ããŸãã
+詳现ã¯[PyJWT Installation docs](https://pyjwt.readthedocs.io/en/latest/installation.html)ã§ç¢ºèªã§ããŸãã
///
æšå¥šãããã¢ã«ãŽãªãºã ã¯ãArgon2ãã§ãã
-[ä»®æ³ç°å¢](../../virtual-environments.md){.internal-link target=_blank}ãäœæããã¢ã¯ãã£ããŒãããŠãããArgon2ä»ãã§pwdlibãã€ã³ã¹ããŒã«ããŠãã ããã
+[ä»®æ³ç°å¢](../../virtual-environments.md)ãäœæããã¢ã¯ãã£ããŒãããŠãããArgon2ä»ãã§pwdlibãã€ã³ã¹ããŒã«ããŠãã ããã
<div class="termy">
## ç¢ºèª { #check-it }
-ãµãŒããŒãå®è¡ããããã¥ã¡ã³ãã«ç§»åããŸãïŒ<a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>ã
+ãµãŒããŒãå®è¡ããããã¥ã¡ã³ãã«ç§»åããŸãïŒ[http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)ã
次ã®ãããªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã衚瀺ãããŸãïŒ
/// info | æ
å ±
-`**user_dict` ã®ããå®å
šãªè§£èª¬ã¯ã[**远å ã¢ãã«**ã®ããã¥ã¡ã³ã](../extra-models.md#about-user-in-dict){.internal-link target=_blank}ãåç
§ããŠãã ããã
+`**user_dict` ã®ããå®å
šãªè§£èª¬ã¯ã[**远å ã¢ãã«**ã®ããã¥ã¡ã³ã](../extra-models.md#about-user-in-dict)ãåç
§ããŠãã ããã
///
ã¢ã¯ãã£ããªãŠãŒã¶ãŒã®å Žåã«ã®ã¿ `current_user` ãååŸããããšããŸãã
-ããã§ã`get_current_user` ãäŸåé¢ä¿ãšããŠå©çšãã远å ã®äŸåé¢ä¿ `get_current_active_user` ãäœæããŸãã
+ããã§ã`get_current_active_user` ãäŸåé¢ä¿ãšããŠå©çšãã远å ã®äŸåé¢ä¿ `get_current_active_user` ãäœæããŸãã
ããã2ã€ã®äŸåé¢ä¿ã¯ããŠãŒã¶ãŒãååšããªãããŸãã¯éã¢ã¯ãã£ãã§ããå Žåã«ãHTTPãšã©ãŒãè¿ãã ãã§ãã
## åäœç¢ºèª { #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>ã
+ã€ã³ã¿ã©ã¯ãã£ãããã¥ã¡ã³ããéããŸã: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)ã
### èªèšŒ { #authenticate }
FastAPI 㯠SQLïŒãªã¬ãŒã·ã§ãã«ïŒããŒã¿ããŒã¹ã®äœ¿çšãå¿
é ã«ã¯ããŸãããå¿
èŠã§ããã°ãä»»æã®ããŒã¿ããŒã¹ã䜿çšã§ããŸãã
-ããã§ã¯ <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel</a> ã䜿ã£ãäŸãèŠãŠãããŸãã
+ããã§ã¯ [SQLModel](https://sqlmodel.tiangolo.com/) ã䜿ã£ãäŸãèŠãŠãããŸãã
-SQLModel 㯠<a href="https://www.sqlalchemy.org/" class="external-link" target="_blank">SQLAlchemy</a> ãš Pydantic ã®äžã«æ§ç¯ãããŠããŸããFastAPI ãšåãäœè
ã«ãããSQL ããŒã¿ããŒã¹ã䜿ãå¿
èŠããã FastAPI ã¢ããªã«æé©ã«ãªãããã«äœãããŠããŸãã
+SQLModel 㯠[SQLAlchemy](https://www.sqlalchemy.org/) ãš Pydantic ã®äžã«æ§ç¯ãããŠããŸããFastAPI ãšåãäœè
ã«ãããSQL ããŒã¿ããŒã¹ã䜿ãå¿
èŠããã FastAPI ã¢ããªã«æé©ã«ãªãããã«äœãããŠããŸãã
/// tip | è±ç¥è
/// 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>
+ããã³ããšã³ãããã®ä»ã®ããŒã«ãå«ããFastAPI ãš PostgreSQL ã®å
¬åŒãããžã§ã¯ããžã§ãã¬ãŒã¿ãŒããããŸã: [https://github.com/fastapi/full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template)
///
-ããã¯ãšãŠãã·ã³ãã«ã§çããã¥ãŒããªã¢ã«ã§ããããŒã¿ããŒã¹ã SQLãããé«åºŠãªæ©èœã«ã€ããŠåŠã³ããå Žåã¯ã<a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel ã®ããã¥ã¡ã³ã</a>ãã芧ãã ããã
+ããã¯ãšãŠãã·ã³ãã«ã§çããã¥ãŒããªã¢ã«ã§ããããŒã¿ããŒã¹ã SQLãããé«åºŠãªæ©èœã«ã€ããŠåŠã³ããå Žåã¯ã[SQLModel ã®ããã¥ã¡ã³ã](https://sqlmodel.tiangolo.com/)ãã芧ãã ããã
## `SQLModel` ã®ã€ã³ã¹ããŒã« { #install-sqlmodel }
-ãŸã㯠[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank} ãäœæã»æå¹åãã`sqlmodel` ãã€ã³ã¹ããŒã«ããŸã:
+ãŸã㯠[ä»®æ³ç°å¢](../virtual-environments.md) ãäœæã»æå¹åãã`sqlmodel` ãã€ã³ã¹ããŒã«ããŸã:
<div class="termy">
* `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> ãåç
§ããŠãã ããã
+ 泚: ãã©ã€ããªããŒã®ãã£ãŒã«ãã«ã¯ `int | None` ã䜿ã£ãŠããŸãããã㯠Python ã³ãŒãå
ã§ `id=None` ã®ããã«ã`id` ãªãã§ãªããžã§ã¯ããäœæãããä¿åæã«ããŒã¿ããŒã¹ãçæããããšãæ³å®ããããã§ããSQLModel ã¯ããŒã¿ããŒã¹ã `id` ãæäŸããããšãçè§£ããã¹ããŒãã§ã¯ãNULL äžå¯ã® `INTEGER` åããå®çŸ©ããŸãã詳现㯠[SQLModel ã®ãã©ã€ããªããŒã«é¢ããããã¥ã¡ã³ã](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) ãåç
§ããŠãã ããã
* `Field(index=True)` ã¯ããã®åã«å¯Ÿã㊠SQL ã®ã€ã³ããã¯ã¹ãäœæãããã SQLModel ã«æç€ºããŸããããã«ããããã®åã§ãã£ã«ã¿ããŠããŒã¿ãèªãå Žåã«æ€çŽ¢ãé«éã«ãªããŸãã
/// tip | è±ç¥è
-SQLModel 㯠Alembic ãã©ãããããã€ã°ã¬ãŒã·ã§ã³ãŠãŒãã£ãªãã£ãæäŸäºå®ã§ãããçŸæç¹ã§ã¯ <a href="https://alembic.sqlalchemy.org/en/latest/" class="external-link" target="_blank">Alembic</a> ãçŽæ¥äœ¿ããŸãã
+SQLModel 㯠Alembic ãã©ãããããã€ã°ã¬ãŒã·ã§ã³ãŠãŒãã£ãªãã£ãæäŸäºå®ã§ãããçŸæç¹ã§ã¯ [Alembic](https://alembic.sqlalchemy.org/en/latest/) ãçŽæ¥äœ¿ããŸãã
///
<div class="termy">
```console
-$ fastapi dev main.py
+$ fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
<div class="termy">
```console
-$ fastapi dev main.py
+$ fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
## ãŸãšã { #recap }
-<a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel</a> ã䜿ã£ãŠ SQL ããŒã¿ããŒã¹ãšããåãããããŒã¿ã¢ãã«ãšããŒãã«ã¢ãã«ã§ã³ãŒããç°¡æœã«ã§ããŸãã
+[SQLModel](https://sqlmodel.tiangolo.com/) ã䜿ã£ãŠ SQL ããŒã¿ããŒã¹ãšããåãããããŒã¿ã¢ãã«ãšããŒãã«ã¢ãã«ã§ã³ãŒããç°¡æœã«ã§ããŸãã
-ããã«å€ããåŠã¶ã«ã¯ SQLModel ã®ããã¥ã¡ã³ããã芧ãã ããã<a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/" class="external-link" target="_blank">FastAPI ãš SQLModel ã䜿ããã¥ãŒããªã¢ã«</a> ããããŸããð
+ããã«å€ããåŠã¶ã«ã¯ SQLModel ã®ããã¥ã¡ã³ããã芧ãã ããã[FastAPI ãš SQLModel ã䜿ããã¥ãŒããªã¢ã«](https://sqlmodel.tiangolo.com/tutorial/fastapi/) ããããŸããð
ããã¯ãããŠã³ããããã¢ããªã±ãŒã·ã§ã³ãå®å
šã«ç¬ç«ããŠããããã`APIRouter` ãšã¯ç°ãªããŸããã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã®OpenAPIãšããã¥ã¡ã³ãã«ã¯ãããŠã³ããããã¢ããªã±ãŒã·ã§ã³ã®å
容ãªã©ã¯å«ãŸããŸããã
-ããã«ã€ããŠè©³ããã¯ã[é«åºŠãªãŠãŒã¶ãŒã¬ã€ã](../advanced/index.md){.internal-link target=_blank} ãã芧ãã ããã
+ããã«ã€ããŠè©³ããã¯ã[é«åºŠãªãŠãŒã¶ãŒã¬ã€ã](../advanced/index.md) ãã芧ãã ããã
## 詳现 { #details }
## ãã詳ããæ
å ± { #more-info }
-詳现ãšãªãã·ã§ã³ã«ã€ããŠã¯ã<a href="https://www.starlette.dev/staticfiles/" class="external-link" target="_blank">Starletteã®éçãã¡ã€ã«ã«é¢ããããã¥ã¡ã³ã</a>ã確èªããŠãã ããã
+詳现ãšãªãã·ã§ã³ã«ã€ããŠã¯ã[Starletteã®éçãã¡ã€ã«ã«é¢ããããã¥ã¡ã³ã](https://www.starlette.dev/staticfiles/)ã確èªããŠãã ããã
# ãã¹ã { #testing }
-<a href="https://www.starlette.dev/testclient/" class="external-link" target="_blank">Starlette</a> ã®ãããã§ã**FastAPI** ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãã¯ç°¡åã§æ¥œãããã®ã«ãªã£ãŠããŸãã
+[Starlette](https://www.starlette.dev/testclient/) ã®ãããã§ã**FastAPI** ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãã¯ç°¡åã§æ¥œãããã®ã«ãªã£ãŠããŸãã
-<a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a> ãããŒã¹ã§ãããã«ãã®èšèšã¯ Requests ãããŒã¹ã«ããŠããããããšãŠã銎æã¿ãããçŽæçã§ãã
+[HTTPX](https://www.python-httpx.org) ãããŒã¹ã§ãããã«ãã®èšèšã¯ Requests ãããŒã¹ã«ããŠããããããšãŠã銎æã¿ãããçŽæçã§ãã
-ããã䜿çšãããšã**FastAPI** ãšå
±ã« <a href="https://docs.pytest.org/" class="external-link" target="_blank">pytest</a> ãçŽæ¥å©çšã§ããŸãã
+ããã䜿çšãããšã**FastAPI** ãšå
±ã« [pytest](https://docs.pytest.org/) ãçŽæ¥å©çšã§ããŸãã
## `TestClient` ãäœ¿çš { #using-testclient }
-/// info | æ
å ±
+/// info
-`TestClient` ã䜿çšããã«ã¯ããŸã <a href="https://www.python-httpx.org" class="external-link" target="_blank">`httpx`</a> ãã€ã³ã¹ããŒã«ããŸãã
+`TestClient` ã䜿çšããã«ã¯ããŸã [`httpx`](https://www.python-httpx.org) ãã€ã³ã¹ããŒã«ããŸãã
-[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank} ãäœæãããããæå¹åããŠãããäŸãã°ä»¥äžã®ããã«ã€ã³ã¹ããŒã«ããŠãã ãã:
+[ä»®æ³ç°å¢](../virtual-environments.md) ãäœæãããããæå¹åããŠãããäŸãã°ä»¥äžã®ããã«ã€ã³ã¹ããŒã«ããŠãã ãã:
```console
$ pip install httpx
{* ../../docs_src/app_testing/tutorial001_py310.py hl[2,12,15:18] *}
-/// tip | è±ç¥è
+/// tip
ãã¹ã颿°ã¯ `async def` ã§ã¯ãªããéåžžã® `def` ã§ããããšã«æ³šæããŠãã ããã
///
-/// tip | è±ç¥è
+/// tip
-FastAPIã¢ããªã±ãŒã·ã§ã³ãžã®ãªã¯ãšã¹ãã®éä¿¡ãšã¯å¥ã«ããã¹ãã§ `async` 颿° (éåæããŒã¿ããŒã¹é¢æ°ãªã©) ãåŒã³åºãããå Žåã¯ãé«åºŠãªãã¥ãŒããªã¢ã«ã®[Async Tests](../advanced/async-tests.md){.internal-link target=_blank} ãåç
§ããŠãã ããã
+FastAPIã¢ããªã±ãŒã·ã§ã³ãžã®ãªã¯ãšã¹ãã®éä¿¡ãšã¯å¥ã«ããã¹ãã§ `async` 颿° (éåæããŒã¿ããŒã¹é¢æ°ãªã©) ãåŒã³åºãããå Žåã¯ãé«åºŠãªãã¥ãŒããªã¢ã«ã®[Async Tests](../advanced/async-tests.md) ãåç
§ããŠãã ããã
///
### **FastAPI** ã¢ããªãã¡ã€ã« { #fastapi-app-file }
-[Bigger Applications](bigger-applications.md){.internal-link target=_blank} ã§èª¬æãããŠãããæ¬¡ã®ãããªãã¡ã€ã«æ§æããããšããŸã:
+[Bigger Applications](bigger-applications.md) ã§èª¬æãããŠãããæ¬¡ã®ãããªãã¡ã€ã«æ§æããããšããŸã:
```
.
* *ããããŒ* ãæž¡ãã«ã¯ã`headers` ãã©ã¡ãŒã¿ã« `dict` ãæž¡ããŸãã
* *cookies* ã®å Žåã `cookies` ãã©ã¡ãŒã¿ã« `dict` ã§ãã
-(`httpx` ãŸã㯠`TestClient` ã䜿çšããŠ) ããã¯ãšã³ãã«ããŒã¿ãæž¡ãæ¹æ³ã®è©³çްã¯ã<a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPXã®ããã¥ã¡ã³ã</a>ã確èªããŠãã ããã
+(`httpx` ãŸã㯠`TestClient` ã䜿çšããŠ) ããã¯ãšã³ãã«ããŒã¿ãæž¡ãæ¹æ³ã®è©³çްã¯ã[HTTPXã®ããã¥ã¡ã³ã](https://www.python-httpx.org)ã確èªããŠãã ããã
-/// info | æ
å ±
+/// info
`TestClient` ã¯ãPydanticã¢ãã«ã§ã¯ãªããJSONã«å€æã§ããããŒã¿ãåãåãããšã«æ³šæããŠãã ããã
-ãã¹ãã«Pydanticã¢ãã«ãããããã¹ãäžã«ãã®ããŒã¿ãã¢ããªã±ãŒã·ã§ã³ã«éä¿¡ãããå Žåã¯ã[JSONäºæãšã³ã³ãŒã](encoder.md){.internal-link target=_blank} ã§èª¬æãããŠãã `jsonable_encoder` ãå©çšã§ããŸãã
+ãã¹ãã«Pydanticã¢ãã«ãããããã¹ãäžã«ãã®ããŒã¿ãã¢ããªã±ãŒã·ã§ã³ã«éä¿¡ãããå Žåã¯ã[JSONäºæãšã³ã³ãŒã](encoder.md) ã§èª¬æãããŠãã `jsonable_encoder` ãå©çšã§ããŸãã
///
ãã®åŸã`pytest` ãã€ã³ã¹ããŒã«ããã ãã§ãã
-[ä»®æ³ç°å¢](../virtual-environments.md){.internal-link target=_blank} ãäœæãããããæå¹åããŠãããäŸãã°ä»¥äžã®ããã«ã€ã³ã¹ããŒã«ããŠãã ãã:
+[ä»®æ³ç°å¢](../virtual-environments.md) ãäœæãããããæå¹åããŠãããäŸãã°ä»¥äžã®ããã«ã€ã³ã¹ããŒã«ããŠãã ãã:
<div class="termy">
/// info | æ
å ±
ãã®ããŒãžã§ã¯ã**ä»®æ³ç°å¢**ã®äœ¿ç𿹿³ãšããã®ã¯ãããã«ã€ããŠèª¬æããŸãã
-ãã**ãã¹ãŠã管çããããŒã«**ïŒPythonã®ã€ã³ã¹ããŒã«ãå«ãïŒãå°å
¥ããæºåãã§ããŠãããªãã<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">uv</a> ãã詊ããã ããã
+ãã**ãã¹ãŠã管çããããŒã«**ïŒPythonã®ã€ã³ã¹ããŒã«ãå«ãïŒãå°å
¥ããæºåãã§ããŠãããªãã[uv](https://github.com/astral-sh/uv) ãã詊ããã ããã
///
//// tab | `uv`
-ãã <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a> ãã€ã³ã¹ããŒã«æžã¿ãªããä»®æ³ç°å¢ãäœæããããã« `uv` ã䜿ãããšãã§ããŸãã
+ãã [`uv`](https://github.com/astral-sh/uv) ãã€ã³ã¹ããŒã«æžã¿ãªããä»®æ³ç°å¢ãäœæããããã« `uv` ã䜿ãããšãã§ããŸãã
<div class="termy">
//// tab | Windows Bash
-ããWindowsã§Bashã䜿çšããŠããå Žå (<a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>ãªã©):
+ããWindowsã§Bashã䜿çšããŠããå Žå ([Git Bash](https://gitforwindows.org/)ãªã©):
<div class="termy">
/// tip | è±ç¥è
-ãã <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a> ã䜿çšããŠããå Žåã¯ã `pip` ã®ä»£ããã« `uv` ã䜿ã£ãŠã€ã³ã¹ããŒã«ãè¡ãããã `pip` ãã¢ããã°ã¬ãŒãããå¿
èŠã¯ãããŸãã ðã
+ãã [`uv`](https://github.com/astral-sh/uv) ã䜿çšããŠããå Žåã¯ã `pip` ã®ä»£ããã« `uv` ã䜿ã£ãŠã€ã³ã¹ããŒã«ãè¡ãããã `pip` ãã¢ããã°ã¬ãŒãããå¿
èŠã¯ãããŸãã ðã
///
/// tip | è±ç¥è
-ãã <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a> ã䜿çšããŠä»®æ³ç°å¢ãäœæããå Žåããã§ã«ãã®äœæ¥ã¯æžãã§ããã®ã§ããã®æé ãã¹ãããã§ããŸã ðã
+ãã [`uv`](https://github.com/astral-sh/uv) ã䜿çšããŠä»®æ³ç°å¢ãäœæããå Žåããã§ã«ãã®äœæ¥ã¯æžãã§ããã®ã§ããã®æé ãã¹ãããã§ããŸã ðã
///
//// tab | `uv`
-ãã <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a> ã䜿çšã§ãããªã:
+ãã [`uv`](https://github.com/astral-sh/uv) ã䜿çšã§ãããªã:
<div class="termy">
//// tab | `uv`
-ãã <a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">`uv`</a> ã䜿çšã§ãããªã:
+ãã [`uv`](https://github.com/astral-sh/uv) ã䜿çšã§ãããªã:
<div class="termy">
èšå®äŸ:
-* <a href="https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment" class="external-link" target="_blank">VS Code</a>
-* <a href="https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html" class="external-link" target="_blank">PyCharm</a>
+* [VS Code](https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment)
+* [PyCharm](https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html)
/// tip | è±ç¥è
## ãªãä»®æ³ç°å¢ïŒ { #why-virtual-environments }
-FastAPIã䜿ã£ãäœæ¥ãããã«ã¯ã<a href="https://www.python.org/" class="external-link" target="_blank">Python</a> ã®ã€ã³ã¹ããŒã«ãå¿
èŠã§ãã
+FastAPIã䜿ã£ãäœæ¥ãããã«ã¯ã[Python](https://www.python.org/) ã®ã€ã³ã¹ããŒã«ãå¿
èŠã§ãã
ãããããFastAPIãã䜿çšããããã®ä»ã®**ããã±ãŒãž**ã**ã€ã³ã¹ããŒã«**ããå¿
èŠããããŸãã
</div>
-FastAPIã®ã³ãŒããå«ãå§çž®ãã¡ã€ã«ããé垞㯠<a href="https://pypi.org/project/fastapi/" class="external-link" target="_blank">PyPI</a> ããããŠã³ããŒããããŸãã
+FastAPIã®ã³ãŒããå«ãå§çž®ãã¡ã€ã«ããé垞㯠[PyPI](https://pypi.org/project/fastapi/) ããããŠã³ããŒããããŸãã
ãŸããFastAPIãäŸåããä»ã®ããã±ãŒãžã**ããŠã³ããŒã**ãããŸãã
//// tab | Windows Bash
-ãããã¯ãWindowsã§Bashã䜿çšããŠããå Žå (<a href="https://gitforwindows.org/" class="external-link" target="_blank">Git Bash</a>ãªã©):
+ãããã¯ãWindowsã§Bashã䜿çšããŠããå Žå ([Git Bash](https://gitforwindows.org/)ãªã©):
<div class="termy">
////
-ããã«ãã£ãŠãããã€ãã® [ç°å¢å€æ°](environment-variables.md){.internal-link target=_blank} ãäœæã»ä¿®æ£ãããæ¬¡ã«å®è¡ãããã³ãã³ãã§äœ¿çšã§ããããã«ãªããŸãã
+ããã«ãã£ãŠãããã€ãã® [ç°å¢å€æ°](environment-variables.md) ãäœæã»ä¿®æ£ãããæ¬¡ã«å®è¡ãããã³ãã³ãã§äœ¿çšã§ããããã«ãªããŸãã
ãããã®ç°å¢å€æ°ã®ã²ãšã€ã«ã `PATH` 倿°ããããŸãã
/// tip | è±ç¥è
-`PATH` 倿°ã«ã€ããŠã®è©³çŽ°ã¯ [ç°å¢å€æ°](environment-variables.md#path-environment-variable){.internal-link target=_blank} ãåç
§ããŠãã ããã
+`PATH` 倿°ã«ã€ããŠã®è©³çŽ°ã¯ [ç°å¢å€æ°](environment-variables.md#path-environment-variable) ãåç
§ããŠãã ããã
///
ä»®æ³ç°å¢ãããã±ãŒãžã®äŸåé¢ä¿ïŒrequirementsïŒããããžã§ã¯ãã®ç®¡çã«ã¯ãå€ãã®**ä»£æ¿ææ®µ**ããããŸãã
-æºåãæŽããããã±ãŒãžã®äŸåé¢ä¿ãä»®æ³ç°å¢ãªã©**ãããžã§ã¯ãå
šäœã®ç®¡ç**ããŒã«ã䜿ããããšèãããã<a href="https://github.com/astral-sh/uv" class="external-link" target="_blank">uv</a> ã詊ããŠã¿ãããšãããããããŸãã
+æºåãæŽããããã±ãŒãžã®äŸåé¢ä¿ãä»®æ³ç°å¢ãªã©**ãããžã§ã¯ãå
šäœã®ç®¡ç**ããŒã«ã䜿ããããšèãããã[uv](https://github.com/astral-sh/uv) ã詊ããŠã¿ãããšãããããããŸãã
`uv` ã§ã¯ä»¥äžã®ãããªå€ãã®ããšãã§ããŸãïŒ