Antharaz
Antharaz

Reputation: 41

How create endpoints in multiple files?

I'm building an API in using Flkas, but when I try place endpoints at multiple files importing with "import" to organize my api, only works one file route.

My first file teste.py:

from flask import Flask, jsonify, request
app = Flask(__name__)
import teste2

livros = [
    {
        'id': 1,
        'título': 'O Senhor dos Anéis - A Sociedade do Anel',
        'autor': 'J.R.R Tolkien'
    },
    {
        'id': 2,
        'título': 'Harry Potter e a Pedra Filosofal',
        'autor': 'J.K Howling'
    },
    {
        'id': 3,
        'título': 'James Clear',
        'autor': 'Hábitos Atômicos'
    },
]

# Consultar(todos)
@app.route('/livros',methods=['GET'])
def obter_livros():
    return jsonify(livros)

# Consultar(id)
@app.route('/livros/<int:id>',methods=['GET'])
def obter_livro_por_id(id):
    for livro in livros:
        if livro.get('id') == id:
            return jsonify(livro)
# Editar
@app.route('/livros/<int:id>',methods=['PUT'])
def editar_livro_por_id(id):
    livro_alterado = request.get_json()
    for indice,livro in enumerate(livros):
        if livro.get('id') == id:
            livros[indice].update(livro_alterado)
            return jsonify(livros[indice])
# Criar
@app.route('/livros',methods=['POST'])
def incluir_novo_livro():
    novo_livro = request.get_json()
    livros.append(novo_livro)

    return jsonify(livros)
# Excluir
@app.route('/livros/<int:id>',methods=['DELETE'])
def excluir_livro(id):
    for indice, livro in enumerate(livros):
        if livro.get('id') == id:
            del livros[indice]

    return jsonify(livros)

app.run(port=5000,host='localhost',debug=True)

My second file teste2.py:

from flask import Flask, jsonify, request
app = Flask(__name__)

livros2 = [
    {
        'id': 1,
        'título': 'only a teste',
        'autor': 'J.R.R Tolkien'
    },
]

# Consultar(todos)
@app.route('/livross',methods=['GET'])
def obter_livros():
    return jsonify(livros2)

app.run(port=5000,host='localhost',debug=True)

When I run teste.py, only teste2.py's endpoints works... How can I make all endpoints work without putting everything in one file?

Upvotes: 0

Views: 862

Answers (1)

lmiguelvargasf
lmiguelvargasf

Reputation: 69675

In order to have view functions in different files, Flask's documentation recommends using blueprints.

In your case, you can try something like:

teste.py

from flask import Flask, jsonify, request, Blueprint

first_blueprint = Blueprint('first_blueprint', __name__)


# notice the change in the route
@first_blueprint.route('/',methods=['GET'])
def obter_livros():
   ...

# notice change in the path
@first_blueprint.route('/<int:id>',methods=['GET'])
def obter_livro_por_id(id):
    ...


# do the same for the other view functions in the file
# in the other file also create a blueprint

In the file where you are creating your Flask app:

from flask import App
from teste import first_blueprint

app = Flask(__name__)

app.register_blueprint(first_blueprint, url_prefix='/livros')
# register the other blueprint

Upvotes: 2

Related Questions