Skip to main content

https://scrutinizer-ci.com/g/dotX12/fastapi-gateway/ https://scrutinizer-ci.com/g/dotX12/fastapi-gateway/ https://scrutinizer-ci.com/g/dotX12/fastapi-gateway/ https://badge.fury.io/py/fastapi-gateway https://pepy.tech/project/fastapi-gateway https://pepy.tech/project/fastapi-gateway https://github.com/dotX12/fastapi-gateway/blob/master/LICENSE

⚙️ fastapi-gateway is async single entry point for microservices.

API Gateway performs many tasks: accepts, processes and distributes requests, controls traffic, monitors and controls access and security, caching, throttling.

Initially, this project was created for myself, I needed to implement identification, authentication and authorization. In the future, there was a need to limit requests for each user on every endpoint, create API plans. There were a lot of microservices and to keep in each microservice the logic for limiting endpoints, security logic, logging etc. - meaningless. Therefore, all this functionality is located at a single entry point, which already implements all the necessary tasks with security, limiting, etc., while microservices now directly solve their tasks.

💿 Installation

pip install fastapi_gateway

❗️ Benchmark

1.5k - 3k RPC.

gitshit@git ~ % wrk -t 4 -c 40 http://gateway.localtest.me:8003/gateway_endpoint/path_param/12
Running 10s test @ http://gateway.localtest.me:8003/gateway_endpoint/path_param/12
  4 threads and 40 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    30.11ms   33.65ms 312.55ms   95.98%
    Req/Sec   395.03    218.80     0.89k    73.21%
  15550 requests in 10.05s, 2.31MB read
Requests/sec:   1547.81
Transfer/sec:    235.81KB

💻 Example

Example of use (long code)
from starlette import status
from starlette.requests import Request
from starlette.responses import Response
from fastapi_gateway import route
from fastapi import FastAPI
from pydantic import BaseModel
from fastapi import Depends
from fastapi.security import APIKeyHeader
from starlette import status
from starlette.exceptions import HTTPException

app = FastAPI(title='API Gateway')
SERVICE_URL = "http://microservice.localtest.me:8002"

API_KEY_NAME = "x-api-key"

api_key_header = APIKeyHeader(
    name=API_KEY_NAME,
    auto_error=False
)


def check_api_key(key: str = Depends(api_key_header)):
    if key:
        return key
    raise HTTPException(
        status_code=status.HTTP_401_UNAUTHORIZED,
        detail="You didn't pass the api key in the header! Header: x-api-key",
    )


class FooModel(BaseModel):
    example_int: int
    example_str: str


@route(
    request_method=app.post,
    service_url=SERVICE_URL,
    gateway_path='/query_and_body_path/{path}',
    service_path='/v1/query_and_body_path/{path}',
    query_params=['query_int', 'query_str'],
    body_params=['test_body'],
    status_code=status.HTTP_200_OK,
    tags=['Query', 'Body', 'Path'],
    dependencies=[
        Depends(check_api_key)
    ],
)
async def check_query_params_and_body(
        path: int, query_int: int, query_str: str,
        test_body: FooModel, request: Request, response: Response
):
    pass

See more examples here:

Tests and instructions for launch
Souce code Gateway
Souce code Microservice #1

🪛 How to use?

  • request_method - is a callable (like app.get, app.post, foo_router.patch and so on.).
  • service_url - the path to the endpoint on another service (like "https://microservice1.example.com").
  • service_path - the path to the method in microservice (like "/v1/microservice/users").
  • gateway_path - is the path to bind gateway.
    For example, your gateway api is located here - https://gateway.example.com and the path to endpoint (gateway_path) - "/users" then the full way to this method will be - https://gateway.example.com/users
  • override_headers - Boolean value allows you to return all the headlines that were created by microservice in gateway.
  • query_params - used to extract query parameters from endpoint and transmission to microservice
  • form_params - used to extract form model parameters from endpoint and transmission to microservice
  • param body_params - used to extract body model from endpoint and transmission to microservice

⚠️ - Be sure to transfer the name of the argument to the router, which is in the endpoint func!

query_params - List[Query]
body_params - List[Body]
form_params - List[File, Form]
In more detail how to transmit body, form and query (photo)

Metadata

Release files for fastapi-gateway 0.0.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fastapi-gateway 0.0.4
File Size Uploaded Provenance Actions
fastapi_gateway-0.0.4.tar.gz 10.2 kB Without provenance Details for fastapi_gateway-0.0.4.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for fastapi-gateway 0.0.4
File Interpreter ABI Platform Actions
fastapi_gateway-0.0.4-py3-none-any.whl Python 3 none any Details for fastapi_gateway-0.0.4-py3-none-any.whl

Total release size: 23.6 kB

Release files / fastapi_gateway-0.0.4.tar.gz

Download URL fastapi_gateway-0.0.4.tar.gz
Size 10.2 kB
Tags Source
SHA-256 checksum
How to use checksums
719a96ded3f3bec6f1f567564a4dd3224a47bb09f5983a8957e598b08b306ee0
BLAKE2b-256 checksum
How to use checksums
b38ecf0833229aae8284acb70d9397e7989e0b94cd576686c1584f5cf75746d7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.3.2 CPython/3.11.1 Linux/5.15.0-1031-azure

Release files / fastapi_gateway-0.0.4-py3-none-any.whl

Download URL fastapi_gateway-0.0.4-py3-none-any.whl
Size 13.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
878fe8c5d3f6cb78e00e9ff1d0d73e9446b89aaf63cfd9cbdcd422bcaa7ea0fa
BLAKE2b-256 checksum
How to use checksums
31a4acbfad980dbebc26cb31bf6339320932e6761877030d9c67600a1404cc0a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.3.2 CPython/3.11.1 Linux/5.15.0-1031-azure

Security for fastapi-gateway 0.0.4

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page