가오리의 코딩일기
Ep08. Flask-RESTful로 Animal CRUD API 구축하기 본문
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)
'Python > flask' 카테고리의 다른 글
Ep07. Flask로 첫 번째 HTTP API 구축하기 (0) | 2022.08.20 |
---|---|
Ep04. 블로그 웹 애플리케이션 개발(1) (0) | 2022.07.22 |
Ep03. 블로그 웹 애플리케이션 개발 (0) | 2022.07.15 |
Ep02. python DB API, sqlite3 (0) | 2022.07.10 |
Ep02. 라우팅, 변수 규칙, 후행 슬래시, url 구축, http 메소드 (0) | 2022.07.09 |