- fastapi에서 디버깅하기 위해 main.py에 아래와 같은 코드를 작성한다.
if __name__ == "__main__":
uvicorn.run("main:app", host="0.0.0.0", port=8001,reload=True)
- 위 코드를 작성하는 이유는 디버깅 할 때 각 파일(모듈)실행 시, 서버가 켜지지 않기 위함이다.
- 위 코드를 넣는다면 다른 파일에서 main.py를 임포트했을 때, 다른 파일을 실행 시 서버가 켜지지 않도록 할 수 있다.
- 왜냐하면 파이썬에서는 기본적으로 현재 실행하는 파일이
__name__
이 __main__
이지만 해당 모듈을 임포트했을 때는 __name__
이 파일명이 된다.
- 그렇지만 vscode의 launch.json에 아래 부분을 추가해주면 디버거가 uvicorn서버를 직접 시작하므로 If문 설정은 필요 없음
"module": "uvicorn",
"args": [
"main:app",
"--host",
"0.0.0.0",
"--reload",
"--port",
"8001"
],
- 실제로 uvicorn main:app --reload와 같은 명령어를 터미널에서 직접 입력해서 FastAPI 애플리케이션을 실행하는 것이 일반적임
- if문을 사용하면 즉, python main.py라고 입력하면 서버가 시작
- if name == "main": 코드 블록을 사용하면, 스크립트가 임포트되었을 때 서버가 시작되는 것을 방지할 수 있음
- if코드 블록 안의 코드는 스크립트가 직접 실행될 때만 실행됨(ex.
python main.py
)
- 이것은 uvicorn 서버를 시작하는 코드를 포함하여 모듈이 임포트 될 때 실행되지 않도록 하기 위함
- if코드를 스크립트에 포함시키면 vscode 디버거 없이도 스크립트를 각각 직접 실행하여 유비콘 서버를 시작할 수 있음
- 스크립트가 임포트 되었을 때, 일반적으로는 스크립트 전체가 실행되지 않기를 원함
- 이 스크립트는 라이브러리 혹은 모듈처럼 동작하며, 특정 기능만 필요로 하기 때문
- 이런 경우에 if name == "main":은 아주 유용
- 이 조건문을 스크립트에 포함시키면, 디버거 없이도 스크립트를 직접 실행하여 uvicorn서버를 시작할 수 있음
- 디버거를 사용하지 않고 터미널에서 python main.py와 같은 명령을 내려도 fastapi앱이 동작하게됨
디버거를 사용하지 않고 디버깅을 할 때 아래 코드를 넣는 이유가 각각의 스크립트를 직접 실행하면서 디버깅 하기 위함
if __name__ == "__main__":
uvicorn.run("main:app", host="0.0.0.0", port=8001,reload=True)
- 위 코드를 main.py에 적고 각각의 스크립트를 직접 실행 시키면서 디버깅하는 것과
2.vicorn main:app --reload 명령어를 직접 실행시키면서 각각의 스크립트를 직접 실행시키는 것이 똑같다.
(이 부분이 다른 것 같아서 매우 헷갈렸다..그렇지만 똑같다.)