호기심 많은 분석가
[Python] 파이썬(Python) Flask로 웹서버에서 ML model 적용시키기 (1) 본문
[Python] 파이썬(Python) Flask로 웹서버에서 ML model 적용시키기 (1)
DA Hun 2021. 5. 4. 12:18포스팅 개요
머신러닝 서비스들을 만들다 보면 이걸 웹이나 앱에서 어떻게 바로 적용할 수 있을까 궁금했습니다. 그러던 중 Flask라는 웹 프레임워크를 알게 되어 공부하고 사용한 경험을 기록한 포스팅입니다.
2021.05.03 - [Machine Learning] - [Machine Learning] Sklearn으로 학습한 model 저장 및 재사용 방법에서 저장한 model을 가지고 작업하겠습니다.
이번 포스팅에서는 ML model을 적용시키기 앞서 Flask의 사용법에 대해 익혀보겠습니다.
포스팅 본문
플라스크(Flask)는 파이썬으로 작성된 마이크로 웹 프레임워크의 하나로, Werkzeug 툴킷과 Jinja2 템플릿 엔진에 기반을 둔다.
그렇다면 웹 프레임워크란 무엇일까?
웹 프레임워크란 웹 프레임워크(web framework, WF) 또는 웹 애플리케이션 프레임워크(web application framework, WAF)는 동적인 웹 페이지나, 웹 애플리케이션, 웹 서비스 개발 보조용으로 만들어지는 애플리케이션 프레임워크의 일종이다. 웹 페이지를 개발하는 과정에서 겪는 어려움을 줄이는 것이 주목적으로 통상 데이터베이스 연동, 템플릿 형태의 표준, 세션 관리, 코드 재사용 등의 기능을 포함하고 있다.
또, 애플리케이션 프레임워크는 무엇인가?
애플리케이션 프레임워크는 소프트웨어 개발자가 응용 소프트웨어의 표준 구조를 구현하기 위해 사용하는 소프트웨어 프레임워크로 구성된다. 즉, 프로그래밍에서 특정 운영 체제를 위한 응용 프로그램 표준 구조를 구현하는 클래스와 라이브러리 모임이다. 간단하게 프레임워크라고도 부른다.
프레임워크는 목적에 따라 효율적으로 구조를 짜 놓는 개발 방식이라고 이해할 수 있습니다.
참조 : https://www.castingn.com/sourcing/kkultip_detail/110
플라스크는 특별한 도구나 라이브러리가 필요 없기 때문에 마이크로 프레임워크라 부른다. 데이터베이스 추상화 계층, 양식 유효성 확인, 기타 기존의 서드파티 라이브러리가 공통 기능을 제공하는 구성 요소가 없다. 그러나 플라스크는 플라스크 자체에서 구현된 것처럼 애플리케이션 기능을 추가할 수 있는 확장 기능을 지원한다. 확장 기능은 객체 관계 매퍼, 양식 유효성 확인, 업로드 관리, 다양한 개방형 인증 기술, 여러 공통 프레임워크 관련 도구들을 위해 존재한다.
파이썬으로 웹 개발을 할 때 많이 쓰이는 프레임워크로는 Django(장고)도 있는 데 Django는 너무 무겁고 기능이 많아서 복잡하다. 내가 필요한 기능만 최대한 라이트 하게 개발을 할 때는 Flask처럼 가벼운 프레임워크가 도움이 된다.
설명은 이만하고 예제를 통해 이해해보겠습니다.
1. Flask로 Hello world from Flask!
Flask에 대해 간단한 예시를 통해 알아보겠습니다. Library 설치는 pip를 통해 간단히 할 수 있습니다.
# pip를 통한 flask 설치
pip install flask
from flask import Flask
# Flask 인스턴스 생성
app = Flask(__name__)
# __name__ : 두 개의 언더스코어, 변수명 등은 파이썬에서 접두사나 접미사로 사용됨
# (__name__ 는 현재 활성 모듈의 이름을 포함한다.)
# 웹 표현 : route() 메소드 사용
@app.route('/')
# 맨 앞에 @가 붙는 것은 장식자(decorator)를 나타낸다.
# flask에서는 이러한 장식자가 URL 연결에 활용된다.
# 장식자를 사용하면 다음 행의 함수부터 장식자가 적용된다.
def hello() -> str : # 결과가 str로 나온다는 어노테이션
return 'Hello world from Flask!'
app.run() # 웹앱 실행 요청
여기서 URL '/'는 다음 행에 정의되어 있는 hello함수와 연결된다. route장식자는 플라스크 서버로 '/'URL요청이 들어왔을 때 어떤 함수를 호출할 것인지를 조정한다. route 장식자는 장식된 함수에서 결과를 반환할 때까지 기다리다가 결과가 반환되면 그 결과를 대기 중인 웹 브라우저로 반환한다.
코드를 파이썬에서 실행하고, 인터넷창에 127.0.0.1:5000을 치면 Hello world from Flask! 가 적힌 사이트로 접속이 된다. 해당 주소는 127.0.0.1:5000/으로 맨 뒤에 route에서 설정했던 /가 붙는 주소를 나타낸다. 만약 / 뒤에 다른 내용을 적으면 해당 내용은 route에서 설정을 하지 않았기 때문에 Not Found 에러가 난다.
1-1. CMD로 Flask 실행하기
위의 내용을 .py 파일로 만들어서, CMD 창에서 실행을 시키면 아래와 같이 Running 화면이 뜬다.
그리고 위와 같이 127.0.0.1:5000으로 접속하면 사이트로 접속된다. CMD로 실행하면 웹상에서 URL을 입력할 때마다 서버로부터 들어오는 메시지를 확인할 수 있다.
- 200: 정상 실행 (127.0.0.1:5000 입력)
- 404: URL이 존재하지 않음(127.0.0.1:5000/a 입력)
- 127.0.0.1과 5000의 의미
현재 우리는 고유 IP를 할당받아 인터넷이 연결된 컴퓨터에서 시험하고 있습니다.
고유 IP가 있음에도 플라스크는 이 IP를 사용하지 않고, localhost라 알려진 인터넷의 루프백 주소 127.0.0.1을 사용합니다. (localhost:5000 == 127.0.0.1:5000)
두 가지 표현 모두 'IP와 관계없이 내 컴퓨터를 지목'할 수 있는 방법입니다. 웹 브라우저에서 플라스크 웹 서버와 상호 동작하려면 웹앱이 실행 중인 주소(127.0.0.1)를 지정해야 합니다. 127.0.0.1은 이런 목적으로 예약된 주소입니다.
URL의 :5000 부분은 웹 서버가 실행 중인 프로토콜 포트 번호입니다. 보통 웹 서버는 인터넷 표준인 프로토콜 포트 80에서 실행되며 표준 포트는 따로 지정할 필요가 없습니다. 예를 들어 브라우저에 oreilly.com:80을 입력해도 오레일리 홈페이지에 접속할 수 있습니다. 다만, orielly.com 만 입력해도 되므로 귀찮게 포트번호까지 입력하지 않을 뿐입니다.
보통 포트 80은 제품 서버에 사용하므로 웹앱을 개발하는 동안에는 80번 포트를 사용하지 않는 것이 관례며 대부분의 웹 프레임워크는 실행할 포트를 지정하는 기능을 제공합니다. 8080 포트가 개발 시 자주 사용되는 포트 중 하나입니다. 플라스크 테스트 프로토콜 포트로 5000번을 사용합니다. (필요하다면 app.run()을 실행할 때 원하는 포트 값을 지정할 수 있습니다.)
2. Flask에 실행문 추가
추가 실행문
특정 문장(phrase)과 특정 알파벳(letters)들이 입력되면, 해당 문장에서 해당 알파벳을 찾는 함수를 웹상에서 나타내려 한다.아래와 같이 코드를 작성하고 해당 파일을 vsearch.py로 저장한다.(저장 위치는 플라스크의 .py파일과 동일한 위치에 저장해야 한다.)
# 추가 실행문 코드
def search4letters(phrase: str, letters: str) -> set:
# phrase: str, letters: str은 입력변수의 어노테이션
# -> set은 결과값이 set 타입으로 나온다는 어노테이션
# set: 집합으로 중복되지 않는 철자들을 가져온다.
# intersection: 중복되지 않는 교집합을 뽑는다.
# Return a set of the 'letters' found in 'phrase'
return set(letters).intersection(set(phrase))
추가 실행문 적용
from flask import Flask
from vsearch import search4letters # vsearch.py 파일을 불러옴
app = Flask(__name__)
@app.route('/')
def hello() -> str : # 결과가 str로 나온다는 어노테이션
return 'Hello world from Flask!'
@app.route('/search4')
def do_search() -> str:
# 문장으로 'life, the universe, and everything'이 입력됨
# 찾으려는 알파벳들은 'eiru,'가 입력됨
return str(search4letters('life, the universe, and everything', 'eiru,'))
app.run() # 웹앱 실행 요청
위와 같이 추가 실행문이 적용되는 것을 볼 수 있습니다.
위의 작업들을 통해 Flask의 기본적인 사용법에 대해 익혀볼 수 있었습니다. 다음 포스팅에서는 조금 심화된 ML model을 적용하는 작업에 대해 진행해보겠습니다. :)
'Coding > Machine Learning & Python' 카테고리의 다른 글
[Python] ImportError : cannot import name 'function' from 'module' (location) 발생 시 (0) | 2021.05.04 |
---|---|
[Python] 파이썬(Python) Flask로 웹서버에서 ML model 적용시키기 (2) (0) | 2021.05.04 |
[Machine Learning] Sklearn으로 학습한 model 저장 및 재사용 방법 (0) | 2021.05.03 |
[Pandas] Pandas 대용량 데이터 처리하기 (0) | 2021.05.02 |
[퓨처스킬] 판다스(Pandas) 기본 (0) | 2021.04.28 |