Skip to main content

Flask toolkits to boost your development and simplify flask, its featured with AutoSwagger

Project description

Flask Toolkits

Downloads

Repository

Installation

pip install flask-toolkits

Description

Flask toolkits implements and provides several features from FastAPI like:

  • Automatic API documentation (define the function and we'll generate the swagger/openapi spec for you)
  • Passing parameters through view/router function which is unable in Flask before
  • Easy Middleware setup
  • Parameters and schema validation using Pydantic
  • Response classes that could return any type of data without worried to get error
  • much more..

Changelogs

  • v0.0
    • First Upload
  • v0.1
    • Integration with flask-http-middleware
    • pydantic support for JSON arguments and validation
    • Multiple response type generator
    • Added JSONResponse class to replace jsonify roles in send dictionary data with encoding improvements.
  • v0.2
    • Supported enumeration API documentation
    • Added support for type hint from typing's generic (ex: Optional, Union, List)
    • Fixed input parameter validations
  • v0.3
    • Support File and Form input parameters validation and automatic swagger.
    • Added constraint feature for parameters (ex: limit, max/min length, greater/less than, equals than etc)
  • v0.4
    • Support Authorization header in openapi spec.
    • Added Authorization processing function for security and can be used as login or auth.
  • v0.5
    • Support add_url_rule and route for endpoint definition
    • Support auto swagger for multiple methods in a single endpoints
  • v0.6
    • Support alias on endpoint parameters (path, query, header, etc) to enable non-pythonic terms of parameter names

Key Tools inside this toolkit

  • Automatic API documentation (swagger/openapi)
  • Request-Response direct HTTP middleware (flask-http-middleware)
  • Automatic parameters validation (pydantic)
  • Response generator (JSON, Plain Text, HTML)

Automatic Parameters Validation

The original Blueprints class from flask can't insert most of arguments inside endpoint. Here our APIRouter allows you to have arguments inside your endpoint

from typing import Optional
from flask_toolkits import APIRouter, Body, Header, Query
from flask_toolkits.responses import JSONResponse


router = APIRouter("email", import_name=__name__, static_folder="/routers/email", url_prefix="/email")


@router.post("/read", tags=["Email Router])
def get_email(
    id: int,
    name: Optional[str],
):
    return JSONResponse({"id": id, "name": name})

Automatic API Documentation

Here our APIRouter allows you to auto-documenting your endpoint through AutoSwagger. Define the new router using APIRouter class, lets put it in another pyfile

email_view.py

from typing import Optional
from flask_toolkits import APIRouter, Body, Header, Query
from flask_toolkits.responses import JSONResponse


router = APIRouter("email", import_name=__name__, static_folder="/routers/email", url_prefix="/email")


@router.post("/read", tags=["Email Router])
def get_email(
    id: int = Body(),
    name: Optional[str] = Body(None),
    token: int = Header(),
    race: Optional[str] = Query(None)
):
    return JSONResponse({"id":id, "name": name})

main.py

from flask import Flask
from flask_toolkits import AutoSwagger

from email_view import router as email_router


app = Flask(__name__)

auto_swagger = AutoSwagger()

app.register_blueprint(email_router)
app.register_blueprint(auto_swagger)


if __name__ == "__main__":
    app.run()

then you can go to http://localhost:5000/docs and you will found you router is already documented

alt text


Supported Field Parameters

flask-toolkits provide multiple field parameters such as Header, Query, Body, Path, File, Form


Easy Security Scheme Setup and Documentation

flask-toolkits helps you to define your security scheme for authorization easier than before. In advance this also give you automated documentation.

Basic Usage

lets assume you have your own bearer security schema. You just have to create a new instance of HTTPBearerSecurity() to enable automatic documentation on it.

from flask import request
from flask_toolkits import APIRouter
from flask_toolkits.security import HTTPBearerSecurity

router = APIRouter("api", __name__)

@router.get("/home", security=HTTPBearerSecurity())
def home(message: str):
    if my_security_scheme(request):
        return JSONResponse({"message": message})
    return JSONResponse({"message": "invalid authorization"})

this is how it looks like alt text

on you clicked it alt text

Define your own security scheme

If you want to define your own security scheme you can follow below guidance

from flask import request
from flask_toolkits import APIRouter
from flask_toolkits.security import HTTPBearerSecurity

class JWTBearer(HTTPBearerSecurity):
    def __init__(self):
        super().__init__()

    def __call__(self, req):
        data = self.get_authorization_data(req)
        if data != "abcdefghij":
            raise Exception("This is not good")
        return req

router = APIRouter("api", __name__)

@router.get("/home", security=JWTBearer())
def home(message: str):
    if my_security_scheme(request):
        return JSONResponse({"message": message})
    return JSONResponse({"message": "invalid authorization"})

Overriding __call__ method inside the subclass would define your security schema for the routers that are using your security scheme


Define to all endpoints in a router

Just pass it to APIRouter and all its endpoint will use that security scheme!

router_with_bearer = APIRouter("api", __name__, security=JWTBearer())

but don't worries! You can also override it by just defining in the router decorator!

@router_with_bearer.get("/home", security=AnotherBearerSecurity())
def home():
    return {"message": "hello"}

Parameter Alias

In case you have non-pythonic terms with unicode character (-, +, _, =) for your paramter names, you can apply the alias into the parameters easily

@app.get("/test-alias")
def test_alias(
    apikey: str = Header(alias="x-api-key")
):
    return JSONResponse({"apikey": apikey})

here you will also have your swagger is defined with that alias alt text


Multiple HTTP Methods in a single endpoint

add_url_rule and route method for Flask's App or Blueprints object are now supported. This also allows you to have multiple HTTP methods in a single endpoint function

@app.route("/test-multiple-method", methods=["GET", "POST", "PUT", "DELETE", "PATCH"])
def go_multi_method(
    name: str = Body()
):
    return JSONResponse({"result": name})

Here you will get null if you hit it using GET but you'll get the value on you hit with other methods that support Body. You won't loose your validation since it only applied for methods that support that kind of params.


Request-Response direct HTTP middleware

import time
from flask import Flask
from flask_toolkits.middleware import MiddlewareManager, BaseHTTPMiddleware

app = Flask(__name__)

class MetricsMiddleware(BaseHTTPMiddleware):
    def __init__(self):
        super().__init__()

    def dispatch(self, request, call_next):
        t0 = time.time()
        response = call_next(request)
        response_time = time.time()-t0
        response.headers.add("response_time", response_time)
        return response

app.wsgi_app = MiddlewareManager(app)
app.wsgi_app.add_middleware(MetricsMiddleware)

@app.get("/health")
def health():
    return {"message":"I'm healthy"}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flask-toolkits-0.6.7.tar.gz (1.0 MB view details)

Uploaded Source

Built Distribution

flask_toolkits-0.6.7-py3-none-any.whl (1.0 MB view details)

Uploaded Python 3

File details

Details for the file flask-toolkits-0.6.7.tar.gz.

File metadata

  • Download URL: flask-toolkits-0.6.7.tar.gz
  • Upload date:
  • Size: 1.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.11.4 pkginfo/1.8.2 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

File hashes

Hashes for flask-toolkits-0.6.7.tar.gz
Algorithm Hash digest
SHA256 8d9d79443f3b016a79eebf497b85e9a342ed36eb0aa6ece9f3f32fef4898bb75
MD5 f3e9d21a6b9c9fa7f9763ba71dd7c1d1
BLAKE2b-256 64074d928b7761e0dfeb5cd0957f9dde3409553ddce2fbc3b45715fe4c998d1b

See more details on using hashes here.

File details

Details for the file flask_toolkits-0.6.7-py3-none-any.whl.

File metadata

  • Download URL: flask_toolkits-0.6.7-py3-none-any.whl
  • Upload date:
  • Size: 1.0 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.11.4 pkginfo/1.8.2 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

File hashes

Hashes for flask_toolkits-0.6.7-py3-none-any.whl
Algorithm Hash digest
SHA256 04a45eaa06fe42083874ce069897d5f93b127800982cd7b8e8a981e08be151ef
MD5 81d393eb54c45016893c7fefe283d7d9
BLAKE2b-256 c264ea523ebc2c13a8e4b6f0a35ba43fbe10d0237596459c974a062a15a929ca

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page