Opinionated set of utilities on top of FastAPI

Overview

FastAPI Contrib

Documentation Status Updates

Opinionated set of utilities on top of FastAPI

Features

  • Auth Backend & Middleware (User or None in every request object)
  • Permissions: reusable class permissions, specify multiple as FastAPI Dependency
  • ModelSerializers: serialize (pydantic) incoming request, connect data with DB model and save
  • UJSONResponse: correctly show slashes in fields with URLs
  • Limit-Offset Pagination: use it as FastAPI Dependency (works only with ModelSerializers for now)
  • MongoDB integration: Use models as if it was Django (based on pydantic models)
  • MongoDB indices verification on startup of the app
  • Custom Exceptions and Custom Exception Handlers
  • Opentracing middleware & setup utility with Jaeger tracer + root span available in every Request's state
  • StateRequestIDMiddleware: receives configurable header and saves it in request state

Roadmap

See GitHub Project Roadmap.

Installation

To install just Contrib (without mongodb, pytz, ujson):

$ pip install fastapi_contrib

To install contrib with mongodb support:

$ pip install fastapi_contrib[mongo]

To install contrib with ujson support:

$ pip install fastapi_contrib[ujson]

To install contrib with pytz support:

$ pip install fastapi_contrib[pytz]

To install contrib with opentracing & Jaeger tracer:

$ pip install fastapi_contrib[jaegertracing]

To install everything:

$ pip install fastapi_contrib[all]

Usage

To use Limit-Offset pagination:

from fastapi import FastAPI
from fastapi_contrib.pagination import Pagination
from fastapi_contrib.serializers.common import ModelSerializer
from yourapp.models import SomeModel

app = FastAPI()

class SomeSerializer(ModelSerializer):
    class Meta:
        model = SomeModel

@app.get("/")
async def list(pagination: Pagination = Depends()):
    filter_kwargs = {}
    return await pagination.paginate(
        serializer_class=SomeSerializer, **filter_kwargs
    )

Subclass this pagination to define custom default & maximum values for offset & limit:

class CustomPagination(Pagination):
    default_offset = 90
    default_limit = 1
    max_offset = 100
    max_limit = 2000

To use State Request ID Middleware:

from fastapi import FastAPI
from fastapi_contrib.common.middlewares import StateRequestIDMiddleware

app = FastAPI()

@app.on_event('startup')
async def startup():
    app.add_middleware(StateRequestIDMiddleware)

To use Authentication Middleware:

from fastapi import FastAPI
from fastapi_contrib.auth.backends import AuthBackend
from fastapi_contrib.auth.middlewares import AuthenticationMiddleware

app = FastAPI()

@app.on_event('startup')
async def startup():
    app.add_middleware(AuthenticationMiddleware, backend=AuthBackend())

Define & use custom permissions based on FastAPI Dependency framework:

from fastapi import FastAPI
from fastapi_contrib.permissions import BasePermission, PermissionsDependency

class TeapotUserAgentPermission(BasePermission):

    def has_required_permissions(self, request: Request) -> bool:
        return request.headers.get('User-Agent') == "Teapot v1.0"

app = FastAPI()

@app.get(
    "/teapot/",
    dependencies=[Depends(
        PermissionsDependency([TeapotUserAgentPermission]))]
)
async def teapot() -> dict:
    return {"teapot": True}

Setup uniform exception-handling:

from fastapi import FastAPI
from fastapi_contrib.exception_handlers import setup_exception_handlers

app = FastAPI()

@app.on_event('startup')
async def startup():
    setup_exception_handlers(app)

If you want to correctly handle scenario when request is an empty body (IMPORTANT: non-multipart):

from fastapi import FastAPI
from fastapi_contrib.routes import ValidationErrorLoggingRoute

app = FastAPI()
app.router.route_class = ValidationErrorLoggingRoute

Or if you use multiple routes for handling different namespaces (IMPORTANT: non-multipart):

