FastAPI Hive Framework, modulization of code layout

Introduction

FastAPI Hive Framework is a developer friendly and easy to be integrated framework for managing your code by endpoints and cornerstones folder structure.

The key features are:

  • Conerstone Container: a top-level folder to layout codes by function folder, like db and authentication.

  • Endpoint Container: a top-level folder to layout service codes by endpoint folder,

  • Endpoint folder: a sub-folder in Endpoint Container, layout one service code by function folder(router, db, service, etc).

  • Router Mounting Automatically: the router defined by module will be mounted into app automatically.

  • Model Preloading Easily: the service(such as ML model) defined by module will be mounted into app easily, in order to reduce loading time during endpoint request.

  • Developer-Friendly: all one-endpoint/cornerstone codes are put in one same folders, easy to review and update.

  • Easy-to-be-Integrated: Just several line codes to integrate it in your app.

Why

Regular project layout & its cons.

  Let’s look at the regular project folder layout.There are serval function folders in the app, and the folders are arranged by functions, such as routes/models/services.No problem if folders are set like this for small project.

  But when it comes to large scale project which contains too many services and functions, it will bring tough task to maintain these codes, because those services’ code files are existent in different folders, hard to review, you have to jumping among different folders.

  Beyond the problem, developer also need to register some functions in main.py, such as router registering.

  So it is ideal for developer to maintain each related functional code files in one container_name folder, and register all service and function codes into app automatically.

For the classical code layout:

Reference: https://github.com/eightBEC/fastapi-ml-skeleton/tree/master/fastapi_skeleton

app
router
heartbeat.py
prediction.py
models
heartbeat.py
prediction.py
services
heartbeat.py
prediction.py
main.py
app
    router
        heartbeat.py
        prediction.py
    models
        heartbeat.py
        prediction.py
    services
        heartbeat.py
        prediction.py
    main.py
app router heartbeat.py prediction.py models heartbeat.py prediction.py services heartbeat.py prediction.py main.py

Ideal project layout & its pros.

  Here is the ideal folder structure layout from developers’ perspective. For each of service container_name(heartbeat and prediction), there is one module folder for containing all functional code files.

  Furthermore, developers do not have to register function into app, such as router.

app
packages
heartbeat
router.py
models.py
service.py
prediction
router.py
models.py
service.py
main.py
app
    packages
        heartbeat
            router.py
            models.py
            service.py
        prediction
            router.py
            models.py
            service.py
    main.py
app packages heartbeat router.py models.py service.py prediction router.py models.py service.py main.py

How

  FastAPI Hive Framework is the solution to the problems in “why” chapter. In this chapter, let see how to apply it in project.

Install it.

pip3 install fastapi_hive
pip3 install fastapi_hive
pip3 install fastapi_hive

Enter fullscreen mode Exit fullscreen mode

Integrate it into your app

Note: You can reference example code to complete this part.
Make packages of cornerstones and endpoints

First, create or refactor you code into cornerstones and endpoints folders:

Code Folder Structure

app
cornerstones
db
__init__.py
implement.py
auth
__init__.py
implement.py
endpoint_packages
heartbeat
api.py
models.py
service.py
__init__.py
house_price
api.py
models.py
service.py
__init__.py
app
    cornerstones
        db
            __init__.py
            implement.py
        auth
            __init__.py
            implement.py
    endpoint_packages
        heartbeat
            api.py
            models.py
            service.py
            __init__.py
        house_price
            api.py
            models.py
            service.py
            __init__.py
app cornerstones db __init__.py implement.py auth __init__.py implement.py endpoint_packages heartbeat api.py models.py service.py __init__.py house_price api.py models.py service.py __init__.py

Enter fullscreen mode Exit fullscreen mode

From code view, the setup or teardown hooks should be set in init.py if needed.

For cornerstone

