본문 바로가기
WebFramework/Python Flask

[Python Flask] 1. Flask 서버 구동 및 간단한 페이지 만들기

by Rosmary 2024. 2. 26.
728x90
반응형

 

 

 

 

최근 많이 쓰이는 프로그래밍 언어는 거의 대부분 웹 프레임워크를 지원한다. 유명한 Java의 경우, JavaSpring과 Springboot가 있듯이, Python 역시 Django와 Flask라는 웹 프레임워크를 통해 쉽게 웹 서버를 제작할 수 있도록 하고 있다. 

 

필자는 사실 약 3년 전에 Django를 먼저 접했다. 하지만 언제나 그랬듯이(?) Django도 건드리다 말다가를 반복하다가 그 주기가 길어지면서 제대로 된 포스팅을 진행하고 있지 않은 상태다 (다행인 점은 곧 Django도 마무리를 위해 포스팅을 진행할 만한 여력이 많이 생겼다는 것...) 

 

그 와중에 Flask라는 웹 프레임워크를 잠깐 접하게 되었는데, Flask를 잠시나마 사용해보니 오히려 Django보다 구조는 조금 더 단순한 듯 하다. 이는 Django와 달리 Flask는 사용자가 모든 것을 처음부터 하나씩 만들어야 된다는 의미지만, 반대로 생각하자면 단순한 웹 사이트는 Django보다 Flask를 사용하는게 조금 더 효율성이 높을 것이라는 생각이 든다.

 

필자도 개발을 하긴 했지만 대부분이 Linux 터미널에서만 동작하는 것만 개발해서 웹은 익숙하지가 않은 상태인데, Flask는 조금만 익숙해지면 Django와 달리 금방 사용하는데는 무리가 없겠다는 생각이 든다. 

 

그래서... 또 포스팅 프로젝트를 열었다... 이번엔 마무리 할 수 있겠지...

 

 

 

1. Flask 프로젝트 생성

 

필자가 몇 년 전에 작성한 첫 Django 포스팅을 보면 알겠지만, Django 모듈을 PIP로 설치한 뒤에 해야할 것들이 무진장 많다. SQLite DB 버전도 Python 버전과 알맞게 설치해주어야하고, Django 프로젝트를 생성하면 나타나는 여러 폴더와 파일에 대한 이해도 필요하며, 실행 전 DB Initiation도 해야하는 등등등... 웹 페이지 하나 만들어보기가 여간 어려운 것이 아니다. 

 

반면 Flask는 단순히 PIP 모듈만 다운받으면 아주 간단한 웹 페이지를 만들기까지 크게 진행할 내용이 없다. 끽해봐야 Front-End 파일을 저장할 templates 파일과 Flask를 구동할 Python 파일 하나만 있으면 된다. 물론 그렇기 때문에 Django처럼 서버 구동 시 로켓이 날라다니는 그림이 뜬다던가 하는 것 없이 그냥 빈 페이지만 나타난다. 

 

그럼 Flask 프로젝트를 시작해보자. 필자는 PyCharm Community Edition에서 프로젝트를 venv로 생성하고, 여기에 flask 모듈을 pip로 설치했다. 설치한 Flask 버전은 현재의 최신 버전인 3.0.2다.

프로젝트 내에서 flask가 제대로 설치되었다면 사진 왼쪽 아래처럼 installed 항목에 flask가 나타난다

 

Flask 모듈의 다운로드 및 설치가 완료되었다면, Flask 사용을 위해 Python 파일을 하나 생성한다. 필자는 이 파일을 index.py로 지정하려한다. 

 

 

 

생성이 완료되면 프로젝트 폴더 내에 index.py라는 python 폴더가 생성된다. 

프로젝트 생성은 이게 끝이다(응?)

 

 

2. 간단한 GET 페이지 제작

 

필자가 지금까지 웹 페이지와 관련된 포스팅의 초반에 항상 진행해 왔던대로, 브라우저를 통해 필자의 웹 서버로 접근하면 필자가 설정한 글자가 나타나도록 app.py를 수정해보려 한다. 

 

우선은 정말 간단하게 화면에 Hello Flask~! 라는 문구가 출력되도록 만들어보려한다.

 

(1) Flask 파일 코드 구성

 

Flask 서버를 구동하기 위한 Python 파일은 (너무 당연하게도) flask 모듈을 import하는 것으로부터 시작한다. 이 flask 모듈은 HTML 페이지 렌더링 뿐만 아니라 서버를 생성하여 구동하는 함수까지 구현이 되어 있다 (Eclipse에서 Spring 실행하려고 서버 설정하던거 생각하면 Flask는 천사다).

 

필자가 Flask 서버로 구동하려는 index.py 파일의 내용은 아래와 같이 이루어져 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from flask import Flask
 
# Flask 인스턴스 생성
# 보통 app = Flask(__name__) 형태로 사용함.
first_app = Flask(import_name="first_app")
 
# 메인 페이지 호출부 작성.
# Flask 인스턴스 내 route decorator로 웹 접근 경로 지정
@first_app.route('/')
def index():
    return "Hello Flask~!"
 
# 본 파일 직접 실행 시, Flask 서버 구동
if __name__ == "__main__":
    first_app.run()
 
cs

 

 

몇 줄 안 되는 코드지만 한 번 살펴보자. 먼저 Flask 클래스 사용을 위해 flask.Flask 클래스를 import 받는 부분부터 시작한다. 다음으로 받아온 Flask 클래스로부터 Flask의 인스턴스를 생성하는데, 이 인스턴스는 웹 브라우저로부터 들어온 사용자의 요청을 받아 적절한 페이지를 돌려주는 역할 및 서버 구동과 관련된 매서드들이 들어있다.

 

바로 아래 줄에는 decorator로 Flask 인스턴스의 매서드인 route()가 호출된 것이 보이는데, 이는 route() 매서드의 매개변수로 입력된 웹 페이지의 경로에 대한 작업을 decorator 아래에 정의된 함수로 실행하겠다는 의미다. 위의 코드는 필자의 서버 IP 및 5000번 포트(Flask 기본 포트다)의 최상위 폴더로 접근 시, "Hello Flask~!"라는 문구가 출력되도록 한 것이다.

 

마지막 줄은 index.py 파일 실행 시, Flask 인스턴스를 run() 매서드로 동작시킴으로써, Pycharm에서 (또는 OS에서 직접) 웹 서비스를 구동하도록 하는 코드다. 

 

Pycharm의 가상환경 내 Terminal에서 index.py 파일을 실행시키면 아래와 같이 localhost 및 5000번으로 서버가 구동된다는 문구가 출력된다. 

 

서비스가 구동된 상태에서 웹 페이지 접속(127.0.0.1:5000 또는 localhost:5000)을 진행하면 아래와 같이 필자가 원하는 대로 "Hello Flask~!" 문구가 출력됨을 확인할 수 있다.

 

 

(2) 특정 페이지를 Rendering 할 수 없을까? 

 

여기서 의문이 생긴다. 

 

"웹 페이지는 HTML 태그로 이루어져있는데, 조금 더 복잡한 코드라면 어떻게 해야 하나요? 일일이 text로 HTML 태그 만들어서 return 해야하나요?"

 

 

 

뭐... 안되는 건 아닌데, head 태그랑 이런 것까지 python 코드로 작성하려면 이것도 일이다. 불굴의 의지를 가지고 python으로 모든 것을 작성할 수는 있겠지만, 나중에 웹 서비스 게시하고나서 누군가가 "어!! 여기 페이지 태그 좀 수정해야겠네요" 라고 한 마디 하는 순간에 python 파일을 일일이 들여다봐야하는 수고로움까지 감당하기에는 너무 피곤해진다. 

 

다행히도 flask 모듈은 외부의 HTML 파일을 읽어 반환하는 함수를 가지고 있다. render_template라고 불리는 함수인데, 이 함수는 이름에서도 알 수 있듯이 특정 HTML 템플릿을 읽어 내용을 String으로 반환하는 역할을 한다. 함수 내부에는 반환하고자 하는 HTML 파일의 경로를 지정해주면 된다. 단, Flask는 flask를 구동하는 python 파일과 동일한 위치에 있는 templates 폴더 내에 있는 HTML 파일만을 인식하도록 설정되어 있다. 

 

프로젝트 내에 templates 폴더를 만들고, index1.html 파일은 templates 폴더에, 그리고 index2.html 파일은 index.py와 동일한 위치에 지정시켜보려한다. 

 

 

 

이제 render_templates 함수로 파일들을 잘 읽어오는지 index() 함수에서 확인해보자.

 

 

templates 폴더 내에 있는 index1.html 파일은 render_template() 함수로 호출 시, 그 내용을 잘 읽어오는 것이 확인된다 (확인하려면 서버 재구동 후 사이트로 다시 접속해보자). 이제 render_template() 매개변수를 "index2.html"로 변경해보자.

 

 

 

Flask가 의미하는 것은 "templates 폴더에서 index2.html 파일 못 찾았어"라는 아주 단순한 것이다. 즉, 웹 페이지에서 서버 호출로 돌려주고자 하는 HTML 페이지는 render_template 함수로 html 페이지의 경로를 지정함으로써 진행할 수 있으며, html 파일은 반드시 templates라는 폴더에 저장되어 있어야 함을 알 수 있다.

 

render_templates는 HTML 파일의 내용을 반환하기 때문에 조금 더 수정을 진행하면 원하는 페이지가 화면에 호출되도록 만들 수 있다. 이번에는 필자가 아주 오래 전에 만든 HTML 페이지가 화면에 표시되도록 만들어보려한다.

 

저 html 파일은 만들어놓고 오래도 우려먹는다...

 

 


 

다음 포스팅에서는 HTML에서의 입력값을 받아 Python에서 처리하는 로직에 대해 알아보려한다. 

 

 

END.

반응형

댓글