bottle.py 과 daemon 으로 심플 웹 데몬 만들기!!!

가끔씩 개발을 하다보면, 사용 수는 하루에 몇 건 안되지만 서비스를 제공해 줘야 할 경우가 생긴다.

그리고 이런 경우, 로직이 복잡한 경우도 별로 없을 때도 많다.(이건 만구 내 생각임 ㅋㅋㅋ)

이럴 때, 뭔가 서버를 동작하기 위해서 셋팅 하기는 애매할 경우 가 많다. 그래서 소개하는 것이 초경량 Python Web Framework 인 bottle 이다. bottle은 bottle.py 라는 파일 하나에 필요한 내용이 모두 들어있다.

그래서  너무나 간단하게 사용할 수 있다.(http://bottlepy.org)

다음 예제를 보자.

from bottle import route, run

@route('/hello/:name')
def index(name='World'):
    return '<b>Hello %s!</b>' % name

run(host='localhost', port=8080)

이 간단한 예제만으로 http://localhost:8080/hello/world 로 접속하면 Hello World! 가 출려된다.

그런데 bottle.py는 너무 간단한 프레임워크라 Daemon으로 동작하지가 않는다. 즉 Shell의 Connection 이 끊기거나 하면 바로 종료되게 되는데, 이 때 사용할 수 있는 방법이 크게 2가지가 있다.

1. Screen 을 이용한다.

사실 이건 꽁수다. Screen을 이용하면 Shell 자체의 Connection이 끊기지 않는 다는 점을 이용해서 Screen 으로 실행을 시킬 수 있다.

2. Daemon Library를 이용한다.

python-daemon 이라는 라이브러리가 있다.(http://pypi.python.org/pypi/python-daemon)

이걸 이용하면 굉장히 쉽게 Daemon 으로 동작하게 만들 수 가 있다.

다음은 Daemon Library 의 사용 예제이다.

import daemon

from spam import do_main_program

with daemon.DaemonContext():
    do_main_program()

이것도 굉장히 쉽다. 결국 2개를 결합하게 되면

from bottle import route, run
import daemon

@route('/hello/:name')
def index(name='World'):
    return '<b>Hello %s!</b>' % name

def start_server():
    run(host='localhost', port=8080)

with daemon.DaemonContext():
    start_server()
 
Daemon 만들기 귀찮을 때 열심히 써먹어보자.