<span>from</span> <span>fastapi</span> <span>import</span> <span>FastAPI</span>
<span>from</span> <span>fastapi_hive.ioc_framework.cornerstone_hooks</span> <span>import</span> <span>CornerstoneHooks</span><span>,</span> <span>CornerstoneAsyncHooks</span>
<span>from</span> <span>example.cornerstone.auth.implement</span> <span>import</span> <span>validate_request</span>
<span>class</span> <span>CornerstoneHooksImpl</span><span>(</span><span>CornerstoneHooks</span><span>):</span>
<span>def</span> <span>__init__</span><span>(</span><span>self</span><span>):</span>
<span>super</span><span>(</span><span>CornerstoneHooksImpl</span><span>,</span> <span>self</span><span>).</span><span>__init__</span><span>()</span>
<span>def</span> <span>pre_endpoint_setup</span><span>(</span><span>self</span><span>):</span>
<span>print</span><span>(</span><span>"call pre setup from CornerstoneHooksImpl!!!"</span><span>)</span>
<span>print</span><span>(</span><span>"---- get fastapi app ------"</span><span>)</span>
<span>print</span><span>(</span><span>self</span><span>.</span><span>app</span><span>)</span>
<span>def</span> <span>post_endpoint_setup</span><span>(</span><span>self</span><span>):</span>
<span>print</span><span>(</span><span>"call post setup from CornerstoneHooksImpl!!!"</span><span>)</span>
<span>def</span> <span>pre_endpoint_teardown</span><span>(</span><span>self</span><span>):</span>
<span>print</span><span>(</span><span>"call pre teardown from CornerstoneHooksImpl!!!"</span><span>)</span>
<span>def</span> <span>post_endpoint_teardown</span><span>(</span><span>self</span><span>):</span>
<span>print</span><span>(</span><span>"call pre teardown from CornerstoneHooksImpl!!!"</span><span>)</span>
<span>def</span> <span>pre_endpoint_call</span><span>(</span><span>self</span><span>):</span>
<span>pass</span>
<span>def</span> <span>post_endpoint_call</span><span>(</span><span>self</span><span>):</span>
<span>pass</span>
<span>class</span> <span>CornerstoneAsyncHooksImpl</span><span>(</span><span>CornerstoneAsyncHooks</span><span>):</span>
<span>def</span> <span>__init__</span><span>(</span><span>self</span><span>):</span>
<span>super</span><span>(</span><span>CornerstoneAsyncHooksImpl</span><span>,</span> <span>self</span><span>).</span><span>__init__</span><span>()</span>
<span>async</span> <span>def</span> <span>pre_endpoint_setup</span><span>(</span><span>self</span><span>):</span>
<span>print</span><span>(</span><span>"call pre setup from CornerstoneAsyncHooksImpl!!!"</span><span>)</span>
<span>async</span> <span>def</span> <span>post_endpoint_setup</span><span>(</span><span>self</span><span>):</span>
<span>print</span><span>(</span><span>"call post setup from CornerstoneAsyncHooksImpl!!!"</span><span>)</span>
<span>async</span> <span>def</span> <span>pre_endpoint_teardown</span><span>(</span><span>self</span><span>):</span>
<span>print</span><span>(</span><span>"call pre teardown from CornerstoneAsyncHooksImpl!!!"</span><span>)</span>
<span>async</span> <span>def</span> <span>post_endpoint_teardown</span><span>(</span><span>self</span><span>):</span>
<span>print</span><span>(</span><span>"call pre teardown from CornerstoneAsyncHooksImpl!!!"</span><span>)</span>
<span>async</span> <span>def</span> <span>pre_endpoint_call</span><span>(</span><span>self</span><span>):</span>
<span>pass</span>
<span>async</span> <span>def</span> <span>post_endpoint_call</span><span>(</span><span>self</span><span>):</span>
<span>pass</span>
<span>from</span> <span>fastapi</span> <span>import</span> <span>FastAPI</span>
<span>from</span> <span>fastapi_hive.ioc_framework.cornerstone_hooks</span> <span>import</span> <span>CornerstoneHooks</span><span>,</span> <span>CornerstoneAsyncHooks</span>
<span>from</span> <span>example.cornerstone.auth.implement</span> <span>import</span> <span>validate_request</span>


