- 작성시간 : 2014/12/03 13:11
- 퍼머링크 : mcchae.egloos.com/11143246
- 덧글수 : 3
예전 파이썬의 웹 프레임워크를 살펴본 적이 있습니다.
최근에 아주 간단하게 REST API를 꾸미는데 어떤
파이썬 프레임워크가 좋을지 살펴보다가 Flask 로 구성을 해 보기로 하였습니다.

우선 설치는 다음과 같이 간단합니다.
sudo pip install Flask
sudo pip install --upgrade --force-reinstall flask_restful
실제 작성하는 뼈대도 무척 간단합니다.
##########################################################################################
from flask import Flask
from flask.ext.restful import reqparse, abort, Api, Resource
from flask import request
##########################################################################################
app = Flask(__name__)
api = Api(app)
##########################################################################################
class ZoneInfo(Resource):
def get(self):
return { result: [] }
##########################################################################################
api.add_resource(ZoneInfo, '/zoneInfo')
##########################################################################################
if __name__ == '__main__':
logger.info("Start RestAPI : listen %s:%s" % ('127.0.0.1', 8443))
app.run(
host='127.0.0.1',
port=8443,
)
그런데 만약 UserAuth 라는 기능이 있어,
사용자 인증을 하고 필요에 따라 password를 입력해야 한다고 할 때,
HTTPS 프로토콜을 사용하여야 하고, 또,
GET이 아니라 Form에 넣어 POST 방식으로 넣어야
URL에도 패러키터 정보고 바로 보이지 않습니다.
우선 위와 같은 경우, HTTPS 통신을 위한 사설 인증서 *.key, *crt 파일이 필요합니다.
다음과 같은 방법으로 인증서(키)를 만듦니다.
#!/bin/bash
KCNAME=future
openssl genrsa 2048 > $KCNAME.key
chmod 400 $KCNAME.key
openssl req -new -x509 -nodes -sha1 -days 365 -key $KCNAME.key > $KCNAME.crt
이제는 Flask에 SSL을 사용하도록 수정해야 하는데,
from OpenSSL import SSL
context = SSL.Context(SSL.SSLv23_METHOD)
context.use_privatekey_file('future.key')
context.use_certificate_file('future.crt')
##########################################################################################
if __name__ == '__main__':
logger.info("Start RestAPI : listen %s:%s" % ('127.0.0.1', 8443))
app.run(
host='127.0.0.1',
port=8443,
debug = True,
ssl_context=context,
)
와 같이 주면 됩니다.
이와 같이 하여
해당 소스 처럼 작성한 다음 동작시키면 됩니다.

