Flask toolkits to boost your development and simplify flask, its featured with AutoSwagger
Project description
Flask Toolkits
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 inFlask
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 replacejsonify
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
andForm
input parameters validation and automatic swagger. - Added constraint feature for parameters (ex: limit, max/min length, greater/less than, equals than etc)
- Support
- v0.4
- Support
Authorization
header in openapi spec. - Added
Authorization
processing function for security and can be used aslogin
orauth
.
- Support
- v0.5
- Support
add_url_rule
androute
for endpoint definition - Support auto swagger for multiple methods in a single endpoints
- Support
- v0.6
- Support
alias
on endpoint parameters (path, query, header, etc) to enable non-pythonic terms of parameter names
- Support
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
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
on you clicked it
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
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file flask-toolkits-0.6.2.tar.gz
.
File metadata
- Download URL: flask-toolkits-0.6.2.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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8cf7232b47da51c8c33d8fc2733f2058243deb143ba73635f723e34a46796308 |
|
MD5 | e55fe63b92945a0e3867ab4052ad15d4 |
|
BLAKE2b-256 | 54e5c461cdba61e49858ca0ab10d7e52b809edc28c1dbb2c9647f734e85baaf0 |
File details
Details for the file flask_toolkits-0.6.2-py3-none-any.whl
.
File metadata
- Download URL: flask_toolkits-0.6.2-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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 771845875729c8e267d49ad6fe738e113417ab25365137f9aac33f2f1b34105a |
|
MD5 | cee2b2655a4b92c819c088cde1fe267f |
|
BLAKE2b-256 | 5efaa4d74f3d859e109fb93b7abda84ea2d4619bc13a140b99607b391b9bbbe0 |