<span>class</span> <span>CornerstoneHooksImpl</span><span>(</span><span>CornerstoneHooks</span><span>):</span>

    <span>def</span> <span>__init__</span><span>(</span><span>self</span><span>):</span>
        <span>super</span><span>(</span><span>CornerstoneHooksImpl</span><span>,</span> <span>self</span><span>).</span><span>__init__</span><span>()</span>

    <span>def</span> <span>pre_endpoint_setup</span><span>(</span><span>self</span><span>):</span>
        <span>print</span><span>(</span><span>"call pre setup from CornerstoneHooksImpl!!!"</span><span>)</span>
        <span>print</span><span>(</span><span>"---- get fastapi app ------"</span><span>)</span>
        <span>print</span><span>(</span><span>self</span><span>.</span><span>app</span><span>)</span>

    <span>def</span> <span>post_endpoint_setup</span><span>(</span><span>self</span><span>):</span>
        <span>print</span><span>(</span><span>"call post setup from CornerstoneHooksImpl!!!"</span><span>)</span>

    <span>def</span> <span>pre_endpoint_teardown</span><span>(</span><span>self</span><span>):</span>
        <span>print</span><span>(</span><span>"call pre teardown from CornerstoneHooksImpl!!!"</span><span>)</span>

    <span>def</span> <span>post_endpoint_teardown</span><span>(</span><span>self</span><span>):</span>
        <span>print</span><span>(</span><span>"call pre teardown from CornerstoneHooksImpl!!!"</span><span>)</span>

    <span>def</span> <span>pre_endpoint_call</span><span>(</span><span>self</span><span>):</span>
        <span>pass</span>

    <span>def</span> <span>post_endpoint_call</span><span>(</span><span>self</span><span>):</span>
        <span>pass</span>


<span>class</span> <span>CornerstoneAsyncHooksImpl</span><span>(</span><span>CornerstoneAsyncHooks</span><span>):</span>

    <span>def</span> <span>__init__</span><span>(</span><span>self</span><span>):</span>
        <span>super</span><span>(</span><span>CornerstoneAsyncHooksImpl</span><span>,</span> <span>self</span><span>).</span><span>__init__</span><span>()</span>

    <span>async</span> <span>def</span> <span>pre_endpoint_setup</span><span>(</span><span>self</span><span>):</span>
        <span>print</span><span>(</span><span>"call pre setup from CornerstoneAsyncHooksImpl!!!"</span><span>)</span>

    <span>async</span> <span>def</span> <span>post_endpoint_setup</span><span>(</span><span>self</span><span>):</span>
        <span>print</span><span>(</span><span>"call post setup from CornerstoneAsyncHooksImpl!!!"</span><span>)</span>

    <span>async</span> <span>def</span> <span>pre_endpoint_teardown</span><span>(</span><span>self</span><span>):</span>
        <span>print</span><span>(</span><span>"call pre teardown from CornerstoneAsyncHooksImpl!!!"</span><span>)</span>

    <span>async</span> <span>def</span> <span>post_endpoint_teardown</span><span>(</span><span>self</span><span>):</span>
        <span>print</span><span>(</span><span>"call pre teardown from CornerstoneAsyncHooksImpl!!!"</span><span>)</span>

    <span>async</span> <span>def</span> <span>pre_endpoint_call</span><span>(</span><span>self</span><span>):</span>
        <span>pass</span>

    <span>async</span> <span>def</span> <span>post_endpoint_call</span><span>(</span><span>self</span><span>):</span>
        <span>pass</span>
from fastapi import FastAPI from fastapi_hive.ioc_framework.cornerstone_hooks import CornerstoneHooks, CornerstoneAsyncHooks from example.cornerstone.auth.implement import validate_request class CornerstoneHooksImpl(CornerstoneHooks): def __init__(self): super(CornerstoneHooksImpl, self).__init__() def pre_endpoint_setup(self): print("call pre setup from CornerstoneHooksImpl!!!") print("---- get fastapi app ------") print(self.app) def post_endpoint_setup(self): print("call post setup from CornerstoneHooksImpl!!!") def pre_endpoint_teardown(self): print("call pre teardown from CornerstoneHooksImpl!!!") def post_endpoint_teardown(self): print("call pre teardown from CornerstoneHooksImpl!!!") def pre_endpoint_call(self): pass def post_endpoint_call(self): pass class CornerstoneAsyncHooksImpl(CornerstoneAsyncHooks): def __init__(self): super(CornerstoneAsyncHooksImpl, self).__init__() async def pre_endpoint_setup(self): print("call pre setup from CornerstoneAsyncHooksImpl!!!") async def post_endpoint_setup(self): print("call post setup from CornerstoneAsyncHooksImpl!!!") async def pre_endpoint_teardown(self): print("call pre teardown from CornerstoneAsyncHooksImpl!!!") async def post_endpoint_teardown(self): print("call pre teardown from CornerstoneAsyncHooksImpl!!!") async def pre_endpoint_call(self): pass async def post_endpoint_call(self): pass

