[Python] How to call an API endpoint from a different API endpoint in the same FastAPI...

Discussão em 'Python' iniciado por Stack, Dezembro 9, 2024.

  1. Stack

    Stack Membro Participativo

    (I did find the following question on SO, but it didn't help me: Is it possible to have an api call another api, having them both in same application?)

    I am making an app using Fastapi with the following folder structure

    [​IMG]

    main.py is the entry point to the app

    from fastapi import FastAPI
    from fastapi.middleware.cors import CORSMiddleware

    from app.api.v1 import lines, upload
    from app.core.config import settings

    app = FastAPI(
    title=settings.PROJECT_NAME,
    version=0.1,
    openapi_url=f'{settings.API_V1_STR}/openapi.json',
    root_path=settings.ROOT_PATH
    )

    app.add_middleware(
    CORSMiddleware,
    allow_origins=settings.BACKEND_CORS_ORIGINS,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
    )

    app.include_router(upload.router, prefix=settings.API_V1_STR)
    app.include_router(lines.router, prefix=settings.API_V1_STR)


    In the lines.py, I have 2 GET endpoints:

    • /one-random-line --> returns a random line from a .txt file
    • /one-random-line-backwards --> should return the output of the /one-random-line

    Since the output of the second GET endpoint should be the reversed string of the output of the first GET endpoint, I tried doing the following steps mentioned here

    The codes:

    import random

    from fastapi import APIRouter, Request
    from starlette.responses import RedirectResponse

    router = APIRouter(
    prefix="/get-info",
    tags=["Get Information"],
    responses={
    200: {'description': 'Success'},
    400: {'description': 'Bad Request'},
    403: {'description': 'Forbidden'},
    500: {'description': 'Internal Server Error'}
    }
    )


    @router.get('/one-random-line')
    def get_one_random_line(request: Request):
    lines = open('netflix_list.txt').read().splitlines()
    if request.headers.get('accept') in ['application/json', 'application/xml']:
    random_line = random.choice(lines)
    else:
    random_line = 'This is an example'
    return {'line': random_line}


    @router.get('/one-random-line-backwards')
    def get_one_random_line_backwards():
    url = router.url_path_for('get_one_random_line')
    response = RedirectResponse(url=url)
    return {'message': response[::-1]}


    When I do this, I get the following error:

    TypeError: 'RedirectResponse' object is not subscriptable


    When I change the return of the second GET endpoint to return {'message': response}, I get the following output

    [​IMG]

    What is the mistake I am doing?

    Example:

    If the output of /one-random-line endpoint is 'Maverick', then the output of /one-random-line-backwards should be 'kcirevam'

    Continue reading...

Compartilhe esta Página