728x90
1. auth.py의 함수 수정
async def get_current_user(request: Request):
try:
token = request.cookies.get("access_token")
if token is None:
return None
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:
return None
return {"username": username, "id": user_id}
except JWTError:
return get_user_exception()
쿠키에서 access_token의 값을 가져온다.
없으면 None값을 return 있다면 각각의 username과 user_id를 가져온다.
2. todos.py의 API 수정
@router.get("/", response_class=HTMLResponse)
async def read_all_by_user(request: Request, db: Session = Depends(get_db)):
user = await get_current_user(request)
if user is None:
return RedirectResponse(url="/auth", status_code=status.HTTP_302_FOUND)
todos = db.query(models.Todos).filter(models.Todos.owner_id == user.get("id")).all()
return templates.TemplateResponse("home.html", {"request":request, "todos":todos})
로그인이 되어있지 않는 상황이라면 todos의 화면을 보여주지 않고 로그인 페이지로 이동한다.
어플리케이션 확인: 개발자도구(F12) -> Application -> Cookies
3. 로그인해보기
4. 각각의 API별로 로그인 상황 추가하기
#todo 데이터 추가 화면
@router.get("/add-todo", response_class=HTMLResponse)
async def add_new_todo(request: Request):
user = await get_current_user(request)
if user is None:
return RedirectResponse(url="/auth", status_code=status.HTTP_302_FOUND)
return templates.TemplateResponse("add-todo.html", {"request":request})
#todo 데이터 추가
@router.post("/add-todo", response_class=HTMLResponse)
async def create_todo(request: Request, title: str = Form(...), description: str =Form(...),
priority: int = Form(...), db: Session = Depends(get_db)):
user = await get_current_user(request)
if user is None:
return RedirectResponse(url="/auth", status_code=status.HTTP_302_FOUND)
todo_model = models.Todos()
todo_model.title = title
todo_model.description = description
todo_model.priority = priority
todo_model.complete = False
todo_model.owner_id = user.get("id")
db.add(todo_model)
db.flush()
db.commit()
return RedirectResponse(url="/todos", status_code=status.HTTP_302_FOUND)
#todo 데이터 수정 화면
@router.get("/edit-todo/{todo_id}", response_class=HTMLResponse)
async def edit_todo(request: Request, todo_id: int, db: Session = Depends(get_db)):
user = await get_current_user(request)
if user is None:
return RedirectResponse(url="/auth", status_code=status.HTTP_302_FOUND)
todo = db.query(models.Todos).filter(models.Todos.id == todo_id).first()
return templates.TemplateResponse("edit-todo.html", {"request":request, "todo": todo})
#todo 데이터 수정
@router.post("/edit-todo/{todo_id}", response_class=HTMLResponse)
async def edit_todo_commit(request: Request, todo_id: int, title: str = Form(...),
description = Form(...), priority: int = Form(...),
db: Session = Depends(get_db)):
user = await get_current_user(request)
if user is None:
return RedirectResponse(url="/auth", status_code=status.HTTP_302_FOUND)
todo_model = db.query(models.Todos).filter(models.Todos.id == todo_id).first()
todo_model.title = title
todo_model.description = description
todo_model.priority = priority
db.add(todo_model)
db.flush()
db.commit()
return RedirectResponse(url="/todos", status_code=status.HTTP_302_FOUND)
#todo 데이터 삭제
@router.get("/delete/{todo_id}")
async def delete_todo(request: Request, todo_id: int, db: Session = Depends(get_db)):
user = await get_current_user(request)
if user is None:
return RedirectResponse(url="/auth", status_code=status.HTTP_302_FOUND)
todo_model = db.query(models.Todos).filter(models.Todos.id == todo_id)\
.filter(models.Todos.owner_id == user.get("id")).first()
if todo_model is None:
return RedirectResponse(url="/todos", status_code=status.HTTP_302_FOUND)
db.query(models.Todos).filter(models.Todos.id == todo_id).delete()
db.commit()
return RedirectResponse(url="/todos", status_code=status.HTTP_302_FOUND)
#todo 완료 버튼
@router.get("/complete/{todo_id}", response_class=HTMLResponse)
async def complete_todo(request: Request, todo_id: int, db: Session = Depends(get_db)):
user = await get_current_user(request)
if user is None:
return RedirectResponse(url="/auth", status_code=status.HTTP_302_FOUND)
todo = db.query(models.Todos).filter(models.Todos.id == todo_id).first()
todo.complete = not todo.complete
db.add(todo)
db.flush()
db.commit()
return RedirectResponse(url="/todos", status_code=status.HTTP_302_FOUND)
728x90
SMALL
'Develop > FastAPI' 카테고리의 다른 글
FastAPI 프로젝트 진행(회원가입 기능 구현) - 93 (0) | 2023.01.29 |
---|---|
FastAPI 프로젝트 진행(로그아웃 기능 구현) - 92 (0) | 2023.01.29 |
FastAPI 프로젝트 진행(로그인 기능 구현 API) - 90 (0) | 2023.01.29 |
FastAPI 프로젝트 진행(완료 버튼 작동, RedirectResponse) - 89 (0) | 2023.01.29 |
FastAPI 프로젝트 진행(데이터 삭제 API, RedirectResponse) - 88 (0) | 2023.01.29 |