Flask teardown request equivalent in Fastapi

Question:

I am building a rest api with fastapi. I implemented the data layer separately from the fastapi application meaning I do not have direct access to the database session in my fastapi application.

I have access to the storage object which have method like close_session which allow me to close the current session.

Is there a equivalent of flask teardown_request in fastapi?

Flask Implementation

from models import storage
.....
.....

@app.teardown_request
def close_session(exception=None):
    storage.close_session()

I have looked at fastapi on_event('shutdown') and on_event('startup'). These two only runs when the application is shutting down or starting up.

Asked By: coolboimax

||

Answers:

use fastapi middleware

A "middleware" is a function that works with every request before it is processed by any specific path operation. And also with every response before returning it.

  • It takes each request that comes to your application.
  • It can then do something to that request or run any needed code.
  • Then it passes the request to be processed by the rest of the application (by some path operation).
  • It then takes the response generated by the application (by some path operation).
  • It can do something to that response or run any needed code.
  • Then it returns the response.

Example:

import time

from fastapi import FastAPI, Request

app = FastAPI()


@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    # do things before the request
    response = await call_next(request)
    # do things after the request
    return response
Answered By: anjaneyulubatta505

We can do this by using dependency.

credit to williamjemir: Click here to read the github discussion

from fastapi import FastAPI, Depends                           
from models import storage
                                                                                                                   
async def close_session() -> None:  
  """Close current after every request."""
  print('Closing current session')
  yield                         
  storage.close()  
  print('db session closed.')

app = FastAPI(dependencies=[Depends(close_session)])                        
                                                                                                                                          
@app.get('/')                                                        
def home():                                                          
   return "Hello World"                                             
                                                                    
if __name__ == '__main__':                                           
  import uvicorn  
  uvicorn.run(app)
Answered By: Maxwell D. Dorliea
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.