일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- FOREIGN KEY
- timestamp
- SUM()
- 파이썬
- 외래키
- datetime
- floor
- python
- 큰 수 나누기
- 소수
- lower_case_table_names
- Dictionary
- flask
- 리스트 컴프리헨션
- 에라토스테네스의 체
- list comprehension
- 딕셔너리
- convention
- BOJ
- 2557
- ceil
- Codeforces
- project euler
- itertools
- mysql
- 세그먼트 트리
- SUM
- 네이밍
- 자료구조
- enumerate
- Today
- Total
늒네 기록
[flask] 파일 받아와서 저장하기 - 1 본문
https://flask.palletsprojects.com/en/1.1.x/patterns/fileuploads/
해당 페이지의 내용을 읽으면서 필요한 부분을 가져와서 사용해보며 포스트를 작성했다.
위 도움말 페이지의 코드에서 에러 처리 부분을 없애고 저장 부분만 남긴다면 아래와 같은 코드가 될 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
from flask import Flask, request
from werkzeug.utils import secure_filename
app = Flask(__name__)
@app.route('/submit', methods=['POST'])
def submit():
f = request.files['file']
f.save('./files/' + secure_filename(f.filename))
return 'done!'
if __name__ == '__main__':
app.run()
|
cs |
주요 내용을 한 줄씩 뜯어보자.
8번 줄에서는 post 방식으로 보낸 리퀘스트에서 file을 받아 변수 f에 넣어주었다.
- 서버가 파일이 포함된 리퀘스트를 받으면 파일은 request.files['file']에 포함되어있다. 이때, f의 타입을 받아서 프린트해보면 <class 'werkzeug.datastructures.FileStorage'>라고 나오는데, 이 클래스에 대한 좀 더 자세한 설명은 아래 링크에 나와있다.
https://werkzeug.palletsprojects.com/en/1.0.x/datastructures/#werkzeug.datastructures.FileStorage
9번 줄에서는 받은 파일을 '{앱이 실행되고 있는 경로}/files/{파일 이름}' 경로에 저장한다.
- 위의 자료구조 링크를 보면 알 수 있는데, f.filename으로 리퀘스트에 실려온 파일의 이름을 받을 수 있다.
- f.save로 특정 경로에 파일을 저장할 수 있다. 위의 코드에서는 파일이 저장될 폴더를 직접 써놓았지만, 업로드 폴더를 app 레벨에서 지정해주는 것이 가능하다. 이에 대해서는 다음 글에서 좀 더 설명하도록 하겠다.
- secure_filename이라는 함수를 통해 파일 이름을 받아왔다. 이렇게 하는 이유는, 글 도입부에 걸어놓은 링크에도 잘 설명되어있지만, 어떤 유저가 절묘하게 파일 이름을 '../../../home/username/.bashrc' 같은 걸로 해두고 저장했더니 실제 경로 depth가 딱 맞아떨어져서 해당 파일이 바꿔치기 당할 위험이 있는데, secure_filename함수가 이런 일을 미연에 막아주기 때문.
위의 코드로 도는 서버를 올린 다음, 코드가 실행되고 있는 경로에 files라는 폴더를 만들고, /submit 주소로 파일을 포함하여 post 리퀘스트를 보내면, 보낸 파일이 files 폴더에 저장되는 것을 확인할 수 있다.
다음 글에서는 도입부 튜토리얼에서 어떤 예외처리를 했는지 살펴보고,
그 다음 글에서는 파일을 담은 post 리퀘스트를 날려보는 실습을 하기 위해 postman을 쓰는 방법을 살펴볼 것이다.
'서버 공부 기록 > python flask' 카테고리의 다른 글
[flask] 라우팅 (1) (0) | 2020.10.01 |
---|---|
[flask] 시작하기 (0) | 2020.09.27 |