가취공부하자

[Python] RESTful API 구현 본문

Python/(책)파이썬과 비지니스 자동화

[Python] RESTful API 구현

keepGGoing 2022. 7. 31. 21:24

오늘은 RESTful 사용자 서비스를 구현해보았다. 사용자 정보를 읽고, 수정하고, 추가하고, 삭제하는 API를 만들어 보았다.

 

1. 웹 어플리케이션 틀 구현

from flask import Flask, jsonify, abort, make_response, request

app = Flask(__name__)

@app.route('/')
def greeting():
    return "This is RESTful API"

if __name__ =='__main__':
    app.run(debug=True)

위 코드를 실행하고 "http://127.0.0.1:5000/" 주소로 들어가면 "This is RESTful API"를 확인할 수 있다.

2. 사용자 정보를 읽는 HTTP GET을 구현한다.

from flask import Flask, jsonify, abort, make_response, request

app = Flask(__name__)

#사용자 정보
users = [
    {
        'id': 1,
        'username': u'cjgirdhar',
        'email': u'abc@xyz.com',
        'active': True
    },
    {
        'id': 2,
        'username': u'python',
        'email': u'py@py.org',
        'active': False
    }
]


@app.route('/')
def greeting():
    return "This is RESTful API"

#READE (유저 정보 확인)
@app.route('/user/<int:id>',methods=['GET'])
def get_user(id):
    for user in users:
        if user['id'] == id:
            return jsonify({'user':user})
    


if __name__ =='__main__':
    app.run(debug=True)

"http://127.0.0.1:5000/user/1" 에 접속하면 id가 1인 사용자의 정보를 웹 페이지에서 확인할 수 있다.

3. 사용자 정보를 추가하는 HTTP POST 기능 구현

from flask import Flask, jsonify, abort, make_response, request

app = Flask(__name__)

#사용자 정보
users = [
    {
        'id': 1,
        'username': u'cjgirdhar',
        'email': u'abc@xyz.com',
        'active': True
    },
    {
        'id': 2,
        'username': u'python',
        'email': u'py@py.org',
        'active': False
    }
]


@app.route('/')
def greeting():
    return "This is RESTful API"

#READE (유저 정보 확인)
@app.route('/user/<int:id>',methods=['GET'])
def get_user(id):
    for user in users:
        if user['id'] == id:
            return jsonify({'user':user})
    abort(404)


#CREATE (새로운 유저 입력)
@app.route('/post/user', methods=['POST'])
def create_user():
    if request.method == 'POST':
        user_id = users[-1].get("id") + 1
        username = request.json["username"]
        email = request.json["email"]
        status =False
        print("받은 데이터 : ", username) #확인
        user = {
            'id' : user_id,
            'username' : username,
            'email' : email,
            'status' : status }
        users.append(user)
        return jsonify({'user':user})

if __name__ =='__main__':
    app.run(debug=True)

새로 추가한 "http://127.0.0.1:5000/post/user"에 접속하면 아래와 같은 "Method Not Allowed" 화면을 볼 수 있다.

Method Not Allowed

이건 데이터를 전달할 수 있는 기능이 없어 발생하는 문구이다. 이를 테스트하기 위해선  Postman이라는 툴을 이용하면 된다. 설치, 사용방법 모두 간단하다.

위와 같이 정보를 입력한 후  send 버튼을 누르면 아래의 창을 통해 결과를 확인할 수 있다.

"http://127.0.0.1:5000/user/3" 결과

 

4. 사용자 정보를 수정하는 HTTP PUT 기능 구현

from flask import Flask, jsonify, abort, make_response, request

app = Flask(__name__)

#사용자 정보
users = [
    {
        'id': 1,
        'username': u'cjgirdhar',
        'email': u'abc@xyz.com',
        'active': True
    },
    {
        'id': 2,
        'username': u'python',
        'email': u'py@py.org',
        'active': False
    }
]


@app.route('/')
def greeting():
    return "This is RESTful API"

#READE (유저 정보 확인)
@app.route('/user/<int:id>',methods=['GET'])
def get_user(id):
    for user in users:
        if user['id'] == id:
            return jsonify({'user':user})
    abort(404)


#CREATE (새로운 유저 입력)
@app.route('/post/user', methods=['POST'])
def create_user():
    if request.method == 'POST':
        user_id = users[-1].get("id") + 1
        username = request.json["username"]
        email = request.json["email"]
        status =False
        print("받은 데이터 : ", username) #확인
        user = {
            'id' : user_id,
            'username' : username,
            'email' : email,
            'status' : status }
        users.append(user)
        return jsonify({'user':user})
    
    
#UPDATE (유저 정보 수정)
@app.route('/put/user/<int:id>', methods=['PUT'])
def update_user(id):
    if request.method == 'PUT':
        user =[user for user in users if user['id'] == id]
        user[0]['username']= request.json['username']
        user[0]['email'] = request.json['email']
        user[0]['status'] = request.json['status']
        return jsonify({'user':user[0]})


