가오리의 코딩일기

Ep08. Flask-RESTful로 Animal CRUD API 구축하기 본문

Python/flask

Ep08. Flask-RESTful로 Animal CRUD API 구축하기

류경혜 2022. 8. 31. 23:00

Pluggable View

→ 플라스크는 기본적으로 데코레이터와 함수 기반으로 API를 작성하며 이를 함수 기반 뷰라고 한다

→ 플러거블 뷰(pluggable View)는 장고의 generic view에서 영향을 받아 만들어졌다

#  함수 기반 뷰
@app.route('/users')
def userList():
	users = User.query.all()
	return render_template('uers.html', users=users)

# 플러거블 뷰
class UserAPI(View):
	methods = ['GET', 'POST']
	def dispatch_request(self):
		users = User.query.all()
		return render_template('users.html', objects=users)

 

 

 

 

 

 

✏️ next(iterable, default)

→ iterable(반복 가능 객체), default(선택, 반복 가능 객체의 마지막 요소 이후 반환할 기본값)

→ iterable의 다음 item을 반환한다

 

 

✏️ filter(function, iterable)

→ 항목이 허용되는지 여부를 테스트하기 위해 함수를 통해 항목이 필더링된 경우 반복자를 반환한다

 

 

✏️ 상태코드: 200, 201, 400, 404

100번대: 요청이 수신되어 처리 중
200번대: 요청이 정상적으로 처리 중
300번대: 추가적인 작업이 필요
400번대: 클라이언트 오류
500번대:서버 오류

200_OK: 요청이 성공적으로 되었다, 정보는 요청에 따른 응답으로 반환된다
201_Created: 요청이 성공적이었으며 그 결과로 새로운 리소스가 생성되었다[POST, PUT 요청 이후에 따라온다]
400_Bad Request: 잘못된 문법으로 인하여 서버가 요청하여 이해할 수 없다
404_Not Found: 서버는 요청받은 리소스를 찾을 수 없고 브라우저에서는 알려지지 않은 URL을 의미한다

 

 

 

🧩 pip install

requirements.txt

aniso8601==9.0.1
click==8.1.3
Flask==2.2.0
Flask-RESTful==0.3.9
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.1
pytz==2022.1
six==1.16.0
Werkzeug==2.2.1

 

 

 

 

🧩 GET /animal/string:name

→ 이름으로 고유하게 식별되는 특정 동물 “한 마리"의 상세정보를 반환, 동물들은 같은 이름을 가질 수 없음

from flask import Flask, request
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

animals = []

class Animal(Resource):
    def get(self, name):
        for animal in animals:
            if animal['name'] == name:
                return animal, 200
            else:
                return {'message': f'Animal <{name}> is not found'}, 404

api.add_resource(Animal, '/animal/<string:name>')

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

 

 

 

 

 

 

🧩 POST /animal/<name>

→ <name>이라는 이름을 가지는 동물 한 마리를 생성, 같은 이름을 가지고 있는 동물이 있다면 생성은 실패해야 함

from flask import Flask, request
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

animals = []

class Animal(Resource):
    def post(self, name):
        animal = next(filter(lambda x: x['name'] == name, animals), None)
        if animal is None:
            data = request.get_json()
            animal = {'name': name, 'age': data['age']}
            animals.append(animal)
            return animal, 201
        else:
            return {'message': f'Animal <{name}> is already in the list'}, 400

api.add_resource(Animal, '/animal/<string:name>')
if __name__ == "__main__":
    app.run(debug=True)

 

 

 

 

 

 

🧩 GET animals

→ 모든 동물에 대한 목록 조회

from flask import Flask, request
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

animals = []

class Animal(Resource):
    def put(self, name):
        data = request.get_json()
        animal = next(filter(lambda x: x['name'] == name, animals), None)
        if animal is None:
            animal = {'name': name, 'age': data['age']}
            animals.append(animal)
            return animal, 201
        else:
            animal.update(data)
            return animal, 200

api.add_resource(Animal, '/animal/<string:name>')
if __name__ == "__main__":
    app.run(debug=True)

 

 

 

 

 

 

🧩 PUT /animal/<name>

→ <name> 이라는 이름을 가지고 있는 동물 한 마리를 생성하거나 이미 그 이름을 가지고 있는 동물이 존재한다면 정보를 수정

from flask import Flask, request
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

animals = []

class Animal(Resource):
    def delete(self, name):
        animal = next(filter(lambda x: x['name'] == name, animals), None)
        if animal is None:
            return {'message': f'Animal <{name}> not found.'}, 404
        else:
            del (animals['name' == name])
            return {'message': f'Animal <{name}> deleted successfully!'}, 200

api.add_resource(Animal, '/animal/<string:name>')
if __name__ == "__main__":
    app.run(debug=True)

 

 

 

 

 

 

🧩 DELETE /animal/<name>

→ <name>이라는 이름을 가지고 있는 동물 한 마리를 제거

from flask import Flask, request
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

animals = []
class Animal(Resource):
    def delete(self, name):
        animal = next(filter(lambda x: x['name'] == name, animals), None)
        if animal is None:
            return {'message': f'Animal <{name}> not found.'}, 404
        else:
            del (animals['name' == name])
            return {'message': f'Animal <{name}> deleted successfully!'}, 200

api.add_resource(Animal, '/animal/<string:name>')

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