테스트는 x(나중에 다시) 함수 구현만 1. 라이브러리 import #JWTError 삽입 from jose import jwt, JWTError 2. 비동기 함수 구현 async def get_current_user(token: str = Depends(oauth2_bearer)): try: payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) username: str = payload.get("sub") user_id: int = payload.get("id") if username is None or user_id is None: raise HTTPException(status_code=404, detail="User not found")..
JWT를 생성하는 방법에 대해 알아보자 1. Python 라이브러리 설치 pip install "python-jose[cryptography"] 2. 라이브러리 가져오기 #OAuth2PasswordBearer 가져오기 from fastapi.security import OAuth2PasswordRequestForm, OAuth2PasswordBearer from datetime import datetime, timedelta from jose import jwt ※ OAuth2PasswordBearer를 가져오는 이유는 JWT가 실제로 베어 토큰 베어러 유형이기 때문이다. 3. 비밀키 and 알고리즘 설정 SECRET_KEY(비밀키) 생성하기 SECRET_KEY는 위에 설정한 값과 다르게 설정해야 한다...
로그인을 통해 사용자 인증을 시도해 보자 1. 사용자 인증을 위한 라이브러리 import from fastapi.security import OAuth2PasswordRequestForm #차후 에러문을 위한 HTTPException import from fastapi import FastAPI, HTTPException 2. password 일치여부 함수 생성 def verify_password(plain_password, hashed_password): return bcrypt_context.verify(plain_password, hashed_password) ※ verify(디코딩 패스워드, 인코딩 패스워드) 3. 유저 데이터를 쿼리로 가져와서 인증하는 함수 생성 def authenticate_u..
앞서 POST API에서 다뤘던 저장은 데이터베이스 저장이 아니었기에 이번장은 데이터베이스에 데이터를 저장해 보자 1. DB에 연결하기 위한 라이브러리 import from sqlalchemy.orm import Session from database import SessionLocal, engine #Depends 추가 from fastapi import FastAPI, Depends 2. Base를 상속받은 모든 클래스들을 데이터베이스 내에 테이블로 만든다. models.Base.metadata.create_all(bind=engine) 3. DB를 연결할 수 있는 함수 생성 def get_db(): try: db = SessionLocal() yield db finally: db.close() ※ ..
bcrypt 알고리즘을 사용해서 비밀번호를 암호화시켜 저장해 보자 1. bcrypt 설치 => 일반적으로 규정을 준수해야할 상황이 아니라면 구현이 쉽고 비교적 강력하다. 터미널에 pip install "passlib[bcrypt]" 다운 2. 라이브러리 import from passlib.context import CryptContext bcrypt_context = CryptContext(schemes=['bcrypt'], deprecated="auto") 3. 함수 생성 및 POST API 수정 def get_password_hash(password): return bcrypt_context.hash(password) @app.post("/create/user") async def create_new..
users 테이블에 유저 데이터를 저장할 POST API를 생성 1. 인증 관련 데이터를 다루기 위한 파이썬 파일 생성 TodoApp 하위에 파일을 만든다. 2. Users 클래스에 대한 BaseModel(유효성 검사) 생성 및 POST API 생성 ※id는 primary key로 따로 설정 x from fastapi import FastAPI from pydantic import BaseModel from typing import Optional import models class CreateUser(BaseModel): username: str email: Optional[str] first_name: str last_name: str password: str app = FastAPI() @app.p..
Users 테이블을 만들고 Todos 테이블과의 관계를 설정하는 것이 목표(Foreign key) 1. 라이브러리 import from sqlalchemy.orm import relationship from sqlalchemy import ForeignKey 2. Users 클래스 생성 class Users(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) email = Column(String, unique=True, index=True) username = Column(String, unique=True, index=True) first_name = Column(String) last_name = Colu..
데이터의 관계에 대해서 알아보는 것이 목표 1. 관계의 종류 참고 사이트 1) 1:1(하나의 레코드(행 데이터)가 다른 테이블의 레코드 한 개와 연결된 경우) 2) 1:N(하나의 레코드가 서로 다른 여러 개의 레코드와 연결된 경우) - 정리하고 있는 FastAPI에서 주로 다루는 관계 - 대부분의 관계형 데이터베이스의 관계 3) N:N(여러개의 레코드가 다른 테이블의 여러 개의 레코드와 연결된 경우) 2. One To Many Relationship 테이블 관계도 테이블 구성 Users Todos 테이블 쿼리 ※ 1번 user가 할 일을 Todos에서 뽑고 싶을 때 select * from todos where owner=1; ※ 2번 user가 할 일을 Todos에서 뽑고 싶을 때 select * fr..
DELETE을 통해서 DB의 데이터를 삭제해보는 것이 목표 1. 데이터를 업데이트하기 위한 DELETE 함수 생성 #return값이 없을 때 @app.delete("/{todo_id}") async def delete_todo(todo_id: int, db: Session = Depends(get_db)): todo_model = db.query(models.Todos).filter(models.Todos.id == todo_id).first() if todo_model is None: raise http_exception() db.query(models.Todos).filter(models.Todos.id == todo_id).delete() #db.flush() db.commit() successfu..
PUT을 통해서 데이터베이스에 데이터를 업데이트해보는 것이 목표 1. 데이터를 업데이트하기 위한 PUT 함수 생성 @app.put("/{todo_id}") async def update_todo(todo_id: int, todo: Todo, db: Session = Depends(get_db)): todo_model = db.query(models.Todos).filter(models.Todos.id == todo_id).first() if todo_model is None: raise http_exception() todo_model.title = todo.title todo_model.description = todo.description todo_model.priority = todo.priorit..