FastAPI - (10)

  • FastAPI는 가장 빠르게 성장하는 API프레임워크
  • swagger UI
  • Udemy 강의 정리

오류처리 및 맞춤형 응답 등

image-20240320131239024

Error handling(오류 처리)

  • 예외와 발생할 수 있는 문제를 관리하는 방법

image-20240320131225577

  • 기본적으로 코드에서 발생할 수 있는 오류를 클라이언트에 알리는 방법
  • 예외처리를 만들어서 코드의 아무 곳에서나 나머지 코드 실행을 중지한다
  • 예외에는 상태코드와 메시지를 포함한다
  • 에러 상태 목록
![image-20240320131212312](/images/2023-01-20-FastAPI_udemy/image-20240320131212312.png)
    
1. 상태 코드는 "정보"용입니다. 이들은 직접적으로는 잘 사용되지는 않습니다. 이 상태 코드를 갖는 응답들은 본문을 가질 수 없습니다.
2. 상태 코드는 "성공적인" 응답을 위해 사용됩니다. 가장 많이 사용되는 유형
    - 200 은 디폴트 상태 코드로, 모든 것이 "성공적임"을 의미합니다.
    - 다른 예로는 201 "생성됨"이 있습니다. 일반적으로 데이터베이스에 새로운 레코드를 생성한 후 사용합니다.
    - 단, 204 "내용 없음"은 특별한 경우입니다. 이것은 클라이언트에게 반환할 내용이 없는 경우 사용합니다. 따라서 응답은 본문을 가질 수 없습니다.
3. 상태 코드는 "리다이렉션"용입니다. 본문을 가질 수 없는 304 "수정되지 않음"을 제외하고, 이 상태 코드를 갖는 응답에는 본문이 있을 수도, 없을 수도 있습니다.
4. 오류코드, 상태 코드는 "클라이언트 오류" 응답을 위해 사용됩니다. 이것은 아마 가장 많이 사용하게 될 두번째 유형입니다.
    - 일례로 404 는 "찾을 수 없음" 응답을 위해 사용합니다.
    - 일반적인 클라이언트 오류의 경우 400 을 사용할 수 있습니다.
5. 오류 코드, 상태 코드는 서버 오류에 사용됩니다. 이것들을 직접 사용할 일은 거의 없습니다. 응용 프로그램 코드나 서버의 일부에서 문제가 발생하면 자동으로 이들 상태 코드 중 하나를 반환합니다.
  • 오류 메시지 작성법

image-20240320131137216

image-20240320131154463

  • 사용자 지정 예외를 제공
  • 고객 예외는 예외에서 상속되어야 하며 예외를 제공해야 한다

image-20240320131119122

  • 예외처리하기 위해 새로운 py파일 생성

image-20240320131104662

  • JSON응답을 위해 JSONResponse 호출

image-20240320131046317

  • 현존하는 예외로 부터 상속받은 코드
  • 핸들러는 실제로 사용자 정의 핸들러를 사용하며 HTTP예뢰를 처리 할 수 있다

image-20240320131021869

  • fastapi안에도 HTTPException이 있지만 여기선 예외처리에 관한 응답 처리이기 때문에 위에같이 모듈을 불러와야 한다

image-20240320131006187

  • 사용자 정의를 개인화 하는 방법으로 배부를 필터링 하는 것이 좋다
  • 예외를 위해 절대적으로 필요하진 않은 경우에는 사용하지 않는다

image-20240320130922592

  • 주석할 경우에는 Response body에 관련된 에러가 나오게 된다

image-20240320130909100

  • 주석 할 경우 관련된 에러 메시지가 보이지 않는다

image-20240320130850794

Custom responses(맞춤형 응답)

