본문 바로가기

백앤드 개발

Flask 웹 api 기본 구성 코드

반응형

해당 코드는 기본적인 flask 기반으로 만들어진 

RESTful web api 혹은 web app이다 

기본 구성은 다음과 같고 활에 따라서 조금씩 바꿔서 쓰면 될거 같다 


당연히 코드는 파이썬

스펙은 다음과 같다. 내가 생각하기에 web api를 구성하기 위한 기본적인건 다 포함됐지 싶다.

1. GET 처리 가능

2. POST로는 json입력을 받을 수 있음

3. 404 에러 핸들링이 포함 되어 있음

4. 인증이 포함되어 있음, 아이디: admin, pw: secret 임.

5. app.log라는 파일에 로그도 찍음 




from flask import Flask,request,jsonify

import logging

from functools import wraps


app = Flask(__name__)


file_handler = logging.FileHandler('app.log')

app.logger.addHandler(file_handler)

app.logger.setLevel(logging.INFO)



def requires_auth(f):

    @wraps(f)

    def decorated(*args, **kwargs):

        auth = request.authorization

        if not auth:

            return authenticate()


        elif not check_auth(auth.username, auth.password):

            return authenticate()

        return f(*args, **kwargs)


    return decorated





@app.route('/ntalk', methods = ['GET', 'POST'])

@requires_auth

def response():

    # logging

    app.logger.info(str(request))


    # get handling

    if request.method == 'GET':

        if 'code' in request.args:

            return "code: " + request.args['code']+"\n"


    # post handling

    elif request.method == 'POST':

        if request.headers['Content-Type'] == 'application/json':

            input_json = request.get_json()

            data = {

                'msg'  : input_json['message'],

                'number' : 3

                }

            resp = jsonify(data)

            resp.status_code = 200

            return resp


# 404 error handling

@app.errorhandler(404)

def not_found(error=None):

    message = {

                'status': 404,

                'message': 'Not Found: ' + request.url,

                }

    resp = jsonify(message)

    resp.status_code = 404

    return resp


def check_auth(username, password):

    return username == 'admin' and password == 'secret'


def authenticate():

    message = {'message': "Authenticate."}

    resp = jsonify(message)

    resp.status_code = 401

    resp.headers['WWW-Authenticate'] = 'Basic realm="Example"'

    return resp

if __name__ == "__main__":

    app.run(debug = True, port = 8808, host = '0.0.0.0')

 



위를 테스트 해보자

먼저 GET

curl -u "admin:secret" -H "Content-type: application/json" -X GET http://127.0.0.1:8808/ntalk?code=10 

 code: 10


이제 POST

명령어

 curl -u "admin:secret" -H "Content-type: application/json" -X POST http://127.0.0.1:8808/ntalk -d '{"message":"Hello Data"}'

 결과

 {

  "hello": "world",

  "number": 3

}



그러하다

반응형