from fastapi import APIRouter, FastAPI
from fastapi_contrib.routes import ValidationErrorLoggingRoute

app = FastAPI()

my_router = APIRouter(route_class=ValidationErrorLoggingRoute)

To correctly show slashes in fields with URLs + ascii locking:

from fastapi import FastAPI
from fastapi_contrib.common.responses import UJSONResponse

app = FastAPI()

@app.get("/", response_class=UJSONResponse)
async def root():
    return {"a": "b"}

Or specify it as default response class for the whole app (FastAPI >= 0.39.0):

from fastapi import FastAPI
from fastapi_contrib.common.responses import UJSONResponse

app = FastAPI(default_response_class=UJSONResponse)

To setup Jaeger tracer and enable Middleware that captures every request in opentracing span:

from fastapi import FastAPI
from fastapi_contrib.tracing.middlewares import OpentracingMiddleware
from fastapi_contrib.tracing.utils import setup_opentracing

app = FastAPI()

@app.on_event('startup')
async def startup():
    setup_opentracing(app)
    app.add_middleware(OpentracingMiddleware)

To setup mongodb connection at startup and never worry about it again:

from fastapi import FastAPI
from fastapi_contrib.db.utils import setup_mongodb

app = FastAPI()

@app.on_event('startup')
async def startup():
    setup_mongodb(app)

Use models to map data to MongoDB:

from fastapi_contrib.db.models import MongoDBModel

class MyModel(MongoDBModel):
    additional_field1: str
    optional_field2: int = 42

    class Meta:
        collection = "mymodel_collection"


mymodel = MyModel(additional_field1="value")
mymodel.save()

assert mymodel.additional_field1 == "value"
assert mymodel.optional_field2 == 42
assert isinstance(mymodel.id, int)

Or use TimeStamped model with creation datetime:

from fastapi_contrib.db.models import MongoDBTimeStampedModel

class MyTimeStampedModel(MongoDBTimeStampedModel):

    class Meta:
        collection = "timestamped_collection"


mymodel = MyTimeStampedModel()
mymodel.save()

assert isinstance(mymodel.id, int)
assert isinstance(mymodel.created, datetime)

Use serializers and their response models to correctly show Schemas and convert from JSON/dict to models and back:

from fastapi import FastAPI
from fastapi_contrib.db.models import MongoDBModel
from fastapi_contrib.serializers import openapi
from fastapi_contrib.serializers.common import Serializer

from yourapp.models import SomeModel

app = FastAPI()


class SomeModel(MongoDBModel):
    field1: str


@openapi.patch
class SomeSerializer(Serializer):
    read_only1: str = "const"
    write_only2: int
    not_visible: str = "42"

    class Meta:
        model = SomeModel
        exclude = {"not_visible"}
        write_only_fields = {"write_only2"}
        read_only_fields = {"read_only1"}


@app.get("/", response_model=SomeSerializer.response_model)
async def root(serializer: SomeSerializer):
    model_instance = await serializer.save()
    return model_instance.dict()

POST-ing to this route following JSON:

{"read_only1": "a", "write_only2": 123, "field1": "b"}

Should return following response:

{"id": 1, "field1": "b", "read_only1": "const"}

Auto-creation of MongoDB indexes

Suppose we have this directory structure:

-- project_root/
     -- apps/
          -- app1/
               -- models.py (with MongoDBModel inside with indices declared)
          -- app2/
               -- models.py (with MongoDBModel inside with indices declared)

Based on this, your name of the folder with all the apps would be "apps". This is the default name for fastapi_contrib package to pick up your structure automatically. You can change that by setting ENV variable CONTRIB_APPS_FOLDER_NAME (by the way, all the setting of this package are overridable via ENV vars with CONTRIB_ prefix before them).

You also need to tell fastapi_contrib which apps to look into for your models. This is controlled by CONTRIB_APPS ENV variable, which is list of str names of the apps with models. In the example above, this would be CONTRIB_APPS=["app1","app2"].