if __name__ =='__main__':
    app.run(debug=True)

해당 추가 기능도 데이터를 입력받아야 하므로 postman을 사용해 테스트한다.

 

5. 사용자 정보를 삭제하는 HTTP DELETE 기능 구현

from flask import Flask, jsonify, abort, make_response, request

app = Flask(__name__)

#사용자 정보
users = [
    {
        'id': 1,
        'username': u'cjgirdhar',
        'email': u'abc@xyz.com',
        'active': True
    },
    {
        'id': 2,
        'username': u'python',
        'email': u'py@py.org',
        'active': False
    }
]


@app.route('/')
def greeting():
    return "This is RESTful API"

#READE (유저 정보 확인)
@app.route('/user/<int:id>',methods=['GET'])
def get_user(id):
    for user in users:
        if user['id'] == id:
            return jsonify({'user':user})
    abort(404)


#CREATE (새로운 유저 입력)
@app.route('/post/user', methods=['POST'])
def create_user():
    if request.method == 'POST':
        user_id = users[-1].get("id") + 1
        username = request.json["username"]
        email = request.json["email"]
        status =False
        print("받은 데이터 : ", username) #확인
        user = {
            'id' : user_id,
            'username' : username,
            'email' : email,
            'status' : status }
        users.append(user)
        return jsonify({'user':user})


#UPDATE (유저 정보 수정)
@app.route('/put/user/<int:id>', methods=['PUT'])
def update_user(id):
    if request.method == 'PUT':
        user =[user for user in users if user['id'] == id]
        user[0]['username']= request.json['username']
        user[0]['email'] = request.json['email']
        user[0]['status'] = request.json['status']
        return jsonify({'user':user[0]})

#DELETE (사용자 정보 삭제)
@app.route('/delete/user/<int:id>',methods=['DELETE'])
def delete_user(id):
    if request.method == 'DELETE':
        user = [user for user in users if user['id'] == id]
        users.remove(user[0])
        return jsonify({}), 204

if __name__ =='__main__':
    app.run(debug=True)

해당 추가 기능도 데이터를 입력받아야 하므로 postman을 사용해 테스트한다.

 

6. 예외 처리

from flask import Flask, jsonify, abort, make_response, request

app = Flask(__name__)

#사용자 정보
users = [
    {
        'id': 1,
        'username': u'cjgirdhar',
        'email': u'abc@xyz.com',
        'active': True
    },
    {
        'id': 2,
        'username': u'python',
        'email': u'py@py.org',
        'active': False
    }
]


@app.route('/')
def greeting():
    return "This is RESTful API"

#READE (유저 정보 확인)
@app.route('/user/<int:id>',methods=['GET'])
def get_user(id):
    for user in users:
        if user['id'] == id:
            return jsonify({'user':user})
    abort(404)


#CREATE (새로운 유저 입력)
@app.route('/post/user', methods=['POST'])
def create_user():
    if request.method == 'POST':
        user_id = users[-1].get("id") + 1
        username = request.json["username"]
        email = request.json["email"]
        status =False
        print("받은 데이터 : ", username) #확인
        user = {
            'id' : user_id,
            'username' : username,
            'email' : email,
            'status' : status }
        users.append(user)
        return jsonify({'user':user})
     abort(404)


#UPDATE (유저 정보 수정)
@app.route('/put/user/<int:id>', methods=['PUT'])
def update_user(id):
    if request.method == 'PUT':
        user =[user for user in users if user['id'] == id]
        user[0]['username']= request.json['username']
        user[0]['email'] = request.json['email']
        user[0]['status'] = request.json['status']
        return jsonify({'user':user[0]})
     abort(404)

#DELETE (사용자 정보 삭제)
@app.route('/delete/user/<int:id>',methods=['DELETE'])
def delete_user(id):
    if request.method == 'DELETE':
        user = [user for user in users if user['id'] == id]
        users.remove(user[0])
        return jsonify({}), 204

#Error (예외처리)
@app.errorhandler(404)
def not_found(error):
    return make_response((jsonify({'error' : 'Not Found'}),404))

if __name__ =='__main__':
    app.run(debug=True)

 

참조

http://www.acornpub.co.kr/book/automate-it (파이썬 비지니스 자동화, 에이콘출판사, 2018)

 

파이썬과 비즈니스 자동화

파이썬 2.7로 비즈니스 자동화를 위한 필요한 기술을 다루고, 실제로 활용할 수 있도록 도와준다

www.acornpub.co.kr

https://kejdev.github.io/posts/python-rest-api/

https://velog.io/@53_eddy_jo/RESTful%ED%95%9C-%EC%84%B8%EA%B3%84%EC%97%90%EC%84%9C%EC%9D%98-POST%EC%99%80-PUT%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EA%B1%B0%EA%B8%B0%EC%97%90-FETCH%EA%B9%8C%EC%A7%80