image-20240320130836968

  • 기본적으로 함수에서 간단히 반환할 수 있다
    • 모델, 데이터베이스 모델, 리스트, 자료형 등
    • 응답을 반환할 때 JSON 표준으로 빠르게 시본 설정하려는 상황
  • 다양한 유형의 응답을 매우 명백하게 반환할 수 있다
  • 사용자 지정 응답의 응답을 사용할 때는 데이터를 얻지 못한다
  • 코드
    • product.py파일 생성해서 그곳에 더미 데이터를 생성

    image-20240320130819570

  • 더미데이터를 라우터로 지정하고 Text형식으로 불어올 수 있게 지정한다

    image-20240320130805210

  • main에 라우터 경로 설정하고 실행하면 Text형식의 값이 호출된다.

    image-20240320130748794

  • 왜 이것을 하는 이유는?

    1) 우선 표준 응답에서는 할 수 없는 몇가지 매개변수를 응답에 추가 할 수 있기 때문이다 → (해더, 쿠키, 응답 유형 등을 추가 할 수 있다)

    2) 다양한 유형의 응답을 제공 할 수 있다 → 반드시 JSON형식에만 호출하는 것이 아닌 다름 형식으로 출력이 된다

  • Plain Text : 그래픽 표현이나 그림 등이 아닌, 읽을 수 있는 자료의 문자열 만을 대표하는 데이터이다. 양식 정보가 포함된 리치 텍스트, 바이너리 파일과는 구별된다.
    • XML : 웹 사이트, 데이터베이스 및 타사 애플리케이션과 같은 컴퓨터 시스템 간의 정보 교환을 지원
    • HTML : 프로그래밍 언어는 아니고, 우리가 보는 웹페이지가 어떻게 구조화되어 있는지 브라우저로 하여금 알 수 있도록 하는 마크업 언어
    • Files : 파일을 전송
    • Streaming : 주로 소리 (음악)나 동영상 등의 다중매체 파일을 전송하고 재생하는 방식
  • 복잡한 의사 결정 논리가 있을 수 있으므로 응답은 여러 요인에 따라 달라 질 수 있다 - 표준 JSON 응답에는 단순히 포함 할 수 없다
  • 더 나은 문서가 있다
  • 코드
    • HTML로 불러오는 법

image-20240320130721763

  • product.py파일 생성

    image-20240320130706432

  • HTML를 응답할 수 있는 패키지 설치

    image-20240320130650859

  • 미디어 타입은 text/html로 지정한다

    image-20240320130634319

  • 만약에 id 입력값이 초과하게 된다면 에러 표시를 띄우게 하고 타입은 Text형식으로 지정한다

    image-20240320130615970

  • Text/Html의 옵션을 주어서 응답을 받아보자
    • 코드
    • 두가지 유형의 응답을 제공할 것을 선언한다

    image-20240320130555790

  • 기존의 응답 창 표준식

    image-20240320130539126

  • 응답을 정의해서 내린 형식

    image-20240320130523192

Headers(헤더)

image-20240320130506780

  • Headers : 요청과 함께 전송되고 응답과 함께 수신되는 정보
  • 함수 정의에 특정 사용자 지정 헤더를 추가하는 방법 또는 실제로 기존 헤더를 원하는 경우
  • 요청에 의해 자동으로 쓰거나 덮어쓰는 헤더 중 하나가 아닌지 확인
    • 기본적으로 함수 정의에서 헤더를 정의한다
    • 변수 및 매개변수 이름에는 대시를 사용할 수 없다
  • 밑줄과 대시 가이를 자동으로 변환한다
  • 특별한 경우에 단순히 헤더 목록을 받을 수 있다
    • 리스트로 선언할 수 있다
    • 리스트에서 얻을 수 있는 값이 달라진다
  • 코드

    image-20240320130450048

    • 필요한 모듈와 패키지를 불어온다
    • Header안에 값을 입력하면 products에 저장한 값이 출력된다

    image-20240320130426616

    • 개발자 도구 에서도 확인이 가능하다(F12)

    image-20240320130355689

    • List로 정의해서 헤더 출력

    image-20240320130240156

    • Add string item으로 헤더 값을 출력할 수 있다

    image-20240320130224362

  • 개발자 도구로 확인

    image-20240320130208384

    image-20240320130154565

  • 응답 헤더도 제공
  • 응답을 위해 원하는 만큼 많은 헤더를 첨부 할 수 있다
  • 코드

    image-20240320130134639

    • 출력 방식은 동일하며 개발자 도구에서 확인 가능하다

    image-20240320130118295

Cookies(쿠키)

image-20240320130102099

  • Cookies : 기본적으로 브라우저에 일부 정보를 저장하는 데 사용한다 → 나중에 저장하고 검색해야 하는 것이 무엇이든 쿠키를 사용 할 수 있다

  • 문자열, 리스트, 딕셔너리 및 모델을 수용한다
  • 쿠키를 설정하려면 응답 객체가 필요하고 함수 설정 쿠키가 있다
  • 코드

    image-20240320130047708

    • 개발자 도구에서 Application에서 Cookies

    image-20240320130033572

  • 다른 호출에서 쿠키를 검색, ‘/withheader’ 에 추가 코드 작성해서 쿠키와 너비 헤더 호출을 사용

    image-20240320130014463

  • 쿠키 패키지 불러오기

    image-20240320125958602

    • 커스텀한 헤더와 쿠키를 반환한다
    • 실행하면 에러가 발생한다

    image-20240320125941689

    • 응답 헤더를 설정하지 않았기 때문에 오류가 발생
    • 코드를 수정한다

    image-20240320125924172

  • 사용자 지정 헤더에 조건문을 넣어서 실행하게 한다

    image-20240320125910474

  • 개발자 도구에서 확인

    image-20240320125841587

  • 쿠키를 삭제하고 실행하게 되면은 —> Null값이 나온다

    image-20240320125824930