Enter fullscreen mode Exit fullscreen mode

For endpoint

<span>from</span> <span>fastapi</span> <span>import</span> <span>FastAPI</span>
<span>from</span> <span>fastapi_hive.ioc_framework.endpoint_hooks</span> <span>import</span> <span>EndpointHooks</span><span>,</span> <span>EndpointAsyncHooks</span>
<span>class</span> <span>EndpointHooksImpl</span><span>(</span><span>EndpointHooks</span><span>):</span>
<span>def</span> <span>__init__</span><span>(</span><span>self</span><span>):</span>
<span>super</span><span>(</span><span>EndpointHooksImpl</span><span>,</span> <span>self</span><span>).</span><span>__init__</span><span>()</span>
<span>def</span> <span>setup</span><span>(</span><span>self</span><span>):</span>
<span>print</span><span>(</span><span>"call pre setup from EndpointHooksImpl!!!"</span><span>)</span>
<span>print</span><span>(</span><span>"---- get fastapi app ------"</span><span>)</span>
<span>print</span><span>(</span><span>self</span><span>.</span><span>app</span><span>)</span>
<span>def</span> <span>teardown</span><span>(</span><span>self</span><span>):</span>
<span>print</span><span>(</span><span>"call pre teardown from EndpointHooksImpl!!!"</span><span>)</span>
<span>class</span> <span>EndpointAsyncHooksImpl</span><span>(</span><span>EndpointAsyncHooks</span><span>):</span>
<span>def</span> <span>__init__</span><span>(</span><span>self</span><span>):</span>
<span>super</span><span>(</span><span>EndpointAsyncHooksImpl</span><span>,</span> <span>self</span><span>).</span><span>__init__</span><span>()</span>
<span>async</span> <span>def</span> <span>setup</span><span>(</span><span>self</span><span>):</span>
<span>print</span><span>(</span><span>"call pre setup from EndpointAsyncHooksImpl!!!"</span><span>)</span>
<span>async</span> <span>def</span> <span>teardown</span><span>(</span><span>self</span><span>):</span>
<span>print</span><span>(</span><span>"call pre teardown from EndpointAsyncHooksImpl!!!"</span><span>)</span>
<span>from</span> <span>fastapi</span> <span>import</span> <span>FastAPI</span>
<span>from</span> <span>fastapi_hive.ioc_framework.endpoint_hooks</span> <span>import</span> <span>EndpointHooks</span><span>,</span> <span>EndpointAsyncHooks</span>


<span>class</span> <span>EndpointHooksImpl</span><span>(</span><span>EndpointHooks</span><span>):</span>

    <span>def</span> <span>__init__</span><span>(</span><span>self</span><span>):</span>
        <span>super</span><span>(</span><span>EndpointHooksImpl</span><span>,</span> <span>self</span><span>).</span><span>__init__</span><span>()</span>

    <span>def</span> <span>setup</span><span>(</span><span>self</span><span>):</span>
        <span>print</span><span>(</span><span>"call pre setup from EndpointHooksImpl!!!"</span><span>)</span>
        <span>print</span><span>(</span><span>"---- get fastapi app ------"</span><span>)</span>
        <span>print</span><span>(</span><span>self</span><span>.</span><span>app</span><span>)</span>

    <span>def</span> <span>teardown</span><span>(</span><span>self</span><span>):</span>
        <span>print</span><span>(</span><span>"call pre teardown from EndpointHooksImpl!!!"</span><span>)</span>


