FastAPI) 설정

나 안해·2023년 2월 28일
0

FastAPI

목록 보기
2/4
post-thumbnail

FastAPI?

FastAPI 준비는 여기

  • django에서 h5를 만들고, fastAPI는 그걸 가져와서 실행하는 역할
  • django는 dcoker의 사용이 선택이지만 fastapi는 필수
  • 설치 : pip install fastapi 'uvicorn[standard]'

1. 실행 확인

python -m uvicorn main:app --reload 
또는 
uvicorn main:app --reload

2. 설정

2.1 시작하면서

  • django와 같은 가상환경으로 설정하고 터미널에서 입력

    ? 가상환경을 사용하는 이유는?
    : 프로젝트마다 격리된 환경(즉, 가상 환경)을 생성함으로써 프로젝트별로 패키지를 관리하기 위함

  • model은 db와 연결

  • schema는 react와 연결

2.1.1 fastapi / uvicorn 설치

- pip install fastapi 'uvicorn[standard]'
- pip install uvicorn

2.2 도커 연동

  • docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 실행
  • docker compose up
  • Test connection
    • 사용DB에 우클릭 → Properties 클릭 후 Test connection 실행
    • 실행 결과 Failed일 경우 이미지에 나온 경로에 들어가서 아래 코드 실행해서 권한 주기

      grant all privileges on *.* to 'root'@'%' identified by 'root'; 실행

  • 데이터베이스 생성

2.3 한글 깨짐 설정

한글 깨짐 발생시 아래 코드 입력 후 도커 이미지를 삭제하고 다시 docker compose up 실행

확인 : show variables like 'lower_case_table_names';
확인2 : status

  • 방법1

    Docker compose의 버전이 3.8 이상일 때`

    • [mysqld]안에 아래 코드를 추가하고
        collation-server = utf8mb4_unicode_ci
        character-set-server = utf8mb4
    • .yml에 아래코드 추가
        volumes:
          ./docker/mysql/conf.d:/etc/mysql/conf.d
          ./docker/conf.d/initdb.d:/docker-entrypoint-initdb.d
  • 방법2
    • [mysqld]안에 아래 코드를 추가하고
       collation-server = utf8mb4_unicode_ci
       character-set-server = utf8mb4
    • .yml에 아래코드 추가
       volumes:
         ./docker/mysql/conf.d:/etc/mysql/conf.d
         ./docker/conf.d/initdb.d:/docker-entrypoint-initdb.d
    • Dockerfile에서 아래 코드 추가
       COPY ./conf.d/my.cnf etc/mysql/my.cnf
  • my.cnf에 권한주기
     chmod 644 /etc/my.cnf
     chmod 755 /etc/my.cnf
     chmod 644 /etc/mysql/conf.d/my.cnf
     chmod 755 /etc/mysql/conf.d/my.cnf

status로 다시 확인

경로만 오버라이딩 한 경우 my.cnf 파일은 오버라이딩 안됐다.
오버라이딩 실패

오버라이딩 성공

2.4 토큰 길이 조절

  • docker exec -it db컨테이너 bash 후 토큰이 있는 테이블의 경로로 들어간다
  • alter table 해당테이블명 modify token varchar(256); 입력
  • desc 테이블명;으로 토큰 타입이 varchar(256)로 변한 것을 확인
  • 이후 도커를 재시작해야한다

3. 준비

  • 기본적인 틀은 여기를 참고
  • VO = model
    • DAO는 항상 차있는 상태
  • DAO = repasitories
  • DTO = schemas
    • 리액트와 연결되는 지점
    • DTO는 항상 비어있는 상태여야한다

3.1 내용

  RUN apt update \
        && apt install -y mysql-server-5.7  \ #
        && apt install --no-install-recommends -y tzdata \ #타임존
        && apt clean

3.1.1url

  • main/router

로그인은 세션을 생성

3.1.2 내용 해설

  - (./docker/mysql/initdb.d:)/docker-entrypoint-initdb.d : (경로)에 있는 쿼리를 실행해서 db로 접근

  
  @app.get("/items/languges/{item_id}") #{item_id}는 request에 id를 부여 (단, id가 없는 create, all 등의 경우는 없다)

4. django fastapi 마이그레이션

  • AWS lambda가 필수
  • django에서 fast로 넘어갈 때는 덕 패턴(덕 타이핑) 적용
from fastapi import APIRouter

router = APIRouter()

@router.<get, post >("/경로(prefix)", response_model=None)
async def get_users(db: None):
    return [{"user_email":"test1", "password":"1"}, {"user_email":"test2", "password":"1"}]

인공지능에서는 모델만 클래스로 나머지는 함수로 사용한다

  • 함수형일 경우 메모리를 사용하지 않기 때문에 더 빠르지만 기억하지 못하기 때문에 단순히 넘겨주는 모델 외의 기능은 함수가 적합

5. version

3.10이상 달라지는 점은 참고(내코드는 아직 3.9, 이후 수정 필요)


6. error

RuntimeError: no validator found for <class 'sqlalchemy.sql.schema.Column'>, see arbitrary_types_allowed in Config

ModuleNotFoundError: No module named

상황
pip install로 설치 후 import를 했지만 위의 에러가 발생

원인
requirements.txt 파일이 있는 경우 해당 파일에 install한 패키지를 입력하지 않아서 발생

해결

  • 해결방법1 : requirements.txt에 설치한 패키지 추가
  • 해결방법2 : 아래 코드 추가
class Config:
    arbitrary_types_allowed = True
  • 위 방법이 안되면 howto/docker에 있는 에러 해결 참고

2023-01-09T07:57:16.111411Z 3 [Note] Aborted connection 3 to db: 'mydb' user: 'root' host: '172.20.0.1' (Got an error reading communication packets)

썼는데 안먹어...

해결
fastapi는 async를 써야지...

pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')

해결
my.cnf파일의 mysqld에 다음코드 추가

max_allowed_packet=16M

fastapi.exceptions.FastAPIError: Invalid args for response field! Hint: check that <class ''> is a valid Pydantic field type

원인
에러창에 나온 그대로다

해결
클래스 내부에 아래 클래스 두 개중 하나 입력(경우에 따라 안먹는 경우가 있어서 바꿔주면서 적용)

class Config:
    BaseConfig.arbitrary_types_allowed = True

class Config:
    arbitrary_types_allowed = True

AttributeError: 'InstanceState' object has no attribute '_post_inspect'

원인
이번에는 오타가 난 경우

해결
에러가 난 맨 윗줄로 가서 오타 여부와 받은 값을 확인

sqlalchemy.orm.exc.UnmappedInstanceError: Class 'sqlalchemy.orm.query.Query' is not mapped

원인
내가 겪은 상황은 하나의 레코드를 넘겨줘야하는 쿼리문에서 뒤에 .first() 같은 내용을 빼서 생긴 문제

0개의 댓글