Just use create_indexes function after setting up mongodb:

from fastapi import FastAPI
from fastapi_contrib.db.utils import setup_mongodb, create_indexes

app = FastAPI()

@app.on_event("startup")
async def startup():
    setup_mongodb(app)
    await create_indexes()

This will scan all the specified CONTRIB_APPS in the CONTRIB_APPS_FOLDER_NAME for models, that are subclassed from either MongoDBModel or MongoDBTimeStampedModel and create indices for any of them that has Meta class with indexes attribute:

models.py:

import pymongo
from fastapi_contrib.db.models import MongoDBTimeStampedModel


class MyModel(MongoDBTimeStampedModel):

    class Meta:
        collection = "mymodel"
        indexes = [
            pymongo.IndexModel(...),
            pymongo.IndexModel(...),
        ]

This would not create duplicate indices because it relies on pymongo and motor to do all the job.

Credits

This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.

Comments
  • Passing extra arguments to MongoDBModel.list()

    Passing extra arguments to MongoDBModel.list()

    • FastAPI Contrib version: 0.1.14
    • FastAPI version: 0.42
    • Python version: 3.7.4
    • Operating System: Debian 10

    Description

    Hi, I am trying to get a list of entries from a collection sorted in descending order according to a recorded date (not a creation timestamp, I am not using the timestamped model). Pymongo sort should work passing a sort=[(key, value)] argument, but when I do that, I get back an empty list. Am I doing anything wrong?

    What I Did

    This is my function. The field transmit_time is a MongoDB date field.

    @router.get("/")
    async def get_packets(limit: int = 100, offset: int = 0):
        sort_desc = [('transmit_time', -1)]
        packets = await Packet.list(_limit=limit, _offset=offset, sort=sort_desc)
        return packets
    
    question 
    opened by dasv 5
  • consider using configurator for settings store

    consider using configurator for settings store

    Reading https://github.com/identixone/fastapi_contrib/blob/master/fastapi_contrib/conf.py#L73 - you may find https://configurator.readthedocs.io/en/latest/ to be of interest.

    In particular https://configurator.readthedocs.io/en/latest/patterns.html#global-configuration-object.

    If you have any questions, please ping me on here :-)

    enhancement 
    opened by cjw296 4
  • has_required_permisions typo or bypass of naming conflict?

    has_required_permisions typo or bypass of naming conflict?

    • FastAPI Contrib version: 0.2.8
    • FastAPI version: 0.61.1
    • Python version: 3.8
    • Operating System: Ubuntu 20.04

    has_required_permisions method from BasePermission class should be has_required_permissions, is it a typo or is it a trick to bypass a naming conflict?

    bug 
    opened by rsommerard 3
  • How to save data in Mongo?

    How to save data in Mongo?

    • FastAPI Contrib version: 0.2.7
    • FastAPI version: 0.59.0
    • Python version: 3.7.7
    • Operating System: MacOS

    Description

    Hello. I was looking for tools with what will be possible to play FastAPI with MongoDB in nice, simple way, because I never before using NoSQL. I found FastAPI_Contrib, my attention takes especially two of features:

    1. ModelSerializers: serialize (pydantic) incoming request, connect data with DB model and save

    2. MongoDB integration: Use models as if it was Django (based on pydantic models)

    I was trying all day to understand the documentation how to use FastAPI_Contrib, unfortunately documentation is so hard for entry-level users. What I want to achieve at this time is nothing more than just:

    1. Create Model
    2. Create Serializer
    3. Send the request with data from for example Postman
    4. Save that data in MongoDB

    Just a first step of CRUD...

    What I Did

    I was trying take it in very different ways, but for this issue I will present the most simply way based on documentation...

    Project Structure:
    project/
    - project/
    -- sample/
    --- __init__.py
    --- serializers.py
    - __init__.py
    - main.py
    

    project/main.py:

    import os
    
    from fastapi_contrib.db.utils import setup_mongodb, create_indexes
    import motor.motor_asyncio
    from fastapi import FastAPI
    from dotenv import load_dotenv
    
    from project.serializers import sample_router
    
    load_dotenv(verbose=True)
    DATABASE_URL =os.getenv("DB_URL")
    
    SECRET = os.getenv("SECRET")
    
    CONTRIB_APPS = os.getenv("CONTRIB_APPS")
    CONTRIB_APPS_FOLDER_NAME = os.getenv("CONTRIB_APPS_FOLDER_NAME")
    
    client = motor.motor_asyncio.AsyncIOMotorClient(
        DATABASE_URL, uuidRepresentation="standard"
    )
    db = client["sample"]
    
    app = FastAPI()
    
    @app.on_event("startup")
    async def startup():
        setup_mongodb(db)
        await create_indexes()
        print('Is it connected to DB?')
    
    app.include_router(sample_router)
    

    project/sample/serializers.py

    from fastapi import APIRouter
    from fastapi_contrib.db.models import MongoDBModel
    from fastapi_contrib.serializers import openapi
    from fastapi_contrib.serializers.common import Serializer
    
    # from yourapp.models import SomeModel
    
    sample_router = APIRouter()
    
    
    class SomeModel(MongoDBModel):
        field1: str
    
        class Meta:
            collection = "test"
    
    
    @openapi.patch
    class SomeSerializer(Serializer):
        read_only1: str = "const"
        write_only2: int
        not_visible: str = "42"
    
        class Meta:
            model = SomeModel
            exclude = {"not_visible"}
            write_only_fields = {"write_only2"}
            read_only_fields = {"read_only1"}
    
    
    @sample_router.post("/test/", response_model=SomeSerializer.response_model)
    async def root(serializer: SomeSerializer):
        model_instance = await serializer.save()
        return model_instance.dict()
    

    When I send data as POST to /test/ from postman

    {
      "write_only2": 2,
      "field1": "string"
    }
    

    or by curl

    curl -X POST "http://127.0.0.1:8000/test/" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"id\":0,\"field1\":\"string\",\"write_only2\":0}"
    

    Then I got errors: Screenshot 1

    if I will remove:

        class Meta:
            collection = "test"
    

    as it in an example in documentation then I got other error: Screenshot 2

    I will be grateful if someone will explain to me using simple examples how to properly combine models, serializers, and perform CRUD operations on them reflected in MongoDB.

    By the way. I think is it good idea to rewrite documentation to be more affordable to not so advenced users. And add to them a tutorial, awesome will be to see there real world examples. I think, good documentation can make this package a very popular.

    Regards, Oskar

    opened by oskar-gmerek 3
  • Issue with  updating a document

    Issue with updating a document

    Hi, I am having trouble to update a document.
    My model:

    class MyModel(MongoDBTimeStampedModel):
        id: UUID
        other: str
    

    Usage:

    MyModel.update_one(
         {'id': UUID(id)},
         update={
                '$set': { 'other' : 'something'}
            }
    )
    

    Is it a bug in passing kwargs to await collection.update_one( filter_kwargs, kwargs, session=session ) should not it be await collection.update_one( filter_kwargs, **kwargs, session=session ) or am I getting something wrong? Ref: Source code

    question 
    opened by mariamgarchagudashvili 3
  • Firestore DB Support

    Firestore DB Support

    Hi,

    This library looks fantastic and I'm going to try and use it for the easy mongodb integration with FastAPI. What I would be interested in (and may look to contribute myself) is a FirestoreClient (GCP's serverless document db) that could work as a drop in replacement for the mongodb client as I'm seeking to support both in a project i'm working on. I can see the intention of your design is to provide a nice abstraction to the DB technology, this use case would put that to the test with a second implementation.

    enhancement help wanted 
    opened by SamuelBradley 3
  • Allow overriding settings from fastAPI app

    Allow overriding settings from fastAPI app

    • FastAPI Contrib version: 0.2.9
    • FastAPI version: 0.52.0
    • Python version: 3.8.2
    • Operating System: Linux

    Description

    Currently we can only override settings with settings from the fastAPI app by using environment variables (See the Todo). Can we implement this functionaility, so we do not have to go through the environment variables?

    opened by pheanex 2
  • Why is the version of FastAPI fixed in the install_requires?

    Why is the version of FastAPI fixed in the install_requires?

    Currently fastapi/pydantic versions are fixed in setup.py:

    requirements = [
        'fastapi==0.52.0',
        'pydantic==1.4',
        'contextvars;python_version<"3.7"'
    ]
    

    Is there a reason not to use >= instead?

    If compatibility is a concern, it's possible to test against different versions of FastAPI on TravisCI.

    enhancement help wanted good first issue 
    opened by gukoff 2
  • Minor error in README code sample of  limit-offset pagination

    Minor error in README code sample of limit-offset pagination

    Description

    Sample taken from: https://github.com/identixone/fastapi_contrib#usage

    class CustomPagination(Pagination):
        default_offset = 90
        default_limit = 1
        max_offset = 100`
        max_limit = 2000
    

    In the above code, notice there's one extra character after max_offset = 100

    What I Did

    Paste the command(s) you ran and the output.
    If there was a crash, please include the traceback here.
    
        max_offset = 100`
                        ^
    SyntaxError: invalid syntax
    
    opened by Haider8 2
  • Add Support for FastAPI latest version

    Add Support for FastAPI latest version

    • FastAPI Contrib version:
    • FastAPI version: 0.45.0
    • Python version: 3.7
    • Operating System: Linux

    Description

    pipenv.exceptions.ResolutionFailure: ERROR: ERROR: Could not find a version that matches fastapi==0.42.0,==0.45.0

    What I Did

    Trying to use lib with FastAPI 0.45.0 and up
    
    enhancement help wanted 
    opened by vveliev-tc 2
  • Bug with List of response_models taken from Serializer

    Bug with List of response_models taken from Serializer

    Description

    When trying to use List of generated response_model model as response_model in route, you get in response

    {
      "code": 400,
      "detail": "Validation error",
      "fields": [
        {
          "name": "response",
          "message": "Value is not a valid list"
        }
      ]
    }
    

    What I Did

    from typing import List
    from fastapi import APIRouter, Depends
    
    from fastapi_contrib.pagination import Pagination
    from fastapi_contrib.serializers import openapi
    from fastapi_contrib.serializers.common import Serializer
    
    
    @openapi.patch
    class MySerializer(Serializer):
        ...
    
    
    router = APIRouter()
    
    
    @router.get("/", response_model=List[MySerializer.response_model])
    async def lst(pagination: Pagination = Depends()):
        return await pagination.paginate(MySerializer)
    
    bug help wanted good first issue 
    opened by levchik 2
  • How to mock or override PermissionsDependency

    How to mock or override PermissionsDependency

    • FastAPI Contrib version: Latest
    • FastAPI version: Latest
    • Python version: 3.9.7
    • Operating System: Mac Os

    Description

    Hello guys I need help with testing PermissionsDependency.

    What I Did

    My current code is :

    api_router.include_router(
        article_deviation.router,
        prefix="{Confidential information}",
        tags=["{confidential information}"],
        dependencies=[
            Depends(azure_scheme),
            Depends(PermissionsDependency([QCPermission])),
        ],
    )
    

    In the test I override azure_scheme as :

    
    api_client = TestClient(app)
    app.dependency_overrides[azure_scheme] = {"Authorized": "Yes"}
    
    

    but with

    
    api_client = TestClient(app)
    app.dependency_overrides[PermissionsDependency([QCPermission])] = True
    
    

    It does not work.

    Thank you in advance! Wish you all best!

    opened by kristiqntashev 0
  • Pin ujson to latest version 5.4.0

    Pin ujson to latest version 5.4.0

    This PR pins ujson to the latest release 5.4.0.

    The bot wasn't able to find a changelog for this release. Got an idea?

    Links
    • PyPI: https://pypi.org/project/ujson
    • Repo: https://github.com/ultrajson/ultrajson
    opened by pyup-bot 0
  • ModuleNotFoundError: No module named 'fastapi_contrib'

    ModuleNotFoundError: No module named 'fastapi_contrib'

    • FastAPI Contrib version: 0.2.11
    • FastAPI version: 0.78.0
    • Python version: 3.8.13
    • Operating System: mac

    Description

    I cloned fastapi project which uses fastapi-contrib library.

    and then i installed fastapi-contrib with $ pip install fastapi_contrib.

    but ModuleNotFoundError: No module named 'fastapi_contrib' was logged repeatly. 😅

    Thank you for your busy schedule. 🙏🏼

    What I Did

    • Pycharm turned off and on.
    • $ pip install fastapi_contrib[all] (but it says zsh: no matches found: fastapi_contrib[all])
    opened by seongkyu-lim 0
  • Pin ujson to latest version 5.2.0

    Pin ujson to latest version 5.2.0

    This PR pins ujson to the latest release 5.2.0.

    The bot wasn't able to find a changelog for this release. Got an idea?

    Links
    • PyPI: https://pypi.org/project/ujson
    • Repo: https://github.com/ultrajson/ultrajson
    opened by pyup-bot 0
  • Update pytz to 2022.1

    Update pytz to 2022.1

    This PR updates pytz from 2019.3 to 2022.1.

    The bot wasn't able to find a changelog for this release. Got an idea?

    Links
    • PyPI: https://pypi.org/project/pytz
    • Homepage: http://pythonhosted.org/pytz
    • Docs: https://pythonhosted.org/pytz/
    opened by pyup-bot 0
