2020. 6. 8. 14:00ㆍ컴퓨터언어/Python
IT는 진짜 너무 빨리 바뀐다.
공식문서마저 그 속도를 못 따라가는 것 같다.
내가 헤로쿠 서버로 오늘 Flask앱을 띄우기까지, 자리에서 한번도 안 일어나고 20번 연속으로 Build해서 겨우 성공한 최신 방법을 소개한다.
<주의> 지금부터 가상환경은 계속 켜놓고 진행한다.
1. main.py( 또는 프로그램 진입점이라고 할 수 있는 파일 )에서 PORT 설정하기
자신이 가진 최상위 루트 <<py>>파일에 다음을 입력하자.
// 아직 os 모듈을 쓰지 않았다면 꼭 추가해주기
import os
// 난 여기서 처음에 __name__ 가 아니라 아무말이나 썼었는데,
// 밑에 app.run() 실행 시 if 분기문과 맞추기 위해 __name__으로 바꿨다.
app = Flask(__name__)
// @app.route("/")를
// 비롯한
// 각종
// 함수들이
// 즐비
if __name__ == "__main__":
port = int(os.environ.get("PORT", 5000")
app.run(host="0.0.0.0", port=port)
2. gunicorn 설치
Heroku는 flask를 바로 인식 못해서 gunicorn을 거쳐가야 한다.
<<터미널>>에 다음을 입력하자.
pip install gunicorn
// 또는 pip3 install gunicorn
3. Procfile 만들기 ( 이 파일은 확장자도 없고 "."도 하나 없다. 심지어 P는 대문자다. )
우선 최상위 루트에 Procfile을 만들자. <<터미널>>에 다음을 입력하거나, 에디터에서 직접 파일을 생성해도 된다.
touch Procfile
Procfile은 내가 공들여 만든 코드들이 서버에서 작동할 수 있도록, Heroku에게 프로그램 진입점을 알려주는 역할을 한다.
마치 로컬에서 실행할 때, python main.py를 입력하는 것을 서버에게 위임하는 것이라고 생각하면 된다.
<<Procfile>>파일을 만들었다면, 그 안에 다음을 입력하자.
web: gunicorn main:app --bind 0.0.0.0:${PORT}
주의사항 1 : 내 python 파일 중 프로그램 진입점(ex. main 함수 포함하는 파일)이 있는 파일:app ☜ 이렇게 쓸 것
주의사항 2 : main:app 사이에는 띄어쓰기 절대 하지 말 것
여기서 많은 글, 심지어 해외 포스팅이 나를 힘들게 했다. 사람들이 app.run() 부분의 코드를 app.py파일안에 따로 넣어놨는지 어쨌는지, main.py가 아닌 app.py로 이름을 지어놓았기 때문에 [web: gunicorn app: app] 이렇게 해놓아서 뭐가 key이고 뭐가 value인지 헷갈렸기 때문이다. 그리고 그런 글들은 보통 최소 몇개월 전에 작성되었다. 결론은 2020년 6월기준, 위에처럼 쓰자.
4. runtime.txt 만들기 : Heroku에게 python 버전을 알려주는 것
runtime.txt를 만들고, 그 파일 안에 다음 한 줄만 쓰고 저장한다.
<<runtime.txt>>에 다음을 입력하자.
python-3.8.3
5. pip freeze 하기 : 내가 코딩하면서 이것저것 다운받았던 pip 모듈들 포장해서 Heroku에게 알려주기
다음 코드를 입력하면 requirements.txt를 자동으로 만들어 준다.
<<터미널>>에 다음을 입력하자.
pip freeze > requirements.txt
6. main.py( 또는 프로그램 진입점이라고 할 수 있는 파일 )가 있는 최상위 루트에서 heroku를 위한 git 생성
이제 내가 가진 코드들과 1~4번까지 한 모든 행동들을 Heroku에게 다 떠맡기고 손 터는 과정이다.
<<터미널>>에 다음 순서대로 입력하자.
git init을 또 한다고 해서 기존 자신이 관리하던 github 로그에 아무 영향을 주지 않으니, 걱정은 하지 말자.
git init
git add .
git commit -m "Heroku~~~~"
git push heroku master
❤️ 축하한다. 됐다.
만약 안된다면 우리는 영어와 친숙한 사람들이기 때문에, 다음 코드를 코드를 입력하면 Heroku가 친절히 요목조목 따져가며 알려줄 것이다.
<<터미널>>에 입력하자.
heroku logs --tail
'컴퓨터언어 > Python' 카테고리의 다른 글
Python & MariaDB 연동하기 (0) | 2021.01.24 |
---|---|
[Flask] Crawling and requests on Flask (0) | 2020.06.02 |
[HTTP 403] 크롤링 접근권한거부 뿌시기 (0) | 2020.05.31 |