Flask 기초 II

.·2022년 2월 17일

REST API와 테스팅

REST API

REST API란?

  • REST는 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것을 의미한다.
  • 정리하면, 자원(resource)의 표현(representation)에 의한 상태 전달이다.

REST의 구성과 특징

  • /book/1 이러한 URL로 책 정보를 요청할 때 book이 자원이 됨
  • GET/book/1 GET으로 요청
  • 표현은 자원과 행위를 합친 내용이라고 생각해도 무방

REST API 디자인 가이드

  1. URI는 자원을 표현해야 함
    • URL: http://elice.example.com/index.html(실제로 서버에 그 주소가 있는 것, 그 장소에 그 파일이 있음. 해당하는 리소스의 위치를 표현)
      URI: http://elice.example.com/index(실제로는 index 파일이 존재하지 않음.
      파일이 실제로 해당하는 주소에 포함이 되는가/안되는가 차이(index 뒤에 do나 nhn 등의 확장자가 붙어 있는데 해당하는 위치에 파일이 없으면 그 주소는 URI이다.)
  2. 자원에 대한 행위는 HTTP Method로 나타내야 함
    • 자원에 대한 동작을 꼭 표현해야 한다.
      REST API에서 동작을 표현하는 방법은 HTTP Method이다.
    • GET/book/1 : book에 해당하는 1번 데이터를 GET 하겠다.

REST API 디자인 예시

  • URI에 동사를 넣어 표시하기 보다는 Method와 명사를 활용

  • 확장자가 포함되면 해당 위치에 파일이 존재하는게 되기 때문에 확장자를 포함하지 않음

HTTP 응답 상태 코드


flask-restful

flask-restful

  • Flask는 return 값을 jsonify로 주어서 RESTful API를 만들 수 있다.
    하지만, 좀 더 RESTful에 맞게 서버를 만들 수 있는 라이브러리가 있다.
    flask-restful을 활용해서 REST API 서버를 만들어 보자

코드 비교


Ajax란 - 동기/비동기

동기/비동기

  • 동기 : 앞의 작업이 끝나지 않는다면 다음 작업을 할 수 없다.
  • 비동기 : 앞의 작업 상태와 상관없이 다음 작업을 수행할 수 있다.

Ajax의 형태

  • 어디로 어떻게 무엇을 전송할 것인가

Ajax 호출 예시

  • res에는 데이터가 어떻게 돌아왔는지, 담겨 있는 데이터들과 성공한 status 값들이 돌아오게됨

Ajax - Flask

  • html : /ajax test에 GET 방식으로 요청해서 성공한다면 res 객체에 돌아온 어떤 것을 출력
  • flask : dict_data에 데이터가 저장되어 json형태로 돌아감

Flask Test

테스트

  • 테스트 코드는 내가 작성한 기능들이 의도대로 잘 수행하는지 기능 확인을 위한 테스트를 위해 작성한다.

테스트 장점

  • 테스트 환경 세팅 자동화
  • 통합 테스트 시간을 줄임
  • 외부와 의존성 있는로직을 테스트하기 편리
  • 전체 테스트 자동화

GET 테스팅

  • GET 방식으로 데이터를 받으니까 /mysum?a=~~ & b = ~~ 이렇게 데이터가 온다는 것을 알 수 있다.
  • 테스트 코드는 함수 이름 앞에 test를 붙여줘야함
  • app.test_client().get() => 여기서 app은 flask app, .get은 GET방식으로 데이터를 받겠다는 뜻
  • data는 return jsonify(~~)의 값들을 받아오는 것
  • assert response.status_code == 200 : 상태값이 200이면 테스트 패스
  • assert data['result'] == 200 : 우리가 원하는 값은 200인데 200이 아니므로 이번 테스트는 통과 X

POST 테스팅

  • get_josn()은 form 데이터로 들어온 것을 json 형태로 묶어줌
  • data는 딕셔너리
  • request.get_json()에 json.dumps를 통해 ({'a':10, 'b':2})데이터가 묶여서 들어감
  • json.loads(response.get_data(as_text=True) : 우리가 jsonify 안에 있는 데이터를 읽을 수 있는 형태로 가져오겠다는 의미


Flask 프로젝트 1- 익명게시판 만들기

프로젝트 구상하기

API 생성하기


데이터베이스 구성하기

글 (POST) 모델 만들기

  • SQLAlchemy : db를 model로 만들어주기 위한 필수 요소
  • id 값은 직접 넣어주지 않아도 autoincrement=True에 의해 하나씩 증가함
  • nullable=False : null 값이 들어갈 수 없음

화면 만들기

대충 html, css, javascript, bootstrap으로 만듦


기능 만들기 1 - 글 쓰기

글 쓰기

  • $("#content").val() : 해당하는 공간에 있는 값을 가져옴
  • Math.random().toString(20).substr(2,10) : 10자리의 랜덤한 id 생성
  • 가져온 데이터(url(flask 서버에서 작성한 url), type(POST), data(글쓰기, 작성자))들을 토대로 Ajax 사용

데이터베이스 저장하기 예제

  • Author도 있었다면
  • Author = request.form['Author']
    post = Post(Author, content)
    db.session.add(post)
    db.session.commit()

기능 만들기 2 - 글 읽기

글 읽기

데이터베이스 읽어 오기 예제


기능 만들기 3 - 좋아요 누르기

좋아요 누르기

  • 게시글 id는 게시글을 특정할 수 있음

데이터베이스 업데이트 예제



Flask 프로젝트 2 - 자유게시판 만들기

데이터베이스 구성하기

글 (POST) 모델 만들기


사용자 (User) 모델 만들기


화면 만들기

화면 작성하기

  • Jinja Templates 문법을 활용해 페이지들을 만들 것
  • HTML을 확장하는 문법을 다뤄볼 것

jinja Template 확장 기능 사용하기 - block 문법

  • block문법을 사용하면 template을 확장할 수 있음
  • test.html에 작성한 내용들이 base.html에 그대로 적용됨

기능 만들기 1 - 로그인, 로그아웃, 회원가입

기능 만들기 1 - 회원가입

기능 만들기 1 - 로그인

기능 만들기 1 - 로그아웃


사용자 저장 예제(회원가입)

로그인 예제

로그아웃 예제



이미지 출처 - Elice

0개의 댓글