Releases(v0.2.11)
  • v0.2.11(Jun 3, 2021)

  • v0.2.10(Mar 1, 2021)

    • Dropped Python 3.6 support
    • Added Python 3.9 support
    • FastAPI is updated to the latest version in requirements
    • Fixed serializer base class bug because of latest pydantic update (1.8)
    Source code(tar.gz)
    Source code(zip)
Owner
identix.one
The first worldwide ready-to-use facial recognition cloud platform
identix.one
fastapi-cache is a tool to cache fastapi response and function result, with backends support redis and memcached.

fastapi-cache Introduction fastapi-cache is a tool to cache fastapi response and function result, with backends support redis, memcache, and dynamodb.

long2ice 551 Jan 08, 2023
Flask-Bcrypt is a Flask extension that provides bcrypt hashing utilities for your application.

Flask-Bcrypt Flask-Bcrypt is a Flask extension that provides bcrypt hashing utilities for your application. Due to the recent increased prevelance of

Max Countryman 310 Dec 14, 2022
A Flask extension that enables or disables features based on configuration.

Flask FeatureFlags This is a Flask extension that adds feature flagging to your applications. This lets you turn parts of your site on or off based on

Rachel Greenfield 131 Sep 26, 2022
CLI and Streamlit applications to create APIs from Excel data files within seconds, using FastAPI