Form data(양식 데이터)

image-20240320125804265

  • 매우간단하고 직관적인 양식데이터는 단순히 HTML을 참조한다
  • 인코딩은 응용 프로그램
  • 기본적으로 URL인코딩을 형성하므로 HTML형식에 고유한 특수 유형의 인코딩
    • 웹 페이지와 상호 작용
    • 양식이 있는 경우 이 유형으로 인코딩되며 이를 관리 할 수 있어야 한다
    • 함수 정의에서 형식으로 선언
  • 양식 데이터를 사용하려면 python-multipart를 설치
    • pip install python-multipart
  • 코드 image-20240320125738679

  • Form 패키지 불러오기

    image-20240320125722718

    • POST로 생성하고 Form 양식데이터로 받아와서 추가하여 준다
  • Form : HTML forms(<form></form>)은 데이타를 조금 special하게 encoding해서 보낸다. 이는 JSON과 다르다 -> Fast API는 이를 자동으로 변환해주어 적절하게 변수 매칭을 해준다.

image-20240320125707247

  • 양식 유형, 양식 URL 인코딩이 있는 양식 인코딩을 볼 수 있다.

    image-20240320125651462

CORS(Cross Origin Resource Sharing)

image-20240320125636187

  • API에 엑세스 하기 위해 로컬 시스템에서 실제 애플리케이션을 만들려고 시도하는 경우
  • 코스는 기본적으로 크로스 오리진, 리소스 공유를 의미
    • 하나의 로컬 웹 사이트가 로컬 환경에서 실행되는 하나의 웹사이트는 특별히 허용되지 않는 기본적으로 동일한 환경의 동일한 시스템에 있는 리소스에 엑세스 할 수 없다
    • 다른 경로로 기반으로 하는 다른 끝점을 기반으로 동일한 시스템의 리소스에 엑세스한다
  • 미들웨어를 추가하여 사용하면 된다
    • 어떤 오리진이 괜찮은지, 어떤 메서드, 헤더 등을 말할 수 있는 과정 미들웨어를 추가합니다
    • 자격증명도 인증과 관련이 있고 로컬환경에서 인증을 허용하려면 여기에서도 코스 미들웨어를 설정해야 한다
      • 까다로운 두가지 사항이 있다
        • 로컬에서 실행 할 수 있는 애플리케이션과 로컬에서 FastAPI를 설정해야 한다
  • React로 연결해서 미들웨어 실습 진행
    • npx create-react-app test-app 터미널에 입력 react에 관련된 패키지 설치
    • 설치되어 있는 폴더로 이동하여 npm start를 하면 실행이 된다
    • React는 localhost:3000으로 되어 있다

    image-20240320125619467

  • React안에 FastAPI경로 지정하기

    image-20240320125559861

    • App.js에 들어가면 처음에 봤던 화면의 코드가 나온다
    • 코드 요청에서 복사하여 가져오는 기능을 붙인다

    image-20240320125538838

    • 해당 요청의 응답이 수신 될때 호출이 된다

    image-20240320125523611 → 로컬의 환경이 둘다 다르기 때문에 두개의 경로를 연결해줄 미들웨어를 가져와서 추가한다(FastAPI안에서 실행)

  • main.py에서 실행

    image-20240320125508483

  • origins : 지역을 설정을 한다

    → 지금은 리엑트의 주소로 지정

    → 전부라면 [”*”]로 표기한다(단, 인증에 대해서 문제가 발생 할 수 있다)

    • app.add_middleware를 추가하며 CORSMiddleware를 추가한다
    • origins, 자격증명, 메소드, 헤더에 대한 정의와 허용을 지정한다
  • 실행 결과
    • 개발자 도구 → Network → all → Response를 열면 FastAPI에 있던 호출 값을 불러온다

    image-20240320125448624

Reference

개인 Code 기록 github

FastAPI 강의

FastAPI 공식페이지