이를 테스트 하기 위해서는 curl 프로그램을 이용해도 되지만,
파이썬 으로 직접 RESTFUL API 를 작성해도 됩니다.
소스는 위의 소스 링크에 rest_test.py 에 있습니다.
이중 중의하여야 할 것은 form에 변수를 넣고 POST 메서드로 호출하는 경우입니다.
##########################################################################################
def userAuth(host, port, userid, credential):
params = urllib.urlencode({'userid': userid, 'passwd': credential})
headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
conn = httplib.HTTPSConnection(host=host, port=port)
conn.request("POST", "/userAuth", params, headers)
response = conn.getresponse()
data = response.read()
conn.close()
rdict = json.loads(data)
return rdict
위와 같은 방법으로 호출하면 됩니다.
최근 (2015년 3월) 에
CentOS 5.11에서 작업을 해 보는데 최신 pyOpenSSL 을 설치해서는 다음과 같이
최근에 아주 간단하게 REST API를 꾸미는데 어떤
파이썬 프레임워크가 좋을지 살펴보다가 Flask 로 구성을 해 보기로 하였습니다.
우선 설치는 다음과 같이 간단합니다.
sudo pip install Flask
sudo pip install --upgrade --force-reinstall flask_restful
실제 작성하는 뼈대도 무척 간단합니다.
##########################################################################################
from flask import Flask
from flask.ext.restful import reqparse, abort, Api, Resource
from flask import request
##########################################################################################
app = Flask(__name__)
api = Api(app)
##########################################################################################
class ZoneInfo(Resource):
def get(self):
return { result: [] }
##########################################################################################
api.add_resource(ZoneInfo, '/zoneInfo')
##########################################################################################
if __name__ == '__main__':
logger.info("Start RestAPI : listen %s:%s" % ('127.0.0.1', 8443))
app.run(
host='127.0.0.1',
port=8443,
)
그런데 만약 UserAuth 라는 기능이 있어,
사용자 인증을 하고 필요에 따라 password를 입력해야 한다고 할 때,
HTTPS 프로토콜을 사용하여야 하고, 또,
GET이 아니라 Form에 넣어 POST 방식으로 넣어야
URL에도 패러키터 정보고 바로 보이지 않습니다.
우선 위와 같은 경우, HTTPS 통신을 위한 사설 인증서 *.key, *crt 파일이 필요합니다.
다음과 같은 방법으로 인증서(키)를 만듦니다.
#!/bin/bash
KCNAME=future
openssl genrsa 2048 > $KCNAME.key
chmod 400 $KCNAME.key
openssl req -new -x509 -nodes -sha1 -days 365 -key $KCNAME.key > $KCNAME.crt
이제는 Flask에 SSL을 사용하도록 수정해야 하는데,
from OpenSSL import SSL
context = SSL.Context(SSL.SSLv23_METHOD)
context.use_privatekey_file('future.key')
context.use_certificate_file('future.crt')
##########################################################################################
if __name__ == '__main__':
logger.info("Start RestAPI : listen %s:%s" % ('127.0.0.1', 8443))
app.run(
host='127.0.0.1',
port=8443,
debug = True,
ssl_context=context,
)
와 같이 주면 됩니다.
이와 같이 하여
해당 소스 처럼 작성한 다음 동작시키면 됩니다.
이를 테스트 하기 위해서는 curl 프로그램을 이용해도 되지만,
파이썬 으로 직접 RESTFUL API 를 작성해도 됩니다.
소스는 위의 소스 링크에 rest_test.py 에 있습니다.
이중 중의하여야 할 것은 form에 변수를 넣고 POST 메서드로 호출하는 경우입니다.
##########################################################################################
def userAuth(host, port, userid, credential):
params = urllib.urlencode({'userid': userid, 'passwd': credential})
headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
conn = httplib.HTTPSConnection(host=host, port=port)
conn.request("POST", "/userAuth", params, headers)
response = conn.getresponse()
data = response.read()
conn.close()
rdict = json.loads(data)
return rdict
위와 같은 방법으로 호출하면 됩니다.
추가된 사항:
최근 (2015년 3월) 에
CentOS 5.11에서 작업을 해 보는데 최신 pyOpenSSL 을 설치해서는 다음과 같이
플래스크 테스트를 구축해야 https 환경이 구축되었습니다.
참고하십시오.
app = Flask(__name__)
api = Api(app)
api.add_resource(Users, '/api/Users')
api.add_resource(ServerFarms, '/api/ServerFarms')
from OpenSSL import SSL
context = SSL.Context(SSL.SSLv3_METHOD)## SSL.Context(SSL.SSLv23_METHOD)
cert = 'future.crt'
pkey = 'future.key'
context.use_privatekey_file(pkey)
context.use_certificate_file(cert)
app.run(host=host, port=port, ssl_context=(cert, pkey), threaded=True, debug=True)
만약
AttributeError: 'Context' object has no attribute 'wrap_socket'
오류가 발생하면
context = SSL.Context(SSL.SSLv3_METHOD)## SSL.Context(SSL.SSLv23_METHOD)
cert = 'future.crt'
pkey = 'future.key'
context.use_privatekey_file(pkey)
context.use_certificate_file(cert)
대신
context = (cert, pkey)
라고 하면 됩니다.
어느 분께는 도움이 되셨기를...



덧글
api.add_resource(ZoneInfo, '/zoneInfo') 로 호출하니, 한글이 깨지네요..
한글 깨지는 현상 없으신가요? ㅠ
UTF-8로 인코딩 했던것 같습니다.
도움이 되시기를...