APIéçºå ¥é â FastAPIã§ååãç»é²ã»ååŸããŠã¿ãã
ååãéã£ãŠãçµæãåãåã
- FastAPIã§ååãç»é²ã»ååŸãã
- Swagger UIã§201ã»404ã»422ã詊ã
- åŠç¿çšãšæ¬çªå ¬éã®éããç¥ã
æåã®ãŽãŒã«ïŒããã200åãç»é²ããŠåãåºã
Pythonã®é¢æ°ãšèŸæžãå°ãç¥ã£ãŠãã人åãã§ããä»åäœãã®ã¯ãèªåã®ç«¯æ«ã®ã¡ã¢ãªãžååãä¿åããAPIã§ããããŒã¿ããŒã¹ããã°ã€ã³ã¯æ¬¡ã®æ®µéã§å ããŸãã
| æäœ | çªå£ | æåã®ç®å° |
|---|---|---|
| ç»é² | POST /products | 201ãšååID |
| äžèЧ | GET /products | 200ãšååã®é å |
| 1ä»¶ååŸ | GET /products/ID | 200ãšåå1ä»¶ |
PythonãšFastAPIãæºåãã
Python 3.10以äžã®å¯Ÿå¿ç°å¢ã䜿ããŸããæ°ããapi-shoppingãã©ã«ããŒãžç§»åããä»®æ³ç°å¢ãäœããŸãã
python -m venv .venv
Windowsã®PowerShellã§ã¯æ¬¡ãå®è¡ããŸãã
.venv\Scripts\python -m pip install "fastapi[standard]"
macOSã»Linuxã§ã¯.venv/bin/python -m pip install "fastapi[standard]"ã§ããç°å¢ã®Pythonã³ãã³ããpython3ã®å Žåã¯ä»®æ³ç°å¢ã®äœææãèªã¿æ¿ããŠãã ããã
main.pyã«çªå£ãäœã
ãã©ã«ããŒçŽäžã«main.pyãäœããŸãããã®äŸã¯åäžããã»ã¹ã®ã¡ã¢ãªã«ä¿åããåŠç¿çšã§ãã
from uuid import uuid4
from fastapi import (
FastAPI, HTTPException
)
from pydantic import BaseModel, Field
app = FastAPI()
products = {}
class ProductInput(BaseModel):
name: str = Field(
min_length=1, max_length=80
)
price: int = Field(gt=0, strict=True)
@app.post('/products', status_code=201)
def create_product(product: ProductInput):
product_id = str(uuid4())
saved = {
'id': product_id,
**product.model_dump()
}
products[product_id] = saved
return saved
@app.get('/products')
def list_products():
return list(products.values())
@app.get('/products/{product_id}')
def get_product(product_id: str):
if product_id not in products:
raise HTTPException(
404, 'Product not found'
)
return products[product_id]
Windowsã§ã¯åããã©ã«ããŒã§èµ·åããŸãã
.venv\Scripts\python -m uvicorn main:app --reload --host 127.0.0.1
macOSã»Linuxã¯å
é ã.venv/bin/pythonã«å€ããŸããmain:appã¯main.pyã®appãæããŸãã--reloadã¯éçºäžã®åèµ·åçšã§ãã
Swagger UIã§æåãšå€±æã確ããã
ãã©ãŠã¶ãŒã§http://127.0.0.1:8000/docsãéããŸãã
- POST /productsãéããTry it outãæŒããŸãã
- å ¥åãæ¬¡ã®JSONã«ããExecuteã§éããŸãã
- 201ãšè¿ã£ãŠããidã確èªããŸãã
- GET /productsãå®è¡ããããã200åãäžèЧã«ãããã確ãããŸãã
{
"name": "ããã",
"price": 200
}
次ã«ãpriceã0ã«ããŠç»é²ãã422ãšå
¥åã®èª¬æãè¿ãããèŠãŸããGET /products/{product_id}ãžmissingãå
¥ãããš404ã§ããæ£åžžãªååIDãå
¥ããã°200ã«ãªããŸããããã§æ£åžžç³»ã ãã§ãªããäºã€ã®å€±æã確èªã§ããŸãã
| ããŸããããªãå Žé¢ | èŠçŽããšãã |
|---|---|
| /docsãéããªã | ãµãŒããŒãèµ·åããŠããããããŒããåãã |
| mainãèŠã€ãããªã | main.pyãšåããã©ã«ããŒã§èµ·åããã |
| ç»é²ããååãæ¶ãã | åèµ·åãèµ·ããããä»åã¯ã¡ã¢ãªä¿å |
æ¬çªãžé²ããšãã«å ãããã®
ãã®äŸã«ã¯èªèšŒã»æš©éã®å¶åŸ¡ãæ°žç¶çãªä¿åããããŸãããååã®æ€æ»ãæåæ°ã®äŸã§ãæ¥åäžæå¹ãªåååã®å€æãŸã§æ ããŸããã
å ¬éæã¯DBãžä¿åãã誰ãã©ã®ååãæäœã§ãããã確èªããŸããHTTPSãå ¥åã®æ¥åã«ãŒã«ãè² è·å¶åŸ¡ããã°ãé害察å¿ãå¿ èŠã§ããJWTã¯éžæè¢ã®äžã€ã§ãå ¥åæ€èšŒãæš©é確èªã®ä»£ããã§ã¯ãããŸãããURLã«v1ãä»ããã ãã§ããæ¢åå©çšè ãžã®åœ±é¿ãèªåã§ãªããªãããã§ã¯ãããŸããã
åŠç¿ãçµããã端æ«ã§Ctrl+CãæŒããèªåã®ãµãŒããŒãæ¢ããŸãã
次ã«åŠã¶ãªã
MongoDBå ¥éãNeonå ¥éã§ä¿åå ãåŠã³ãGraphQLå ¥éã§å¥ã®çªå£ã®èšèšãšæ¯ã¹ãŠã¿ãŸãããã
åèè³æ
- FastAPI Request body â JSONå ¥åã®ã¢ãã«ãšæ€èšŒ
- FastAPI Fields â å€ã®ç¯å²ã®æå®
- FastAPI Response status â 201ã®æå®ãšä»æ§ãžã®åæ
- FastAPI Handling errors â HTTPExceptionãš404