
π° FastAPI 곡μλ¬Έμλ₯Ό 보면μ κ°μΈμ μΌλ‘ μ 리ν κΈ μ
λλ€.
λ―Έλ€μ¨μ΄λ₯Ό FastAPI μμ© νλ‘κ·Έλ¨μ μΆκ°ν μ μλ€.
"λ―Έλ€μ¨μ΄"λ νΉμ κ²½λ‘ μλμ μν΄ μ²λ¦¬λκΈ° μ , λͺ¨λ μμ²μ λν΄μ λμνλ ν¨μ, λͺ¨λ μλ΅μ΄ λ°νλκΈ° μ μλ λμΌνκ² λμ
- μμ© νλ‘κ·Έλ¨μΌλ‘ μ€λ μμ²μ κ°μ Έμ¨λ€.
- μμ² λλ λ€λ₯Έ νμν μ½λλ₯Ό μ€ν μν¬ μ μλ€.
- μμ²μ μμ© νλ‘κ·Έλ¨μ κ²½λ‘ μλμΌλ‘ μ λ¬νμ¬ μ²λ¦¬νλ€.
- μ ν리μΌμ΄μ μ κ²½λ‘ μμ μμ μμ±ν μλ΅μ λ°λλ€.
- μλ΅ λλ λ€λ₯Έ νμν μ½λλ₯Ό μ€νμν€λ λμμ ν μ μλ€.
- μλ΅μ λ°ννλ€.
λ―Έλ€μ¨μ΄ λ§λ€κΈ°
ν¨μ μλ¨μ @app.middleware("http") λ°μ½λ μ΄ν°λ₯Ό μ¬μ©ν μ μλ€.
import time
from fastapi import FastAPI, Request
import asyncio
app = FastAPI()
# requestμ μνμκ°μ μΈ‘μ νλ λ―Έλ€μ¨μ΄
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
formatted_time = time.strftime("%H:%M:%S", time.gmtime(process_time))
response.headers["X-Process-Time"] = formatted_time
return response
@app.get("/")
async def getItem():
await asyncio.sleep(5)
return {"message": "Success"}

