Python 플라스크 웹서버 구축하기

파이썬(Python)에서 웹서버나 API서버를 구축하려고 할 때, 플라스크(flask)를 사용하면 간단하게 웹서버를 구축할 수 있다. 이번에는 파이썬에서 플라스크(flask)를 이용해서 웹서버 설치 필요없이 웹 애플리케이션을 만들어 웹브라우저에서 호출해 보고 라우팅, JSON 출력 및 파일 다운로드까지 진행해본다.

정의

플라스크(Flask)는 경량의 WSGI(Web Server Gateway Interface) 웹 애플리케이션 프레임워크이다. 빠르고 쉽게 시작할 수 있도록 설계되었으며 복잡한 애플리케이션으로 확장할 수 있다.

설치

파이썬은 이미 설치가 되어 있다고 가정하고 명령 프롬프트에서 아래 명령으로 플라스크 설치를 진행한다.

pip install flask
Flask를 설치하는 모습
Flask를 설치하는 모습

기본 애플리케이션

빠르게 시작하기 문서를 참고하여 웹 브라우저로 접속하면 ‘Hello World!’를 출력하는 파이썬 코드는 다음과 같다. 코드를 작성하고 hello.py로 저장한다.

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

이제 작성된 코드를 아래 명령어로 실행한다. 추가로 네트워크상에 있는 사용자들을 신뢰할 경우 메소드 호출을 app.run(host=’0.0.0.0′)으로 하여 서버의 접근을 오픈한다.

python hello.py
콘솔에서 작성한 코드를 실행
콘솔에서 작성한 코드를 실행

이제 웹브라우저에서 http://127.0.0.1:5000으로 결과를 확인한다.

웹 브라우저에서 http://127.0.0.1:5000 호출하여 결과를 확인한다
웹 브라우저에서 http://127.0.0.1:5000 호출하여 결과를 확인한다

웹 애플리케이션이 호출될 때 마다 로그가 콘솔에 표시된다
웹 애플리케이션이 호출될 때 마다 로그가 콘솔에 표시된다

라우팅

이제 라우팅을 적용해 본다. /(루트) 일 때에는 ‘Index Page’를 출력하고, /hello 일 때에는 ‘Hello World’를 출력하는 코드는 다음과 같다.

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
	return 'Index Page'

@app.route('/hello')
def hello():
	return 'Hello World'

if __name__ == '__main__':
    app.run(host='0.0.0.0')

JSON 응답

API 제작이나 테스트를 위해 JSON 응답이 필요할 경우에는 다음과 같이 코드를 작성한다. 코드에서 jsonify를 사용하므로 설치가 필요하다.

pip install jsonify

최신 펌웨어 버전과 펌웨어 파일 경로를 json으로 출력하는 시나리오를 가정하고 다음과 같이 코드를 작성한다.

from flask import Flask, jsonify

@app.route('/api/get_fw_info')
def getFwInfo():
	return jsonify({"version": "2024111300001", "url": "http://localhost:5000/firmware/2024111300001.bin"})

if __name__ == '__main__':
    app.run()

이제 http://localhost:5000/api/get_fw_info 를 호출하면 다음과 같이 JSON 출력을 확인할 수 있다.

웹브라우저에서 호출하여 json 출력이 표시된 모습
웹브라우저에서 호출하여 json 출력이 표시된 모습

파일 다운로드

파일 다운로드도 간편하게 지원한다. 펌웨어 파일 다운로드를 지원하는 시나리오를 가정하고 다음과 같이 코드를 작성한다.

from flask import Flask, jsonify, send_file

@app.route('/firmware/2024111300001.bin')
def firmware2024111300001():
    return send_file("2024111300001.bin", mimetype="application/x-binary", as_attachment=True)  

if __name__ == '__main__':
    app.run()

이제 http://localhost:5000/firmware/2024111300001.bin를 호출하면 해당 파일을 다운로드 할 수 있다.

최종 코드

지금까지 진행한 작업이 모두 포함된 코드는 아래와 같다.

from flask import Flask, jsonify, send_file
app = Flask(__name__)

@app.route('/')
def index():
	return 'Index Page'

@app.route('/hello')
def hello():
	return 'Hello World'

@app.route('/api/get_fw_info')
def getFwInfo():
	return jsonify({"version": "2024111300001", "url": "http://localhost:5000/firmware/2024111300001.bin"})

@app.route('/firmware/2024111300001.bin')
def firmware2024111300001():
    return send_file("2024111300001.bin", mimetype="application/x-binary", as_attachment=True)    

if __name__ == '__main__':
    #app.run()
    app.run(host='0.0.0.0')

마치며

플라스크(flask)로 기본 웹서버 동작부터, 라우팅, JSON 출력 및 파일 다운로드까지 간단한 API의 역할을 하는 웹 애플리케이션을 쉽고 빠르게 구축할 수 있었다. 간단한 응용 서비스 API나 테스트 환경 구축 시에는 번거로운 웹서버 구축이 필요하지 않아 매우 편리하다.

Leave a Comment