<span>class</span> <span>EndpointAsyncHooksImpl</span><span>(</span><span>EndpointAsyncHooks</span><span>):</span>

    <span>def</span> <span>__init__</span><span>(</span><span>self</span><span>):</span>
        <span>super</span><span>(</span><span>EndpointAsyncHooksImpl</span><span>,</span> <span>self</span><span>).</span><span>__init__</span><span>()</span>

    <span>async</span> <span>def</span> <span>setup</span><span>(</span><span>self</span><span>):</span>
        <span>print</span><span>(</span><span>"call pre setup from EndpointAsyncHooksImpl!!!"</span><span>)</span>

    <span>async</span> <span>def</span> <span>teardown</span><span>(</span><span>self</span><span>):</span>
        <span>print</span><span>(</span><span>"call pre teardown from EndpointAsyncHooksImpl!!!"</span><span>)</span>
from fastapi import FastAPI from fastapi_hive.ioc_framework.endpoint_hooks import EndpointHooks, EndpointAsyncHooks class EndpointHooksImpl(EndpointHooks): def __init__(self): super(EndpointHooksImpl, self).__init__() def setup(self): print("call pre setup from EndpointHooksImpl!!!") print("---- get fastapi app ------") print(self.app) def teardown(self): print("call pre teardown from EndpointHooksImpl!!!") class EndpointAsyncHooksImpl(EndpointAsyncHooks): def __init__(self): super(EndpointAsyncHooksImpl, self).__init__() async def setup(self): print("call pre setup from EndpointAsyncHooksImpl!!!") async def teardown(self): print("call pre teardown from EndpointAsyncHooksImpl!!!")

Enter fullscreen mode Exit fullscreen mode

For the hooks running flow, please reference the belowing diagram: Note: it only depict the startup flow, it is same as shutdown flow.

Setup hive framework init codes

Second, setup the initial code snippet of ioc_framework in main.py

<span>from</span> <span>fastapi</span> <span>import</span> <span>FastAPI</span>
<span>from</span> <span>loguru</span> <span>import</span> <span>logger</span>
<span>from</span> <span>example.cornerstone.config</span> <span>import</span> <span>(</span><span>APP_NAME</span><span>,</span> <span>APP_VERSION</span><span>,</span> <span>API_PREFIX</span><span>,</span>
<span>IS_DEBUG</span><span>)</span>
<span>from</span> <span>fastapi_hive.ioc_framework</span> <span>import</span> <span>IoCFramework</span>
<span>def</span> <span>get_app</span><span>()</span> <span>-></span> <span>FastAPI</span><span>:</span>
<span>logger</span><span>.</span><span>info</span><span>(</span><span>"app is starting."</span><span>)</span>
<span>fast_app</span> <span>=</span> <span>FastAPI</span><span>(</span><span>title</span><span>=</span><span>APP_NAME</span><span>,</span> <span>version</span><span>=</span><span>APP_VERSION</span><span>,</span> <span>debug</span><span>=</span><span>IS_DEBUG</span><span>)</span>
<span>def</span> <span>hive_pre_setup</span><span>():</span>
<span>logger</span><span>.</span><span>info</span><span>(</span><span>"------ call pre setup -------"</span><span>)</span>
<span>def</span> <span>hive_post_setup</span><span>():</span>
<span>logger</span><span>.</span><span>info</span><span>(</span><span>"------ call post setup -------"</span><span>)</span>
<span>async</span> <span>def</span> <span>hive_async_pre_setup</span><span>():</span>
<span>logger</span><span>.</span><span>info</span><span>(</span><span>"------ call async pre setup -------"</span><span>)</span>
<span>async</span> <span>def</span> <span>hive_async_post_setup</span><span>():</span>
<span>logger</span><span>.</span><span>info</span><span>(</span><span>"------ call async post setup -------"</span><span>)</span>
<span>ioc_framework</span> <span>=</span> <span>IoCFramework</span><span>(</span><span>fast_app</span><span>)</span>
<span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>CORNERSTONE_PACKAGE_PATH</span> <span>=</span> <span>"./example/cornerstone/"</span>
<span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>API_PREFIX</span> <span>=</span> <span>API_PREFIX</span>
<span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>ENDPOINT_PACKAGE_PATHS</span> <span>=</span> <span>[</span><span>"./example/endpoints_package1"</span><span>,</span> <span>"./example/endpoints_package2"</span><span>]</span>
<span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>ROUTER_MOUNT_AUTOMATED</span> <span>=</span> <span>True</span>
<span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>HIDE_ENDPOINT_CONTAINER_IN_API</span> <span>=</span> <span>True</span>
<span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>HIDE_ENDPOINT_IN_API</span> <span>=</span> <span>False</span>
<span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>HIDE_ENDPOINT_IN_TAG</span> <span>=</span> <span>True</span>
<span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>PRE_ENDPOINT_SETUP</span> <span>=</span> <span>hive_pre_setup</span>
<span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>POST_ENDPOINT_SETUP</span> <span>=</span> <span>hive_post_setup</span>
<span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>ASYNC_PRE_ENDPOINT_SETUP</span> <span>=</span> <span>hive_async_pre_setup</span>
<span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>ASYNC_POST_ENDPOINT_SETUP</span> <span>=</span> <span>hive_async_post_setup</span>
<span>ioc_framework</span><span>.</span><span>init_modules</span><span>()</span>
<span>@</span><span>fast_app</span><span>.</span><span>get</span><span>(</span><span>"/"</span><span>)</span>
<span>def</span> <span>get_root</span><span>():</span>
<span>return</span> <span>"Go to docs URL to look up API: http://localhost:8000/docs"</span>
<span>return</span> <span>fast_app</span>
<span>app</span> <span>=</span> <span>get_app</span><span>()</span>
<span>from</span> <span>fastapi</span> <span>import</span> <span>FastAPI</span>
<span>from</span> <span>loguru</span> <span>import</span> <span>logger</span>
<span>from</span> <span>example.cornerstone.config</span> <span>import</span> <span>(</span><span>APP_NAME</span><span>,</span> <span>APP_VERSION</span><span>,</span> <span>API_PREFIX</span><span>,</span>
                                        <span>IS_DEBUG</span><span>)</span>

