[Python] Endpoint not being executed in FastAPI

Discussão em 'Python' iniciado por Stack, Abril 18, 2025.

  1. Stack

    Stack Membro Participativo

    I am developing a simple API using FastAPI.

    I have this endpoint which I am testing, that whatever it should return, I always get a 200 code with an empty list. If I try to debug it by printing, returning a 404 or whatever, it keeps returning the same response. It is not the first time it happens using FastAPI.

    The rest of endpoints work normally.

    I am using Motor to connect to MongoDB, if that may cause any problem.

    The problematic endpoint is name_list

    The router file:

    import editdistance

    from datetime import datetime
    from motor import motor_asyncio

    from fastapi import APIRouter, HTTPException, Body, status
    from fastapi.encoders import jsonable_encoder
    from fastapi.responses import JSONResponse

    from app.config import MONGO_URL, DATABASE_NAME
    from app.tools import all_to_lower
    from app.models.department import Department
    from app.logger import logger as log


    router = APIRouter()

    client = motor_asyncio.AsyncIOMotorClient(MONGO_URL)
    db = client[DATABASE_NAME]

    @router.post("/insert", response_description="Insert a new department", response_model=Department)
    async def insert_department(department: Department = Body(...)):
    '''
    Inserts or updates a department
    '''
    department = jsonable_encoder(department)
    department = all_to_lower(department)
    department['created_at'] = datetime.now()

    if department["parent_department"] != "root" and not db.departments.find_one({"name": department["parent_department"]}):
    raise HTTPException(status_code=404, detail="Parent department not found")

    if not department["owners"]:
    raise HTTPException(status_code=400, detail="Owners can't be empty")
    for owner in department["owners"]:
    if not owner.endswith("@crealsa.es"):
    raise HTTPException(status_code=400, detail="Owners must be a valid email ending with @crealsa.es")

    parent_exists = await db.departments.find_one({"name": department["parent_department"]})
    if department["parent_department"] != "root" and not parent_exists:
    raise HTTPException(status_code=404, detail="Parent department not found")


    new_department = await db.departments.find_one_and_update(
    {"name": department["name"]},
    {"$setOnInsert": department},
    upsert=True,
    return_document=True,
    )

    created_department = await db.departments.find_one({"_id": new_department["_id"]})
    created_department["created_at"] = created_department["created_at"].strftime("%Y-%m-%dT%H:%M:%S")
    return JSONResponse(status_code=status.HTTP_201_CREATED, content=created_department)

    @router.get("/all", response_description="Get all departments", response_model=list[Department])
    async def get_all_departments():
    departments = []
    async for department in db.departments.find():
    departments.append(department)
    return departments

    @router.get("/{name}", response_description="Get a single department by its name", response_model=list[Department])
    async def get_department(name: str):
    '''
    Get a single department by its name
    '''
    name = name.lower()
    department = await db.departments.find_one({"name": name})
    if department:
    department["created_at"] = department["created_at"].strftime("%Y-%m-%dT%H:%M:%S")
    return [department]

    departments = []
    async for department in db.departments.find():
    departments.append(department)

    substr = [dept for dept in departments if name[1:-1] in dept["name"]]
    closest = []
    for dept in departments:
    if editdistance.eval(name, dept["name"]) < 5:
    closest.append(dept)
    closest = sorted(closest, key=lambda dept: editdistance.eval(name, dept["name"]))
    closest = [dept for i, dept in enumerate(closest) if i == 0 or dept["_id"] != closest[i-1]["_id"]]
    closest = closest[:10]

    result = substr + closest
    return [dept for i, dept in enumerate(result) if i == 0 or dept["_id"] != result[i-1]["_id"]]


    @router.get("/id/{id}", response_description="Get a single department by its id", response_model=Department)
    async def get_department_by_id(id: str):
    '''
    Get a single department by its id
    '''
    if (department := await db.departments.find_one({"_id": id})) is not None:
    return department

    raise HTTPException(status_code=404, detail=f"Department {id} not found")

    @router.get("/name_list", response_description="Get all departments names", response_model=str)
    async def get_all_departments_names():
    '''
    Returns a list with all departments names
    '''
    log.info("Getting all departments names")
    return HTTPException(status_code=404, detail="No departments found")

    Continue reading...

Compartilhe esta Página