FastAPI-Wrapper CLI & APIness Streamlit App Arvindra Sehmi, Oxford Economics Ltd. | Website | LinkedIn (Updated: 21 April, 2021) fastapi-wrapper is mo

Arvindra 49 Dec 03, 2022
Learn to deploy a FastAPI application into production DigitalOcean App Platform

Learn to deploy a FastAPI application into production DigitalOcean App Platform. This is a microservice for our Try Django 3.2 project. The goal is to extract any and all text from images using a tec

Coding For Entrepreneurs 59 Nov 29, 2022
Middleware for Starlette that allows you to store and access the context data of a request. Can be used with logging so logs automatically use request headers such as x-request-id or x-correlation-id.

starlette context Middleware for Starlette that allows you to store and access the context data of a request. Can be used with logging so logs automat

Tomasz Wójcik 300 Dec 26, 2022
Basic fastapi blockchain - An api based blockchain with full functionality

Basic fastapi blockchain - An api based blockchain with full functionality

1 Nov 27, 2021
FastAPI native extension, easy and simple JWT auth

fastapi-jwt FastAPI native extension, easy and simple JWT auth

Konstantin Chernyshev 19 Dec 12, 2022
Asynchronous event dispatching/handling library for FastAPI and Starlette

fastapi-events An event dispatching/handling library for FastAPI, and Starlette. Features: straightforward API to emit events anywhere in your code ev

