brunch

You can make anything
by writing

C.S.Lewis

by 유윤식 Nov 14. 2021

Python & FastAPI

#진짜 FAST, #GO, Node.js 만큼 FAST

한 1년전부터 Flask에서 FastAPI로 바꿔서 백엔드 Rest API를 만들어 사용했다.


FastAPI를 통해서 FileUpload 기능을 사용해보려고 한다.

간단한 파일을 올려서 업무에 필요한 기능을 구현하는 목적이 있다.


File, UploadFile Module


main.py


from fastapi import FastAPI, File, UploadFile

from fastapi.staticfiles import StaticFiles

from utils import Utils


app = FastAPI()
app.mount("/static", StaticFiles(directory="static"), name="static")



@app.post("/uploadfile/", tags=["files"])
async def create_upload_file(files: List[UploadFile] = File(...)):
    files_upload = []
    utils_upload = Utils()

    for file in files:
        res = await utils_upload.chunked_copy(file)
        files_upload.append(res)
    return {"results": files_upload}


utils.py


import os
from pprint import pprint as pp
from fastapi import File


class Utils:
    def __init__(self):
        self.RANDOM_COUNT = 0
        self.DESTINATION = "static/img/"


    async def chunked_copy(self, file: File):
        file_exitst_chk = os.path.join(self.DESTINATION, file.filename)

        while os.path.isfile(file_exitst_chk):
            fname, fextension = os.path.splitext(file.filename)
            pp(os.path.splitext(file.filename))
            file_exitst_chk = os.path.join(self.DESTINATION, f"{fname}_{self.RANDOM_COUNT}{fextension}")
            self.RANDOM_COUNT += 1


        with open(file_exitst_chk, 'wb') as fw:
            contents = await file.read()
            fw.write(contents)
            self.RANDOM_COUNT = 0

        return file_exitst_chk


터미널에서

sik@Sikui-MacBookAir tutorial % uvicorn main:app --host 0.0.0.0 --port 8080 --reload

실행해주고,


Swagger 에서 확인을 해보면 파일을 올릴 수 있는 Form이 보이는데,

이렇게 파일 3개를 올리고 Execute 를 눌러주면,


이렇게 Response를 받아 볼 수 있다.

실제로 static folder 에서 위 파일을 확인해 볼 수 있다.


음.. 이제 저 파일을 어떻게 다운로드 받을 수 있을까?

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari