본문 바로가기
개발환경/Web Server

Python: Web Framework Flask 사용하기

by Kibua20 2020. 8. 18.

Python의 Web framework인 Flask을 활용해서 간단한 Web 서버와 REST API를 처리할 수 있습니다.  또한 Python Flask를 활용하면 Python 언어의 장점인 편리함을 그대로 활용 가능하며, 간단한 Web Application을 구성할 수 있습니다. Flask에 대한 개념 및 예제 코드에 대한 설명은 아래 동영상은 참고해주세요.  Flask의 공식 사이트는 샘플 코드 및 설명을 제공합니다.

Flask 개념 및 설명 (출처: https://www.youtube.com/watch?v=s_ht4AKnWZg)

 

1. Flask 설치 

Python이 설치된 상태에서 pip로 flask 모듈을 추가 설치합니다.

 

# macOS/Linux

$ sudo pip3 install flask

 

# Windows

pip install flask

 

2. A Minimal Application (Hello World)

Flask의 Hello Word app은 링크에 설명되어 있습니다.  Flask를 구동하는 app.py을 작성하고  터미널에서 FLASK_APP을 app.py로 지정하고 flask run을 실행합니다.

 

app.py 작성

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

#app.py

from flask import Flask
app = Flask(__name__)

@app.route("/")
def home():
    return "Hello, Flask!\n"

$ export FLASK_APP=app.py
$ export FLASK_ENV=development
$ flask run

 

Flask를 구동하면 5000번 Port가 기본 설정된 포트이고,  http://127.0.0.1:5000 (local host)로 접속하면 서버의  home()가 실행됩니다.  아래 실행 화면에서 상단이 서버 동작 화면이고 하단이 웹 브라우저로 접속한 화면입니다.

Flask Minimal application 접속 화면 

 

디버그 모드 설정

$ export FLASK_ENV=development 의미는  Debugger 모드 설정하는 것입니다.  디버거 모드를 설정하면 1) it activates the debugger 2) it activates the automatic reloader3) it enables the debug mode on the Flask application  로 동작하고, 상용 버전에서는 Security를 보장할 수 없기 때문에 사용하면 안 됩니다. 

 

외부 Network에서 접근 가능하도록 flask 실행

flask run 실행 시 --host=0.0.0.0 을 설정하여 외부 Network에서도 접근이 가능도록 설정할 수 있습니다. 

 

$ flask run --host=0.0.0.0

This tells your operating system to listen on all public IPs.

 

Flask를 local machine에서만 실행

 

동적 URI 처리하기 

웹 브라우저에서 동적 URI 처리하는 방법은 @app.route 에 처리하는 URI를 명시적으로 작성하면 가능합니다.  예를 들어 @app.route('/user/<username>') 은  http://loalhost:5000/user/<username>을 처리합니다. 

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

from flask import Flask
app = Flask(__name__)

from markupsafe import escape

@app.route('/user/<username>')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s\n' % escape(username)

@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d\n' % post_id

@app.route('/path/<path:subpath>')
def show_subpath(subpath):
    # show the subpath after /path/
    return 'Subpath %s\n' % escape(subpath)

실행 결과는 아래와 같습니다. 

Flask 동적 URI 처리

 

우분투에서 Flask 서비스 등록하기 

Sudo 권한이 있는 경우에는 링크1 또는 링크2 방법을 적용 가능합니다. sudo 권한이  없는 경우 터미널에서 백그라운드에서  아래와 같이 nohup으로 실행 가능합니다.  nohup은 script을 데몬 형태로 실행하는 명령이고,  명령어 마지막 줄의  '&' 의미는 백그라운드로 실행하는 명령어입니다. 

 

# sudo 권한이 있는 경우 

$ systemctl 명령어 사용 --> (상세 내용) https://kibua20.tistory.com/115

 

#sudo 권한이 없는 경우

$ nohup python app.py > app.log &

Web에 Flask 서버 올리기

Google Cloud VM에 아래와 같이 Flask 서버를 구동하고 외부 IP로 접속하기 위해서는 Flask에서 설정한 포트에 대한 방화벽 설정을 먼저 설정해야 합니다. 방화벽 해지하는 방법은 이전 포스팅을 참고해주세요. 

※  Python FastCGI 설명

https://flask.palletsprojects.com/en/1.1.x/deploying/fastcgi/

 

※  Flask Deploy 방법

https://flask.palletsprojects.com/en/1.1.x/deploying/

 

관련 글

[개발환경/Web Server] - 우분투 20.04에서 lighttpd의 fastcgi 개념 및 사용법

[개발환경/Web Server] - Web 서버 GET/POST CGI 사용법 (QUERY_STRING / CONTENT_LENGTH)

[개발환경/Web Server] - 우분투 20.04에서 lighttpd CGI 설정 방법 및 C와 Python 예제 코드

[개발환경/Web Server] - 우분투 20.04에서 lighttpd Web Server 설치 (Embedded용으로 활용 가능)

[개발환경/Web Server] - 우분투 20.04에서 Web 서버 설치 방법 (apache2, tomcat9)

[모바일 SW 개발/REST API] - Google Gmail API 사용 방법 (1) - Sample code

[개발환경/Google Cloud Platform] - GCP(Google Cloud) 방화벽 설정: 프로토콜과 포트를 사용 허용 또는 거부하기

[개발환경/Google Cloud Platform] - Google Cloud Platform을 활용하여 평생 '무료' PC 만들기

[모바일 SW 개발/Python] - Python: OSError: [Errno 98] Address already in use (Flask)




댓글