• Stars
    star
    734
  • Rank 61,748 (Top 2 %)
  • Language
    Python
  • Created over 4 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

FastAPI boilerplate for real world production

FastAPI Boilerplate

Features

  • Async SQLAlchemy session
  • Custom user class
  • Top-level dependency
  • Dependencies for specific permissions
  • Celery
  • Dockerize(Hot reload)
  • Event dispatcher
  • Cache

Run

python3 main.py --env local|dev|prod --debug

SQLAlchemy for asyncio context

from core.db import Transactional, session


@Transactional()
async def create_user(self):
    session.add(User(email="[email protected]"))

Do not use explicit commit(). Transactional class automatically do.

Standalone session

According to the current settings, the session is set through middleware.

However, it doesn't go through middleware in tests or background tasks.

So you need to use the @standalone_session decorator.

from core.db import standalone_session


@standalone_session
def test_something():
    ...

Multiple databases

Go to core/config.py and edit WRITER_DB_URL and READER_DB_URL in the config class.

If you need additional logic to use the database, refer to the get_bind() method of RoutingClass.

Custom user for authentication

from fastapi import Request


@home_router.get("/")
def home(request: Request):
    return request.user.id

Note. you have to pass jwt token via header like Authorization: Bearer 1234

Custom user class automatically decodes header token and store user information into request.user

If you want to modify custom user class, you have to update below files.

  1. core/fastapi/schemas/current_user.py
  2. core/fastapi/middlewares/authentication.py

CurrentUser

class CurrentUser(BaseModel):
    id: int = Field(None, description="ID")

Simply add more fields based on your needs.

AuthBackend

current_user = CurrentUser()

After line 18, assign values that you added on CurrentUser.

Top-level dependency

Note. Available from version 0.62 or higher.

Set a callable function when initialize FastAPI() app through dependencies argument.

Refer Logging class inside of core/fastapi/dependencies/logging.py

Dependencies for specific permissions

Permissions IsAdmin, IsAuthenticated, AllowAll have already been implemented.

from core.fastapi.dependencies import (
    PermissionDependency,
    IsAdmin,
)


user_router = APIRouter()


@user_router.get(
    "",
    response_model=List[GetUserListResponseSchema],
    response_model_exclude={"id"},
    responses={"400": {"model": ExceptionResponseSchema}},
    dependencies=[Depends(PermissionDependency([IsAdmin]))],  # HERE
)
async def get_user_list(
    limit: int = Query(10, description="Limit"),
    prev: int = Query(None, description="Prev ID"),
):
    pass

Insert permission through dependencies argument.

If you want to make your own permission, inherit BasePermission and implement has_permission() function.

Note. In order to use swagger's authorize function, you must put PermissionDependency as an argument of dependencies.

Event dispatcher

Refer the README of https://github.com/teamhide/fastapi-event

Cache

Caching by prefix

from core.helpers.cache import Cache


@Cache.cached(prefix="get_user", ttl=60)
async def get_user():
    ...

Caching by tag

from core.helpers.cache import Cache, CacheTag


@Cache.cached(tag=CacheTag.GET_USER_LIST, ttl=60)
async def get_user():
    ...

Use the Cache decorator to cache the return value of a function.

Depending on the argument of the function, caching is stored with a different value through internal processing.

Custom Key builder

from core.helpers.cache.base import BaseKeyMaker


class CustomKeyMaker(BaseKeyMaker):
    async def make(self, function: Callable, prefix: str) -> str:
        ...

If you want to create a custom key, inherit the BaseKeyMaker class and implement the make() method.

Custom Backend

from core.helpers.cache.base import BaseBackend


class RedisBackend(BaseBackend):
    async def get(self, key: str) -> Any:
        ...

    async def set(self, response: Any, key: str, ttl: int = 60) -> None:
        ...

    async def delete_startswith(self, value: str) -> None:
        ...

If you want to create a custom key, inherit the BaseBackend class and implement the get(), set(), delete_startswith() method.

Pass your custom backend or keymaker as an argument to init. (/app/server.py)

def init_cache() -> None:
    Cache.init(backend=RedisBackend(), key_maker=CustomKeyMaker())

Remove all cache by prefix/tag

from core.helpers.cache import Cache, CacheTag


await Cache.remove_by_prefix(prefix="get_user_list")
await Cache.remove_by_tag(tag=CacheTag.GET_USER_LIST)

More Repositories

1

fastapi-layered-architecture

FastAPI Layered Architecture
Python
230
star
2

pythondi

Python lightweight dependency injection library
Python
51
star
3

python-saga-pattern-example

Python SAGA Pattern Example
Python
39
star
4

fastapi-event

Event dispatcher for FastAPI
Python
38
star
5

confparser

Python config parser library
Python
6
star
6

strip-deco

Easily strip decorator from function or class method
Python
5
star
7

spring-cqrs-example

Spring boot CQRS example
Java
4
star
8

codelog_backend

Codelog Backend
Python
4
star
9

graphql_mysql

GraphQL with MySQL
JavaScript
3
star
10

psycho-test

psycho-test
JavaScript
2
star
11

facebook_lottery

페이슀뢁 λŒ“κΈ€ 좔첨기
Python
2
star
12

msa_example

Microservice Architecture with Kubernetes
Python
2
star
13

kotlin-spring-boilerplate

Kotlin spring hexagonal architecture
Kotlin
2
star
14

codelog_frontend

Codelog Frontend
Vue
2
star
15

drf_cookiecutter_mongo

Django DRF Boilerplate with MongoEngine
Python
1
star
16

rdb_mongo_validator

RDB <-> Mongo Data Validator using Multiprocess
Python
1
star
17

threejs_text_universe

Text Universe with three.js
JavaScript
1
star
18

writeup

CTF Write-Up
1
star
19

css3_rotate_animation

CSS3 rotate animation example
CSS
1
star
20

fastapi-hexagonal-architecture

Hexagonal Architecture with FastAPI
1
star
21

terraform_ecr

AWS ECS + ALB with Terraform
HCL
1
star
22

coupon-system

Coupon system example
Python
1
star
23

spring-boot-boilerplate

Spring boot boilerplate
Java
1
star
24

ecs_codedeploy_script

AWS ECS Blue/Green Deployment Codedeploy trigger script
Shell
1
star
25

python_geohash_translator

Python translate lat, lng to Geohash
Python
1
star
26

codelog

Record all of url that you want to remind
1
star