아무래도 서버를 하나 가지고 있으면 향후 편할것 같아서
회사에서 REST API를 하나 구축하고자 하였습니다.
배워보고자 핫하다는 Golang으로 만들었긴 했는데.. 여러개의 프로그램 언어를 하는 것에 회의감이 들어서
결국 옆 동료들이 사용하는 Python으로 만들기로 잠정 마음 먹었습니다.
그래서 Python으로 난생 처음 Web Service를 구축해보고자 합니다.
Flask로는 Rest API 서버를 구축하고, Dash로는 Web을 보여줄까하는데 그 부분은 향후에 소개드릴 수 있으면 소개드리도록 하겠습니다.
시작하겠습니다.
1. IIS 서버를 설치합니다.
Flask 및 Dash와 IIS를 연결할 매개체는 FastCGI라고 하는 기술입니다.
그 두개를 엮어주기 위해선 아래 2개의 기능을 켜야합니다.
2. 웹사이트 만들기
왼쪽 사이트 아이콘에서 마우스 오른쪽키 눌러 웹사이트 추가를 누르면 아래와 같은 창이 뜹니다.
Python 파일을 넣을 폴더를 가운데 빨간색 창(실제 경로)에 입력해줍니다. 그러고 확인을 눌러줍니다.
남은 빈칸은 편한대로 채우시면 됩니다. 제 설정은 http://localhost:8080 입니다.
3. FastCGI 설정 1
좌측에 제가 만든 FastCGI를 더블클릭해주면 다음과 같은 창이 나옵니다.
처리기 매핑을 더블클릭 해줍니다.
오른쪽에 모듈 매핑 추가를 누르시면 나오는 모듈 매핑 추가 창에 아래와 같이 입력합니다.
모든게 다 중요하지만, 설명이 필요한 부분은 실행파일(옵션) 부분일텐데요,
<파이썬경로>|<wfastcgi.py 경로> 로 저는 C:\Python36\python.exe|C:\inetpub\FastCGI\wfastcgi.py 입니다.
저도 죽어라 삽질하긴 했는데.. | 문자 좌우에 빈공백이 없어야합니다.
wfastcgi.py 파일은 pip install wfastcgi 를 입력하셔서 wfastcgi를 설치하시면 얻을 수 있는 파일입니다.
저는 python을 C:\Python36에 설치하였으므로 C:\Python36\Lib\site-packages 경로에 가면 wfastcgi.py 파일을
찾을 수 있었습니다. 이것을 복사하여 홈페이지의 대상이되는 폴더에 저장하도록 합니다.
이걸 굳이 복사하는 이유는 다음 페이지에 설명드릴 부분에서의 제약사항 때문입니다.
만약에 FastCGI를 하나만 실행하실 것이라면 상관 없겠지만, 2개 이상의 FastCGI를 쓴다면 복사를 하시는 것이 좋습니다.
이 내용은 다음 장에서 설명하도록 하겠습니다.
위 내용을 완료하였으면, 요청 제한을 클릭하여 "요청이 다음에 매핑되는 경우에만 처리기 호출"의 클릭을 해제합니다.
3. FastCGI 설정 2
왼쪽에 root를 선택하시면 우측과 같은 창이 나타는데 여기서 FastCGI 설정을 더블클릭 해줍니다.
설정창에 한개의 컬럼이 생겼을것이며 위의 FastCGI 설정 1의 마지막에 Yes를 했기 때문에 생긴건데, 더블 클릭하면 어플리케이션 편집창 보이며 여기서 환경변수에서 컬렉션 편집기를 열 수 있습니다.
처음에는 비어있을텐데, 여기에 2개의 변수를 기입해 줄겁니다.
PYTHONPATH : 홈페이지 메인 폴더 (저는 C:\inetpub\FastCGI\)
WSGI_HANDLER : app.app
아까 위에서 이야기 했던 제약사항이 여기서 생하는데요, 만들어놓은 홈페이지 별로 컬럼이 생기는 것이 아니라 파일 경로 기준으로 컬럼이 생기기 때문에 자신이 만들 사이트의 폴더내에 wfastcgi 파일을 복사하게 되면 경로별로 관리할 수 있습니다. 위에서 언급했듯 한개만 만들거면 python의 site-packages의 경로로 진행하셔도 별 상관 없습니다.
app.app은 조금 있다가 만들어 넣을 파일과 연관이 있습니다. 일단은 진행하도록 합니다.
처음 웹사이트 추가할 때 포트 넘버를 기억해주세요. 저는 8080으로 했습니다.
여기까지 하면 localhost:8080 혹은 127.0.0.1:8080 가 가능하며, 아이피:8080 하면 외부 접속도 가능합니다.
물론 지금 접속하면 아래와 같은 창이 발생하는데 이상한 것이 아닙니다.
app.py 파일 하나를 만들어줍니다.
저장할 경로는 자신의 홈페이지 경로입니다. 저는 C:\inetpub\FastCGI 폴더겠네요.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello from FastCGI via IIS!"
if __name__ == "__main__":
app.run()
다시 접속하시면 예쁘게 잘 뜨는 것을 알 수 있습니다.
여기까지 오셨으면 Python + Flask가 설정이 된거구요.
Dash를 사용하실 분들은 아래 부분을 수정하시면 됩니다.
기억하실텐데, 최상단의 FastCGI 설정에서 컬랙션 편집기에 app.app으로 설정하셨던 것을
app.server로 변경해줍니다.
그러고서 app.py의 내용물을 다음과 같이 변경합니다.
import dash
import dash_core_components as dcc
import dash_html_components as html
from flask import Flask
server = Flask(__name__) # object to be referenced by WSGI handler
app = dash.Dash(server=server)
app.layout = html.Div(children=[html.H1('Hello Dash!'),
html.Div('Dash: Web Dashboard with python'),
dcc.Graph(id='example',
figure={'data':[
{'x':[1,2,3],'y':[4,1,3],'type':'bar','name':'SF'},
{'x':[1,2,3],'y':[2,4,5],'type':'bar','name':'NYC'}
],
'layout':{'title':'BAR PLOTS'}
})
])
if __name__ == "__main__":
app.run_server()
이제 다시 들어가시면 다음과 같은 페이지가 나오면 정상입니다.
실행이 안된다면 직접 저 소스를 실행해보세요. 무엇이 문제인지 알 수 있습니다.
만약 import _brotli, DLL이 없다고 한다면 아래 MS 사이트에서 본인 버젼에 맞는 파일을 설치하시면 됩니다.
LINK : support.microsoft.com/en-gb/help/2977003/the-latest-supported-visual-c-downloads
https://support.microsoft.com/en-gb/help/2977003/the-latest-supported-visual-c-downloads
Cookies are disabled Please enable cookies and refresh the page
support.microsoft.com
Deploying Python web app (Flask) in Windows Server (IIS) using FastCGI
Though windows is not a perfect environment to install python, sometimes situation force you to do it. In this setup, I try to install…
medium.com
참고 사이트2 : stories2.tistory.com/entry/IIS%EC%97%90-Flask-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0
IIS에 Flask 연결하기
늘 C# 과 담을 쌓고 지내왔었기 때문에 당연히 ASP.NET 사용 방법을 몰라왔고, 그 녀석이 존재 하는지도 몰라 왔었다. 하지만 회사 내에서 제 파트는 ASP.NET 을 사용했기 때문에 어거지로 공부를 시
stories2.tistory.com
참고 사이트3 : stackoverflow.com/questions/60322634/deploy-plotly-dash-on-iis
Deploy plotly dash on IIS
I am trying to deploy a plotly dash to IIS. First I followed the instructions in the link: Flask on IIS - James Polera then when i use this script it is works: from flask import Flask app = Flask(
stackoverflow.com