μ¬μ©μ μ μ ν€λλ X- μ λμ¬λ₯Ό μ¬μ©νμ¬ μΆκ°νλ€.
CORS(Cross-Origin Resource Sharing)
μΉ μ ν리μΌμ΄μ μμ λ°μνλ λμΌ μΆμ² μ μ± (Same-Origin Policy)μ μ°ννμ¬ λ€λ₯Έ μΆμ²(λλ©μΈ, νλ‘ν μ½ λλ ν¬νΈκ° λ€λ₯Έ)μ 리μμ€μ μ κ·Όν μ μκ² ν΄μ£Όλ λ©μ»€λμ¦.
λμΌ μΆμ² μ μ± μ 보μμμ μ΄μ λ‘ μΉ λΈλΌμ°μ μμ μ μ©λλ μ μ± μΌλ‘, μ€ν¬λ¦½νΈλ μ€νμΌ μνΈ λ±μ 리μμ€κ° μΉ νμ΄μ§μ μΆμ²μ λμΌν μΆμ²μμ μ¨ κ²μΈμ§λ₯Ό νμΈνκ³ , λ€λ₯Έ μΆμ²μμ μ¨ λ¦¬μμ€μλ μ κ·Όμ μ ννλ€.
κ·Έλ¬λ λ€λ₯Έ μΆμ²μμ νμν 리μμ€μ μ κ·Όν΄μΌ νλ μν©μ΄ λ°μνλλ°, μ΄λ CORSλ₯Ό μ¬μ©νλ€.
μλ²μμ ν΄λΌμ΄μΈνΈμκ² νΉμ μΆμ²λ‘λΆν°μ μμ²μ νμ©νλ κΆνμ λΆμ¬νλ λ°©μ
μ£Όλ‘ API νΈμΆ, Ajax μμ²κ³Ό κ°μ λΉλκΈ° μμ²μ λ§μ΄ μ¬μ©λλ€.
μΌλ°μ μΌλ‘ μλ² μΈ‘μμ μλ΅ ν€λμ Access-Control-Allow-Origin ν€λλ₯Ό μ€μ νμ¬ νΉμ μΆμ²λ‘λΆν°μ μμ²μ νμ©νλ€.
ν€λμ κ°μΌλ‘ μΆμ²λ₯Ό λͺ μνκ±°λ, *λ₯Ό μ¬μ©νμ¬ λͺ¨λ μΆμ² νμ©.
FastAPIλ CORSMiddlewareλ₯Ό μ¬μ©νμ¬ CORSλ₯Ό μ¬μ©ν μ μλ€.
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
# νμ©ν μΆμ²
origins = [
"http://localhost.tiangolo.com",
"https://localhost.tiangolo.com",
"http://localhost",
"http://localhost:8080",
]
# λ―Έλ€μ¨μ΄ μΆκ°
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def main():
return {"message": "Hello World"}
add_middlewareμ μΈμλ€μ λ€μκ³Ό κ°λ€.
- allow_origins : κ΅μ°¨-μΆμ² μμ²μ λ³΄λΌ μ μλ μΆμ²μ 리μ€νΈ
- allow_origin_regex : κ΅μ°¨-μΆμ² μμ²μ λ³΄λΌ μ μλ μΆμ²λ₯Ό μ κ·ννμ λ¬Έμμ΄λ‘ λνλ(ex. 'https://.*\.example\.org')
- allow_credentials : κ΅μ°¨-μΆμ² μμ²μ μΏ ν€ μ§μ μ¬λΆλ₯Ό μ€μ , κΈ°λ³Έκ°μ False, TrueμΌ κ²½μ° allow_originsλ λ°λμ νΉμ μΆμ λ₯Ό μ§μ ν΄μΌν¨.
- allow_methods : κ΅μ°¨-μΆμ² μμ²μ νμ©νλ HTTP λ©μλ 리μ€νΈ, κΈ°λ³Έκ°μ ['GET']
- allow_headers : κ΅μ°¨-μΆμ²λ₯Ό μ§μνλ HTTP μμ² ν€λμ 리μ€νΈ, κΈ°λ³Έκ°μ []
- expose_headers : λΈλΌμ°μ μ μ κ·Όν μ μμ΄μΌ νλ λͺ¨λ μλ΅ ν€λλ₯Ό κ°λ¦¬ν΄, κΈ°λ³Έκ°μ []
- max_age : λΈλΌμ°μ κ° CORS μλ΅μ μΊμμ μ μ₯νλ μ΅λ μκ°μ μ΄ λ¨μλ‘ μ€μ , κΈ°λ³Έκ°μ 600
λ―Έλ€μ¨μ΄λ λ κ°μ§ νΉμ ν μ’ λ₯μ HTTP μμ²μ μλ΅νλ€.
- CORS μ¬μ μμ²
- Origin or Access-Control-Request-Method ν€λμ ν¨κ» μ μ‘νλ λͺ¨λ OPTIONS μμ²
- μ΄ κ²½μ° λ―Έλ€μ¨μ΄λ λ€μ΄μ€λ μμ²μ κ°λ‘μ± μ μ ν CORS ν€λμ, μ 보 μ 곡μ μν 200 or 400 μλ΅
- λ¨μ μμ²
- Origin ν€λλ₯Ό κ°μ§ λͺ¨λ μμ²
- μ΄ κ²½μ° λ―Έλ€μ¨μ΄λ μμ²μ μ μμ μΌλ‘ μ λ¬νμ§λ§, μ μ ν CORS ν€λλ₯Ό μλ΅μ ν¬ν¨
'Back-end & Server > FastAPI' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[FastAPI] νμΌ λΆν (0) | 2024.02.23 |
---|---|
[FastAPI] Relational Database (0) | 2024.02.22 |
[FastAPI] κ²½λ‘ μλ μ€μ (0) | 2024.02.20 |
[FastAPI] Form (0) | 2024.02.20 |
[FastAPI] λͺ¨λΈ (0) | 2024.02.20 |