Melvin 238 Jan 07, 2023
Opentracing support for Starlette and FastApi

Starlette-OpenTracing OpenTracing support for Starlette and FastApi. Inspired by: Flask-OpenTracing OpenTracing implementations exist for major distri

Rene Dohmen 63 Dec 30, 2022
Adds simple SQLAlchemy support to FastAPI

FastAPI-SQLAlchemy FastAPI-SQLAlchemy provides a simple integration between FastAPI and SQLAlchemy in your application. It gives access to useful help

Michael Freeborn 465 Jan 07, 2023
Cube-CRUD is a simple example of a REST API CRUD in a context of rubik's cube review service.

Cube-CRUD is a simple example of a REST API CRUD in a context of rubik's cube review service. It uses Sqlalchemy ORM to manage the connection and database operations.

Sebastian Andrade 1 Dec 11, 2021
LuSyringe is a documentation injection tool for your classes when using Fast API

LuSyringe LuSyringe is a documentation injection tool for your classes when using Fast API Benefits The main benefit is being able to separate your bu

Enzo Ferrari 2 Sep 06, 2021
Docker Sample Project - FastAPI + NGINX

Docker Sample Project - FastAPI + NGINX Run FastAPI and Nginx using Docker container Installation Make sure Docker is installed on your local machine

