Skip to main content

Web App Scaling with Flask Blueprint and Namespaces



A real-world Flask-RESTX-based API may have multiple namespaces. The best practice for scaling a web application is to use a blueprint along with multiple namespace. The namespace is used to group a set of CRUD operations for a specific resource. Blueprint can be used to combine (mixing) multiple namespaces.

Here’s an example directory structure:
project\
├── app.py                     #  Application file
├── apis                       #
   ├── v20                     #  API directory
   │   ├── __init__.py            
   │   ├── specs.py            #  API namespaces and REST methods
   │   ├── steps.py            #  API namespaces and REST methods
   └── v20bp.py                #  API blueprint file

Here is an example app.py. Using a blue print allow you to mount your API on any url prefix.

from flask import Flask

from apis.v20bp import blueprint as api

app = Flask(__name__)
app.register_blueprint(api, url_prefix='/api/v20')
app.run(debug=True)

The following is an example of v20bp.py .
from flask import Blueprint

from flask_restx import Api

blueprint = Blueprint('api', __name__)

api = Api(blueprint)

api.add_namespace(ns1)
api.add_namespace(ns2)



The v20.__init__.py would aggregate all the namespace
from flask_restx import Api

from .specs import api as ns1
from .steps import api as ns2

api = Api(
    title='My Title',
    version='1.0',
    description='A description',
    # All API metadatas
)

api.add_namespace(ns1)
api.add_namespace(ns2)

Below is an example of a namespace.
from flask_restx import Namespace, Resource, fields

api = Namespace('steps', description='Steps related operations')

step = api.model('Step', {
    'id': fields.String(required=True, description='The identifier'),
    'name': fields.String(required=True, description='The name'),
})

STEPS = [
    {'id': 'felix', 'name': 'Felix'},
]

@api.route('/')
class StepList(Resource):
    @api.doc('list_steps')
    @api.marshal_list_with(step)
    def get(self):
        '''List all steps'''
        return STEPS

@api.route('/<id>')
@api.param('id', 'The step identifier')
@api.response(404, 'Step not found')
class Step(Resource):
    @api.doc('get_step')
    @api.marshal_with(step)
    def get(self, id):
        '''Fetch a step given its identifier'''
        for stp in STEPS:
            if stp['id'] == id:
                return stp
        api.abort(404)
References:


http://michal.karzynski.pl/blog/2016/06/19/building-beautiful-restful-apis-using-flask-swagger-ui-flask-restplus/



Comments

Popular posts from this blog

Documenting REST API with Flask-Restx

This tutorial aims to use the Flask-restx library to implement and to document the REST API. Other similar libraries in the Flask framework include the   flask_resful and  Flask-restplus libraries.  The generated document is shown below.  All the operations are group into a default namespace. All the CRUD operations get, create, and update (except for the the delete operation) are displayed  below.  References -  https://flask-restx.readthedocs.io/en/latest/ -  https://preslav.me/2018/12/02/designing-well-structured-rest-apis-with-flask-restplus-part-1/ -  https://www.freecodecamp.org/news/structuring-a-flask-restplus-web-service-for-production-builds-c2ec676de563/ -  https://github.com/cosmic-byte/flask-restplus-boilerplate

IBM Watson Annotator for Clinical Data

IBM Watson Annotator for Clinical Data Is Now Generally Available on May 12, 2020  Explore healthcare insights from unstructured data with this new service on IBM Cloud. The practice of medicine is intertwined with patient data that allows doctors and nurses to diagnose illnesses. What symptoms does a patient have, and how does a healthcare worker describe a set of symptoms for others to treat? In today’s globalized world, the treatment can even be carried out by doctors and nurses on the other side of the globe. IBM Watson Annotator for Clinical Data —now generally available on IBM Cloud—delivers natural language processing (NLP) that is tailored for healthcare and life sciences and designed to enable organizations to utilize insights derived from unstructured text.  The medical domain NLP service features a variety of annotators for detecting metadata (such as entities, concepts, concept values, negated spans, hypothetical spans) and a...