0

I'm trying to build an API with flask_restful, but I don't know how to connect classes that inherit from Resource, with the actual app. I have the following structure

  page
    ├───api
    │   └───__init__.py
    │   └───resources.py          
    └───__init__.py

page/api/resources.py:

from flask_restful import Resource
from page import api


@api.resource("/hello-world")
class HelloWorld(Resource):
    def get(self):
        return {"hello": "World"}

page/init.py:

from flask import Flask
from flask_restful import Api

from page.config import Config1

api = Api()

def create_app(config_class=Config1):
    app = Flask(__name__)
    app.config.from_object(config_class)

    api.init_app(app)

    return app

run.py (outside of the page package):

from page import create_app

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

test:

import requests

BASE = "http://127.0.0.1:5000/"

response = requests.get(BASE + "hello-world")
print(response.json())

Obviously, making a request to "/hello-world" doesn't work. How can I "make Flask aware" of the resources, so that I get a valid response.

1 Answers1

0

Probably there is a much clever way of doing this but for me, the solution would be to remove the decorator @api.resource decorator at page/api/resources.py and make the following changes at page/init.py

from flask import Flask
from page.config import Config1

def create_app(config_class=Config1):
    app = Flask(__name__)
    app.config.from_object(config_class)

    return app

I would also move the run.py inside the page folder and rename it to app.py according to Flask documentation. This app.py should have your routes so change it to something like this:

from page import create_app
from page.api.resources import HelloWorld
from flask_restfull import api

app = create_app()
api = Api(app)
api.add_resource(HelloWorld, '/hello-world')

And to run it just type flask run inside the page folder.

Gil Sousa
  • 674
  • 5
  • 12