π° FastAPI 곡μλ¬Έμλ₯Ό 보면μ κ°μΈμ μΌλ‘ μ 리ν κΈ μ
λλ€.
μλ΅μν
HTTPμμλ μλ΅μνμ λ°λΌ μνμ½λλ₯Ό λ°ννλ€.
FastAPIμμλ status_code 맀κ°λ³μλ₯Ό μ¬μ©νμ¬ μλ΅μ λν HTTP μν μ½λλ₯Ό μ μΈν μ μλ€.
κ·Έλ¦¬κ³ λͺ¨λ μνμ½λλ₯Ό μΈμΈ νμ μμ΄ fastapiμ νμ ν΄λμ€ statusμμ λ³μλ₯Ό μ°Ύμ μ¬μ©ν μ μλ€.
from fastapi import FastAPI, status
app = FastAPI()
@app.post("/items/", status_code=status.HTTP_201_CREATED)
async def create_item(name: str):
return {"name": name}
Form
Form ν΄λμ€λ₯Ό μ¬μ©νμ¬ Form νλμ λμμ μ μ΄νκ³ μ ν¨μ± κ²μ¬λ₯Ό μνν μ μλ€.
μ£Όμ 맀κ°λ³μλ λ€μκ³Ό κ°λ€.
- default : νλμ κΈ°λ³Έκ°μ μ€μ ν©λλ€. μ¬μ©μκ° ν΄λΉ νλμ κ°μ μ λ ₯νμ§ μμ κ²½μ° μ΄ κ°μ΄ μ¬μ©λ©λλ€.
- title : νλμ μ λͺ©μ΄λ λΌλ²¨μ μ€μ ν©λλ€. μ΄ κ°μ νΌ μμμ λ μ΄λΈλ‘ νμλ©λλ€.
- description : νλμ λν μΆκ° μ€λͺ μ μ€μ ν©λλ€. μ΄ κ°μ νΌ μμμ μ€λͺ μΌλ‘ νμλ©λλ€.
- min_length λ° max_length : μ λ ₯ κ°μ μ΅μ κΈΈμ΄μ μ΅λ κΈΈμ΄λ₯Ό μ€μ ν©λλ€.
- regex : μ λ ₯ κ°μ νμμ μ κ·μμΌλ‘ μ νν©λλ€. μ λ ₯ κ°μ μ΄ μ κ·μκ³Ό μΌμΉν΄μΌ ν©λλ€.
- deprecated : νλκ° μ¬μ©λμ§ μλλ‘ νμν μ§ μ¬λΆλ₯Ό μ€μ ν©λλ€. κΈ°λ³Έκ°μ Falseμ λλ€.
- alias : νλμ λ³μΉμ μ€μ ν©λλ€. μ΄ κ°μ μ¬μ©νλ©΄ νλμ μ΄λ¦μ λ€λ₯Έ μ΄λ¦μΌλ‘ μ¬μ©ν μ μμ΅λλ€.
- geμ le : μ«μ νμμ νλμμ μ¬μ©λλ©°, μ΅μκ° (ge)κ³Ό μ΅λκ° (le)μ μ€μ ν©λλ€.
from typing import Union
from fastapi import FastAPI, Form
from fastapi.responses import HTMLResponse
from pydantic import BaseModel, EmailStr
app = FastAPI()
class UserIn(BaseModel):
username: str
password: str
email: EmailStr
nickname: str
class UserOut(BaseModel):
username: str
email: EmailStr
nickname: str
forms = {
'username': {'min_length': 5, 'max_length': 15, 'title': 'Username', 'description': 'ID'},
'password': {'min_length': 8, 'max_length': 15, 'title': 'Password', 'description': 'ν¨μ€μλ'},
'email': {'min_length': 5, 'max_length': 20, 'title': 'Email', 'description': 'μ΄λ©μΌ'},
'nickname': {'min_length': 2, 'max_length': 8, 'title': 'Nick_Name', 'description': 'λλ€μ'}
}
@app.post("/user/", response_model=UserOut)
async def createUser(
username: str = Form(..., **forms['username']),
password: str = Form(..., **forms['password']),
email: str = Form(..., **forms['email']),
nickname: str = Form(..., **forms['nickname'])
):
user = UserIn(username=username, password=password,
email=email, nickname=nickname)
return user
context = """
<body>
<form method="post" action="/user">
ID : <input type="text" name="username"><br>
PW : <input type="password" name="password"><br>
Email : <input type="email" name="email"><br>
Nickname : <input type="text" name="nickname"><br>
<input type='submit'>
</form>
</body>
"""
@app.get('/')
async def main():
return HTMLResponse(context)
File
Fileμ μ¬μ©νμ¬ ν΄λΌμ΄μΈνΈκ° μ λ‘λν νμΌμ μ μν μ μλ€.
File 맀κ°λ³μλ₯Ό μ¬μ©νμ¬ νμΌμ λ°μ μ μλ€.(Fileμ Formμ μμν μμ ν΄λμ€μ΄λ€.)
from fastapi import FastAPI, File
app = FastAPI()
@app.post("/file/")
async def createFile(file: bytes = File()):
return {"file_size": len(file)}
File λμ UploadFileμ μ¬μ©ν μ μλ€.
- μ€ν νμΌ μ¬μ©(μ΅λ ν¬κΈ° μ νκΉμ§λ§ λ©λͺ¨λ¦¬μ μ μ₯λκ³ , μ΄κ³Όνλ κ²½μ° λμ€ν¬μ μ μ₯)
- μ΄λ―Έμ§, λμμ, ν° μ΄μ§μ½λμ κ°μ λμ©λ νμΌλ€μ λ§μ λ©λͺ¨λ¦¬λ₯Ό μλͺ¨νμ§ μκ³ μ²λ¦¬ κ°λ₯
- μ λ‘λ λ νμΌμ λ©νλ°μ΄ν°λ₯Ό μ»μ μ μμ
- file-like async μΈν°νμ΄μ€λ₯Ό κ°κ³ μμ
- file-like objectλ₯Ό νμλ‘νλ λ€λ₯Έ λΌμ΄λΈλ¬λ¦¬μ μ§μ μ μΌλ‘ μ λ¬ν μ μλ νμ΄μ¬ SpooledTemporaryFile κ°μ²΄ λ°ν
UploadFileμ μμ±μ λ€μκ³Ό κ°λ€.
- filename : λ¬Έμμ΄(str)λ‘ λ μ λ‘λλ νμΌμ νμΌλͺ (μ: myimage.jpg).
- content_type : λ¬Έμμ΄(str)λ‘ λ νμΌ νμ(MIME type / media type)μ΄λ€ (μ: image/jpeg).
- file : SpooledTemporaryFile (νμΌλ₯ κ°μ²΄)μ λλ€. μ΄κ²μ "νμΌλ₯" κ°μ²΄λ₯Ό νμλ‘νλ λ€λ₯Έ λΌμ΄λΈλ¬λ¦¬μ μ§μ μ μΌλ‘ μ λ¬ν μ μλ μ€μ§μ μΈ νμ΄μ¬ νμΌμ΄λ€.
UploadFile μλ λ€μμ async λ©μλλ€μ΄ μλ€. λ΄λΆμ μΈ SpooledTemporaryFile μ μ¬μ©νμ¬ ν΄λΉνλ νμΌ λ©μλλ₯Ό νΈμΆνλ€.
- write(data): data(str λλ bytes)λ₯Ό νμΌμ μμ±νλ€.
- read(size): νμΌμ λ°μ΄νΈ λ° κΈμμ size(int)λ₯Ό μ½λλ€.
- close(): νμΌμ λ«λλ€.
from fastapi import FastAPI, UploadFile
app = FastAPI()
@app.post("/file/")
async def createFile(file: UploadFile):
return {"file": file}
Listλ₯Ό μ¬μ©νμ¬ μ¬λ¬κ°μ νμΌμ μ λ¬ν μ μλ€.
from typing import List
from fastapi import FastAPI, UploadFile
app = FastAPI()
@app.post("/file/")
async def createFile(files: List[UploadFile]):
return {"files": [f for f in files]}
from fastapi import FastAPI, UploadFile
from fastapi.responses import HTMLResponse
import pandas as pd
app = FastAPI()
@app.post("/file/")
async def createFile(file: UploadFile):
contents = await file.read()
df = pd.read_excel(contents)
print(df.head(5))
return {"msg": "success"}
context = """
<body>
<form method="post" action="/file" enctype="multipart/form-data">
file : <input type="file" name="file"><br>
<input type='submit'>
</form>
</body>
"""
@app.get('/')
async def main():
return HTMLResponse(context)
'Back-end & Server > FastAPI' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[FastAPI] λ―Έλ€μ¨μ΄ (0) | 2024.02.20 |
---|---|
[FastAPI] κ²½λ‘ μλ μ€μ (0) | 2024.02.20 |
[FastAPI] λͺ¨λΈ (0) | 2024.02.20 |
[FastAPI] 맀κ°λ³μ (0) | 2024.02.20 |
[FastAPI] λμμ±κ³Ό async / await (0) | 2024.02.19 |