1 Feb 11, 2022
Regex Converter for Flask URL Routes

Flask-Reggie Enable Regex Routes within Flask Installation pip install flask-reggie Configuration To enable regex routes within your application from

Rhys Elsmore 48 Mar 07, 2022
Simple FastAPI Example : Blog API using FastAPI : Beginner Friendly

fastapi_blog FastAPI : Simple Blog API with CRUD operation Steps to run the project: git clone https://github.com/mrAvi07/fastapi_blog.git cd fastapi-

Avinash Alanjkar 1 Oct 08, 2022
CURSO PROMETHEUS E GRAFANA: Observability in a real world

Curso de monitoração com o Prometheus Esse curso ensina como usar o Prometheus como uma ferramenta integrada de monitoração, entender seus conceitos,

Rafael Cirolini 318 Dec 23, 2022
FastAPI-Amis-Admin is a high-performance, efficient and easily extensible FastAPI admin framework. Inspired by django-admin, and has as many powerful functions as django-admin.

简体中文 | English 项目介绍 FastAPI-Amis-Admin fastapi-amis-admin是一个拥有高性能,高效率,易拓展的fastapi管理后台框架. 启发自Django-Admin,并且拥有不逊色于Django-Admin的强大功能. 源码 · 在线演示 · 文档 · 文

AmisAdmin 318 Dec 31, 2022
FastAPI application and service structure for a more maintainable codebase

Abstracting FastAPI Services See this article for more information: https://camillovisini.com/article/abstracting-fastapi-services/ Poetry poetry inst

Camillo Visini 309 Jan 04, 2023
Opinionated set of utilities on top of FastAPI

FastAPI Contrib Opinionated set of utilities on top of FastAPI Free software: MIT license Documentation: https://fastapi-contrib.readthedocs.io. Featu

identix.one 543 Jan 05, 2023