ð FastAPI å®è·µå ¥éïŒç¬¬äžæ©ç®ã§åŠã¶ãã³ãã¬ãŒããšã»ãã·ã§ã³ç®¡ç
ð ã¯ããã«
ç¬¬äºæ©ç®ã§ã¯ãã«ãŒãã£ã³ã°ããã©ãŒã åŠçãããªããŒã·ã§ã³ããšã©ãŒãã³ããªã³ã°ãšãã£ãWeb APIã®åå°ãåºããèŠçŽ ãæ±ããŸãããä»åã¯ãã®ç¶ããšããŠãFastAPIã䜿ã£ããã³ãã¬ãŒããšã³ãžã³ã®å©ç𿹿³ãšãã»ãã·ã§ã³ç®¡çã®åºæ¬çãªææ³ã玹ä»ããŸããããã«ãããWebã¢ããªãšããŠã®ããã³ããšã³ãèŠçŽ ãšãŠãŒã¶ãŒç¶æ ã®ç®¡çãåãå ¥ããæ§æãå¯èœã«ãªããŸãããã³ãã¬ãŒãã«ãã£ãŠèŠãç®ã®æŽã£ãWebããŒãžãæäŸããã»ãã·ã§ã³ã«ãã£ãŠãã°ã€ã³ç¶æ ããŠãŒã¶ãŒã®èå¥ãå¯èœã«ããããšã§ãããå®è·µçãªWebã¢ããªã±ãŒã·ã§ã³ã«è¿ã¥ãããšãã§ããŸãã
ðŒïž ãã³ãã¬ãŒããšã³ãžã³ Jinja2 ã®å°å ¥
FastAPIã§ã¯ãJinja2
ã䜿ã£ãŠHTMLãã³ãã¬ãŒãã衚瀺ããããšãã§ããŸããããã«ãããåçã«HTMLãçæã§ããããã«ãªãããŠãŒã¶ãŒããšã®ããŒãžãæ¡ä»¶åå²ã䌎ã衚瀺ãå¯èœã«ãªããŸãã
ðŠ ã€ã³ã¹ããŒã«
Jinja2ãšéåæãã¡ã€ã«æäœçšã®aiofilesãã€ã³ã¹ããŒã«ããŸãïŒ
pip install jinja2 aiofiles
ð§ èšå®ãšãã³ãã¬ãŒãã®è¡šç€º
以äžã®ããã«ãã³ãã¬ãŒãã®ãã£ã¬ã¯ããªãæå®ããTemplateResponse
ã䜿ã£ãŠHTMLãè¿ããŸãã
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
from fastapi.responses import HTMLResponse
import uvicorn
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/", response_class=HTMLResponse)
def read_root(request: Request):
return templates.TemplateResponse("index.html", {"request": request, "title": "ãããã"})
-
templates
ãã£ã¬ã¯ããªãäœæãããã®äžã«index.html
ãä¿åããŠãã ããã - ãã³ãã¬ãŒãå
ã§ã¯
{{ title }}
ãªã©ã®åœ¢ã§Pythonããæž¡ãããå€ã䜿ã£ãŠHTMLãçæã§ããŸãã
ãã³ãã¬ãŒãã¯ãäŸãã°æ¬¡ã®ããã«èšè¿°ããŸãïŒ
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>{{ title }}</h1>
<p>FastAPIãšJinja2ã®çµ±åãµã³ãã«ã§ãã</p>
</body>
</html>
ð éçãã¡ã€ã«ã®é ä¿¡
HTMLã ãã§ãªããã¹ã¿ã€ã«ã·ãŒããJavaScriptãç»åãªã©ã®éçãã¡ã€ã«ãæäŸããã«ã¯ãFastAPIã®StaticFiles
æ©èœã䜿ããŸãã
ð§± èšå®æ¹æ³
from fastapi.staticfiles import StaticFiles
app.mount("/static", StaticFiles(directory="static"), name="static")
-
static/
ãã©ã«ãããããžã§ã¯ãå ã«äœæãããã®äžã«style.css
ãç»åãã¡ã€ã«ã眮ããŠãã ããã
HTMLãã³ãã¬ãŒãããã¯æ¬¡ã®ããã«äœ¿çšããŸãïŒ
<link rel="stylesheet" href="/static/style.css">
ããã«ããããŠãŒã¶ãŒã«èŠãç®ã®æŽã£ãããŒãžãæäŸã§ããããã«ãªããŸããJavaScriptãçµã¿åãããããšã§ãããåçãªããŒãžãæ§ç¯å¯èœã§ãã
ð ã»ãã·ã§ã³ç®¡çã®åºæ¬
FastAPIã«ã¯Flaskã®ãããªã»ãã·ã§ã³ç®¡çæ©èœã¯æšæºæèŒãããŠããŸããããCookieã䜿ã£ãŠç¶æ ãä¿æããããšã§ãç°¡æçãªã»ãã·ã§ã³æ©æ§ãå®çŸã§ããŸãã
ðª Cookie ã䜿ã£ãäŸïŒ
from fastapi.responses import Response
from fastapi import Cookie
@app.post("/set-cookie")
def set_cookie(response: Response):
response.set_cookie(key="session_id", value="abc123", httponly=True)
return {"message": "Cookieãèšå®ãããŸããã"}
@app.get("/get-cookie")
def get_cookie(session_id: str = Cookie(None)):
return {"session_id": session_id}
set_cookie
ã§ãµãŒããŒåŽããCookieãçºè¡ããget_cookie
ã§ã¯ã©ã€ã¢ã³ãã®éã£ãCookieãååŸããŸããããã«ãããç°¡æçã«ãã°ã€ã³ç¶æ
ãªã©ã®æ
å ±ãããåãã§ããŸãããã ããã»ãã¥ãªãã£äžã®æžå¿µãããå人æ
å ±ããã¹ã¯ãŒããçŽæ¥Cookieã«ä¿åããããšã¯é¿ããŸãããã
ð ã»ãã·ã§ã³ã®å®çšãã¿ãŒã³ïŒèªèšŒãšã®é£æº
CookieãçšããŠãã°ã€ã³ç¶æ ã管çããããšã§ãå®éã®ã¢ããªã±ãŒã·ã§ã³ã§äœ¿ããèªèšŒåŠçã®ç°¡æçãäœããŸãã
ð€ ãã°ã€ã³ç¶æ ã®ä¿æ
from fastapi import Form, Response, Request
@app.post("/login")
def login(username: str = Form(...), password: str = Form(...), response: Response):
if username == "admin" and password == "password":
response.set_cookie(key="user", value=username)
return {"message": "ãã°ã€ã³æå"}
return {"message": "èªèšŒå€±æ"}
@app.get("/mypage")
def mypage(request: Request):
user = request.cookies.get("user")
if user:
return {"message": f"{user}ãããããããïŒ"}
return {"message": "ãã°ã€ã³ããŠãã ããã"}
ãã®äŸã§ã¯ããã©ãŒã ã§ãã°ã€ã³æ
å ±ãåãåããæ£ãããã°Cookieã«ãŠãŒã¶ãŒåãèšé²ããŠããŸãããã®åŸãç¹å®ã®ããŒãžã«ã¢ã¯ã»ã¹ããéã«ãCookieãããŠãŒã¶ãŒåãååŸãããã°ã€ã³ããŠãããã©ããã倿ããŸãã
ãã®ãããªä»çµã¿ãããŒã¹ã«ãããŒã¿ããŒã¹ãšé£æºããæ¬æ Œçãªãã°ã€ã³ã·ã¹ãã ãžçºå±ãããããšãå¯èœã§ãã
ð¯ ãŸãšã
- Jinja2ãã³ãã¬ãŒãã䜿ã£ãŠåçãªHTMLãçæããããèŠèŠçãªWebã¢ããªãæ§ç¯
- CSSãJSãã¡ã€ã«ãªã©éçãªãœãŒã¹ã®é ä¿¡ã§ãŠãŒã¶ãŒäœéšã匷å
- CookieãçšããŠç°¡æçãªã»ãã·ã§ã³ç®¡çãå®è£ ãããŠãŒã¶ãŒã®ç¶æ ãä¿æ
- èªèšŒåŠçãšCookieã®çµã¿åããã§ãã°ã€ã³æ©èœã®åºç€ãå®çŸ
FastAPIã¯ãAPIéçºã ãã§ãªãWebã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ã«ãé©ããŠãããæè»ã«æ©èœã远å ããŠæ¡åŒµããŠããããšãã§ããŸãã
æ ªåŒäŒç€ŸONE WEDGE
ãServerlessã§äžã®äžããã£ãšæ¥œããã ONE WEDGEã¯Serverlessã·ã¹ãã éçºãäžæ žæè¡ãšããŠWebç³»ã·ã¹ãã éçºãAWS/GCPãå©çšããæ¥åã·ã¹ãã ã»ãµãŒãã¹éçºãPWAãçšããã¢ãã€ã«éçºãAlexaã¹ãã«éçºãªã©ãå æ°ãšæè¡åãæŠåšã«ã客æ§ã«çæ¯ã«åãåã䟡å€åµé äŒæ¥ã§ãã
Discussion