From 68a8e0e07d5017cfb85b6f3bc168f3a5e363497f Mon Sep 17 00:00:00 2001 From: Medhi Boulnemour Date: Fri, 19 Nov 2021 14:19:46 +0100 Subject: [PATCH] Replace the framework flask_restful by flask-smorest cause is deprecated https://github.com/flask-restful/flask-restful/issues/883 --- app/characters/rest.py | 10 ++++++++-- app/episodes/rest.py | 8 ++++++-- app/main.py | 16 ++++++++++------ requirements-lock.txt | 9 ++++++--- requirements.txt | 3 +-- 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/app/characters/rest.py b/app/characters/rest.py index 4e9c402..78bb266 100644 --- a/app/characters/rest.py +++ b/app/characters/rest.py @@ -1,11 +1,17 @@ from typing import Dict, List -from flask_restful import Resource +from flask.views import MethodView +from flask_smorest import Blueprint from .models import CharacterModel +blueprint_characters = Blueprint( + "characters", "characters", url_prefix="/characters", description="Operations on characters" +) -class Characters(Resource): + +@blueprint_characters.route("/") +class Characters(MethodView): def get(self) -> Dict[str, List]: characters = CharacterModel.query.all() return {"characters": [character.json() for character in characters]} diff --git a/app/episodes/rest.py b/app/episodes/rest.py index d90cbe2..bc3de4a 100644 --- a/app/episodes/rest.py +++ b/app/episodes/rest.py @@ -1,11 +1,15 @@ from typing import Dict, List -from flask_restful import Resource +from flask.views import MethodView +from flask_smorest import Blueprint from .models import EpisodeModel +blueprint_episodes = Blueprint("episodes", "episodes", url_prefix="/episodes", description="Operations on episodes") -class Episodes(Resource): + +@blueprint_episodes.route("/") +class Episodes(MethodView): def get(self) -> Dict[str, List]: episodes = EpisodeModel.query.all() return {"episodes": [episode.json() for episode in episodes]} diff --git a/app/main.py b/app/main.py index 12ad956..ad80afd 100644 --- a/app/main.py +++ b/app/main.py @@ -1,17 +1,21 @@ import os from flask import Flask -from flask_restful import Api +from flask_smorest import Api -from .characters.rest import Characters + +from .characters.rest import blueprint_characters from .db import db -from .episodes.rest import Episodes +from .episodes.rest import blueprint_episodes app = Flask(__name__) -api = Api(app, prefix="/api") +app.config["API_TITLE"] = "Rick and Morty API" +app.config["API_VERSION"] = "v1" +app.config["OPENAPI_VERSION"] = "3.1.0" -api.add_resource(Characters, "/characters") -api.add_resource(Episodes, "/episodes") +api = Api(app) +api.register_blueprint(blueprint_characters) +api.register_blueprint(blueprint_episodes) app.config["SQLALCHEMY_DATABASE_URI"] = os.environ.get("DATABASE_URL", "sqlite:///data.db") app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False diff --git a/requirements-lock.txt b/requirements-lock.txt index 9d6c0b6..f641c4d 100644 --- a/requirements-lock.txt +++ b/requirements-lock.txt @@ -1,24 +1,25 @@ Flask==2.0.2 -Flask-RESTful==0.3.9 +flask-smorest==0.35.0 gunicorn==20.1.0 -safety==1.10.3 pytest==6.2.5 Flask-SQLAlchemy==2.5.1 PyMySQL==1.0.2 -# SQLAlchemy==1.4.27 ## The following requirements were added by pip freeze: aniso8601==9.0.1 +apispec==5.1.1 attrs==21.2.0 certifi==2021.10.8 charset-normalizer==2.0.7 click==8.0.3 dparse==0.5.1 +Flask-RESTful==0.3.9 greenlet==1.1.2 idna==3.3 iniconfig==1.1.1 itsdangerous==2.0.1 Jinja2==3.0.3 MarkupSafe==2.0.1 +marshmallow==3.14.1 packaging==21.2 pluggy==1.0.0 py==1.11.0 @@ -26,8 +27,10 @@ pyparsing==2.4.7 pytz==2021.3 PyYAML==6.0 requests==2.26.0 +safety==1.10.3 six==1.16.0 SQLAlchemy==1.4.27 toml==0.10.2 urllib3==1.26.7 +webargs==8.0.1 Werkzeug==2.0.2 diff --git a/requirements.txt b/requirements.txt index e0cd447..eb0841d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,6 @@ Flask==2.0.2 -Flask-RESTful==0.3.9 +flask-smorest==0.35.0 gunicorn==20.1.0 -safety==1.10.3 pytest==6.2.5 Flask-SQLAlchemy==2.5.1 PyMySQL==1.0.2 \ No newline at end of file