<span>from</span> <span>fastapi_hive.ioc_framework</span> <span>import</span> <span>IoCFramework</span>


<span>def</span> <span>get_app</span><span>()</span> <span>-></span> <span>FastAPI</span><span>:</span>
    <span>logger</span><span>.</span><span>info</span><span>(</span><span>"app is starting."</span><span>)</span>

    <span>fast_app</span> <span>=</span> <span>FastAPI</span><span>(</span><span>title</span><span>=</span><span>APP_NAME</span><span>,</span> <span>version</span><span>=</span><span>APP_VERSION</span><span>,</span> <span>debug</span><span>=</span><span>IS_DEBUG</span><span>)</span>

    <span>def</span> <span>hive_pre_setup</span><span>():</span>
        <span>logger</span><span>.</span><span>info</span><span>(</span><span>"------ call pre setup -------"</span><span>)</span>

    <span>def</span> <span>hive_post_setup</span><span>():</span>
        <span>logger</span><span>.</span><span>info</span><span>(</span><span>"------ call post setup -------"</span><span>)</span>

    <span>async</span> <span>def</span> <span>hive_async_pre_setup</span><span>():</span>
        <span>logger</span><span>.</span><span>info</span><span>(</span><span>"------ call async pre setup -------"</span><span>)</span>

    <span>async</span> <span>def</span> <span>hive_async_post_setup</span><span>():</span>
        <span>logger</span><span>.</span><span>info</span><span>(</span><span>"------ call async post setup -------"</span><span>)</span>

    <span>ioc_framework</span> <span>=</span> <span>IoCFramework</span><span>(</span><span>fast_app</span><span>)</span>
    <span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>CORNERSTONE_PACKAGE_PATH</span> <span>=</span> <span>"./example/cornerstone/"</span>

    <span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>API_PREFIX</span> <span>=</span> <span>API_PREFIX</span>
    <span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>ENDPOINT_PACKAGE_PATHS</span> <span>=</span> <span>[</span><span>"./example/endpoints_package1"</span><span>,</span> <span>"./example/endpoints_package2"</span><span>]</span>
    <span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>ROUTER_MOUNT_AUTOMATED</span> <span>=</span> <span>True</span>
    <span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>HIDE_ENDPOINT_CONTAINER_IN_API</span> <span>=</span> <span>True</span>
    <span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>HIDE_ENDPOINT_IN_API</span> <span>=</span> <span>False</span>
    <span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>HIDE_ENDPOINT_IN_TAG</span> <span>=</span> <span>True</span>
    <span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>PRE_ENDPOINT_SETUP</span> <span>=</span> <span>hive_pre_setup</span>
    <span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>POST_ENDPOINT_SETUP</span> <span>=</span> <span>hive_post_setup</span>
    <span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>ASYNC_PRE_ENDPOINT_SETUP</span> <span>=</span> <span>hive_async_pre_setup</span>
    <span>ioc_framework</span><span>.</span><span>config</span><span>.</span><span>ASYNC_POST_ENDPOINT_SETUP</span> <span>=</span> <span>hive_async_post_setup</span>

    <span>ioc_framework</span><span>.</span><span>init_modules</span><span>()</span>

    <span>@</span><span>fast_app</span><span>.</span><span>get</span><span>(</span><span>"/"</span><span>)</span>
    <span>def</span> <span>get_root</span><span>():</span>
        <span>return</span> <span>"Go to docs URL to look up API: http://localhost:8000/docs"</span>

    <span>return</span> <span>fast_app</span>


