파이썬 flask로 데이터 업로드 할때.

해당 코드에서 제출 누르면 form action에 의해 http://localhost:5000/fileUpload 로 연결되서 파일 업로드하는 걸로 이해했는데요...

upload.html

<html>
   <body>
      <form action = "http://localhost:5000/fileUpload" method = "POST"
         enctype = "multipart/form-data">
         <input type = "file" name = "file" />
         <input type = "submit"/>
      </form>
   </body>
</html>

upload.html파일만 만들었지, 따로 fileUpload라는 html파일을 만들지도 않았는데, 전송이 가능하더라고요.. 어떻게 전송이 가능한지 알고 싶습니다. @app.route('/') 이부분이 로컬주소로 부터 받아오는 부분으로 알고있고, return이 값 보내는 부분으로 알고있었는데.. 헷갈리네요ㅠ 도움주시면 감사하겠습니다.

flask_upload.py

from flask import Flask, render_template, request
from werkzeug import secure_filename
app = Flask(__name__)

#업로드 HTML 렌더링
@app.route('/upload')
def render_file():
   return render_template('upload.html')

#파일 업로드 처리
@app.route('/fileUpload', methods = ['GET', 'POST'])
def upload_file():
   if request.method == 'POST':
      f = request.files['file']
      #저장할 경로 + 파일명
      f.save(secure_filename(f.filename))
      return 'uploads 디렉토리 -> 파일 업로드 성공!'

if __name__ == '__main__':
    #서버 실행
   app.run(debug = True)

1답변

  • 좋아요

    0

    싫어요
    채택취소하기

    "따로 ~라는 html파일을 만들지도 않았는데, ~이 가능"하게 하려고 구현한 게 바로 그 라우팅이라는 겁니다.

    라우팅(영어: routing)은 어떤 네트워크 안에서 통신 데이터를 보낼 경로를 선택하는 과정이다. 위키백과

    # 플라스크: "앗! 사람들이 http://localhost/upload 로 접속하면 어디로 보내주지?
    @app.route('/upload')
    
    # 그런 HTTP 요청은 이 함수가 처리하게 해줘야겠다!"
    def render_file():
    
        # 함수: "네 뭐 그러세요. 난 그냥 upload.html 파일 템플릿 가지고 화면 그려서 돌려주면 되니까."
        return render_template('upload.html')
    
    # 플라스크: "헉 근데 사람들이 http://localhost/fileUpload 경로로 접속을 하면 그건 또 어디로 보내줘야 되지?
    @app.route('/fileUpload', methods = ['GET', 'POST'])
    
    # 그 HTTP 요청은 이 함수보고 알아서 하라고 해야지!"
    def upload_file():
    
        # 함수: "아 그래요? 그러면 그 HTTP 요청의 메소드가 마침 POST일 때는
        if request.method == 'POST':
    
            # 아마 그 요청의 body에 담긴 파일업로드 파트에서 "file"에 할당된 데이터가 뭔가 있을테니까
            f = request.files['file']
    
            # 그걸 그대로 적당한 파일명 줘서 저장한 다음에
            f.save(secure_filename(f.filename))
    
            # 알림 메시지 돌려주고 끝내겠습니다."
            return 'uploads 디렉토리 -> 파일 업로드 성공!'
    

    더 정확한 해설이 필요하시다면 공식 문서를 읽어보세요.

    • 오오 친절한 설명 감사합니다! 이해가 쏙쏙되네요 ㅎ 감사합니다! jaeuk412 2018.10.11 10:01

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.