CutTheWire / API_study

FastAPI, MYSQL USE & STUDY
0 stars 0 forks source link

line 99, in read_users 500 Internal Server Error #1

Open CutTheWire opened 6 months ago

CutTheWire commented 6 months ago

INFO: 127.0.0.1:4422 - "GET /users/ HTTP/1.1" 500 Internal Server Error ERROR: Exception in ASGI application user_API.py", line 99, in read_users cursor.close() ^^^^^^

1번째 요청에서는 동작하지만 2번째 이상부터는 비정상으로 동작

CutTheWire commented 6 months ago

초기 코드(b3c128c 커밋 부분의 user_API.py)

db_dk= DB_docking()

@app.get("/users/")
def read_users():
    users = []
    try:
        conn = db_dk.connection
        cursor = conn.cursor(dictionary=True)
        users = db_dk.read_all_user_cursor(cursor)
    except Error as e:
        raise HTTPException(status_code=400, detail=str(e))
    finally:
        cursor.close()
        conn.close()
    return users

수정된 코드

@app.get("/users/{user_id}")
async def read_users(user_id: str):
    users = []
    try:
        db_dk= DB_docking()
        conn = db_dk.connection
        cursor = conn.cursor(dictionary=True)
        users = db_dk.read_user_cursor(cursor, user_id)
    except Error as e:
        raise HTTPException(status_code=400, detail=str(e))
    finally:
        if cursor:
            cursor.close()
        if conn:
            conn.close()
    return users
CutTheWire commented 6 months ago

변경 사항 요약

user_API.py 파일의 read_users 함수에 대한 주요 변경 사항을 요약합니다.

수정 전

코드 예시:

db_dk= DB_docking()

@app.get("/users/")
def read_users():
    # 사용자 정보를 읽어오는 로직

수정 후

코드 예시:

@app.get("/users/{user_id}")
async def read_users(user_id: str):
    # 특정 사용자 정보를 읽어오는 로직

주요 변경 사항 상세 설명

  1. 인스턴스 생성 위치 변경: DB_docking() 인스턴스를 각 요청 처리 함수 내부에서 생성하게 함으로써, 데이터베이스 연결 관리의 유연성을 높였습니다. 이는 함수 호출마다 새로운 연결이 이루어지므로, 연결의 독립성을 보장합니다.

  2. 기능 변경: 기존에는 모든 사용자 정보를 반환하는 기능이었으나, 수정 후에는 URL 경로에서 전달받은 user_id에 해당하는 특정 사용자의 정보만을 반환하도록 변경되었습니다. 이는 API의 유연성을 높이고, 필요한 정보만을 효율적으로 조회할 수 있게 합니다.

  3. 비동기 처리 도입: async 키워드의 도입으로 함수가 비동기 처리를 지원하게 되었습니다. 이는 I/O 바운드 작업(예: 데이터베이스 조회)의 처리 효율성을 높이며, 서버의 응답성을 개선합니다.


수정된 커밋