<span>app</span> <span>=</span> <span>get_app</span><span>()</span>
from fastapi import FastAPI from loguru import logger from example.cornerstone.config import (APP_NAME, APP_VERSION, API_PREFIX, IS_DEBUG) from fastapi_hive.ioc_framework import IoCFramework def get_app() -> FastAPI: logger.info("app is starting.") fast_app = FastAPI(title=APP_NAME, version=APP_VERSION, debug=IS_DEBUG) def hive_pre_setup(): logger.info("------ call pre setup -------") def hive_post_setup(): logger.info("------ call post setup -------") async def hive_async_pre_setup(): logger.info("------ call async pre setup -------") async def hive_async_post_setup(): logger.info("------ call async post setup -------") ioc_framework = IoCFramework(fast_app) ioc_framework.config.CORNERSTONE_PACKAGE_PATH = "./example/cornerstone/" ioc_framework.config.API_PREFIX = API_PREFIX ioc_framework.config.ENDPOINT_PACKAGE_PATHS = ["./example/endpoints_package1", "./example/endpoints_package2"] ioc_framework.config.ROUTER_MOUNT_AUTOMATED = True ioc_framework.config.HIDE_ENDPOINT_CONTAINER_IN_API = True ioc_framework.config.HIDE_ENDPOINT_IN_API = False ioc_framework.config.HIDE_ENDPOINT_IN_TAG = True ioc_framework.config.PRE_ENDPOINT_SETUP = hive_pre_setup ioc_framework.config.POST_ENDPOINT_SETUP = hive_post_setup ioc_framework.config.ASYNC_PRE_ENDPOINT_SETUP = hive_async_pre_setup ioc_framework.config.ASYNC_POST_ENDPOINT_SETUP = hive_async_post_setup ioc_framework.init_modules() @fast_app.get("/") def get_root(): return "Go to docs URL to look up API: http://localhost:8000/docs" return fast_app app = get_app()

Enter fullscreen mode Exit fullscreen mode

If you want to try, please download the source repo.

Source Code: https://github.com/fanqingsong/fastapi-hive

Then follow the document’s index page to run the example app

Documentation: https://fanqingsong.github.io/fastapi-hive

Use Cases

Under the modulization layout principle, there are some use cases which is useful, including:

  • preload machine learning model before request
  • setup db dependency

https://fanqingsong.github.io/fastapi-hive/usecases/

Reference

For any part of code usage, please refer to doc:

https://fanqingsong.github.io/fastapi-hive/reference/

Design

The fastapi-hive framework confront to DIP Principle.
If you are interesting, please look into it.

https://fanqingsong.github.io/fastapi-hive/design/

原文链接:FastAPI Hive Framework, modulization of code layout

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
To beleve , each day the sun wll not lve up to ther own smle.
要坚信,每一天的阳光都不会辜负自己的笑容
评论 抢沙发

请登录后发表评论

    暂无评论内容