[Python] Flask 로 간단한 HTTPS REST API 제공 및 테스트 Develop Tip

예전 파이썬의 웹 프레임워크를 살펴본 적이 있습니다.

최근에 아주 간단하게 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)

라고 하면 됩니다.

어느 분께는 도움이 되셨기를...


핑백

  • 지훈현서 : [Python] ThreadingMixIn 이용 Non-blocking XMLRPC 2014-12-18 12:12:51 #

    ... 파이썬에서 어떤 API를 제공하는 다양한 방법이 있습니다.(일전에 Flask를 이용한 Restful API 를 소개한 적이 있습니다) 하지만 더 기본적인 API는 XML-RPC 로 제공하는 경우도 많습니다. 아래와 같은 간단한 XML-RPC 서버를 살 ... more

  • 지훈현서 : [Python] Flask RESTful API를 gunicorn WSGI 이용 및 supervisor 활용 2015-01-12 16:32:45 #

    ... Flask로 간단한 HTTPS REST API 제공 및 테스트</a>"에 관한 블로깅을 한 적이 있습니다. 지난번에 만들어 보았던 Flask를 실제로 서비스에 활용하는 방법을 살펴봅니다.(Kickstarting Flask on Ubuntu - Setup and deployment 참조) 플래스크와 같은 파이썬 마이크로 프레임워크를 이용하면 아주 간단하게 RestFul API를 제공할 수 있습니다. 하지만 문제는 해당 프로그램을 직접 수행하여야 하며 ... more

  • 지훈현서 : [Python] Flask 파일 업로드 2015-04-15 10:26:05 #

    ... 지난번에 간단한 Flask API 알아보기에서 언급하였듯이Flask를 이용한 RestAPI 확인을 해 보았습니다.그런데 이번에 필요에 따라 파일 업로드 기능을 적용해 보았습니다.무척 간단하 ... more

  • 지훈현서 : [Python] Flask & flask-restplus && swagger ui 2017-10-13 09:47:07 #

    ... 파이썬으로 Backend RESTful API 등을 작성할 때, 주로 Flask를 이용합니다. 참고:- 파이썬 4개의 웹 프레임워크 비교- FLASK 로 간단한 HTTPS REST API 제공- Flask RESTful API를 gunicorn WSGI 이용 및 supervisor 활용- Flask에서 Redis를 사용하여 세션 ... more

덧글

  • 2014/12/12 15:56 # 삭제 답글

    좋은 쓰기까지, 나는 자신의 블로그를 정기적으로 방문자 오전, 우수한 운영까지 유지하고, 그것은 긴 시간 동안 정기적 인 방문자가 될 것입니다.
  • 까미언냐 2015/05/27 17:15 # 삭제 답글

    @app.route('/') 로 호출하면 한글이 꺠지지 않는데요..
    api.add_resource(ZoneInfo, '/zoneInfo') 로 호출하니, 한글이 깨지네요..
    한글 깨지는 현상 없으신가요? ㅠ

  • 지훈현서아빠 2015/05/28 09:00 #

    GET 이나 POST 메서드 처리 안에서 패러미터 받아오는 곳에서
    UTF-8로 인코딩 했던것 같습니다.
    도움이 되시기를...
댓글 입력 영역

구글애드텍스트