⚡️ API 개발 with Flask - 2

codeamor·2020년 7월 4일
0

API Development

목록 보기
2/9

✔️ 미니터(mini tweeter)의 기능

미니터가 제공하는 핵심 기능들

  • 회원가입
  • 로그인
  • 트윗(tweet)
  • 다른 회원 팔로우(follow)하기
  • 다른 회원 언팔로우(unfollow)하기
  • 타임라인(해당 사용자, 사용자가 팔로우하는 사용자들의 트윗들)


✔️ 회원가입

  • 사용자에게 이름, 이메일, 비밀번호 등의 기본적인 회원 정보를 HTTP 요청을 통해 받은 후 시스템상에 저장한다.

  • 필요한 정보들

    • id
    • name
    • email
    • password
    • profile

다음은 회원가입 기능을 구현하는 엔드포인트이다.

from flask import Flask, jsonify, request 

app          = Flask(__name__)
app.users    = {}
app.id_count = 1

@app.route("/sign-up", methods=['POST'])
def sign_up(): 
    new_user                = request.json
    new_user["id"]          = app.id_count
    app.users[app.id_count] = new_user
    app.id_count            = app.id_count + 1

    return jsonify(new_user)
  1. from flask import Flask, jsonify, request
    : 필요한 Flask의 모듈들을 임포트한다.
  • request를 통해 사용자가 HTTP 요청을 통해 전송한 JSON 데이터를
    읽어 들일 수 있다.
  • jsonify는 dictionary 객체를 JSON으로 변환하여 HTTP 응답으로
    보낼 수 있게 된다.

  1. app.users = {}
    : 새로 가입한 사용자를 지정할 dictionary를 users라는 변수에 정의한다.
  • key는 사용자 아이디가 되고 value는 dictionary에 저장되어 있는 사용자 정보이다.

  1. app.id_count = 1
    : 회원가입을 하는 사용자의 id 값을 저장하는 변수이다.
  • id는 1부터 시작하며 새로운 사용자가 회원가입 할 때 마다 id값이 하나씩 증가한다.

  1. @app.route("/sign-up", methods=['POST'])
    : "/ping" 엔드포인트와 마찬가지로 route 데코레이터를 사용해서 엔드포인트를 정의한다.
  • 엔드포인트의 고유 주소는 "/sign-up"으로 정의하고, HTTP 메소드는 POST로 한다.

  1. new_user = request.json
    : HTTP 요청을 통해 전송된 회원 정보를 읽어 들인다.
  • request는 엔드포인트에 전송된 HTTP 요청 정보(헤더, body 등)를 저장하고 있다.
  • request.json은 해당 HTTP 요청을 통해 전송된 JSON 데이터를 파이썬 dictionary로 변환해 준다.

  1. new_user["id"] = app.id_count
    : HTTP 요청으로 전송된 회원가입 정보에 id 값을 더하여 준다.

  2. app.users[app.id_count] = new_user
    : 회원가입하는 사용자의 정보를 2번에서 생성한 dictionary에 저장한다.

  3. app.id_count = app.id_count + 1
    : id 값에 1을 더해 준다.
  • 이로써 다음 회원 id 값이 이미 회원을 가입한 사용자들의 id 값과 겹치지 않게 된다.

  1. return jsonify(new_user)
    : 회원가입한 사용자의 정보를 JSON 형태로 전송한다.
  • jsonify를 사용하여 dictionary를 JSON으로 변환한다.
  • status code는 200이 된다.
    원래는 status code도 지정해 주어야 하지만, 만일 지정해 주지 않으면 디폴트 값으로 200이 리턴된다.

📌 3번에서의 id 값을 증가시키는 방식은 문제가 있을 수 있다.
만일 HTTP 요청들이 동시에 전송될 경우 id 값이 잘못 지정될 가능성이 있다.
이러한 문제를 예방하기 위해서 atomic increment operation을 사용해야 한다.
하지만 추후에 데이터베이스에 데이터를 저장할 것이고, id 값은 데이터베이스에서 자동 생성을 해준다.

*atomic increment operation
: 여러 스레드(thread)가 동시에 값을 증가시킬 수 없고, 한 번에 한 스레드만 값을 증가시키는 것


이전 게시글에서 만들었던 app.py 파일에서 "/ping" 엔드포인트 아래에 회원가입 엔드포인트를 다음과 같이 추가한다.

from flask import Flask, jsonify, request 

app          = Flask(__name__)
app.id_count = 1
app.users    = {}

@app.route("/ping", methods=['GET'])
def ping():
    return "pong"

@app.route("/sign-up", methods=['POST']) 
def sign_up(): 
    new_user                = request.json
    new_user["id"]          = app.id_count
    app.users[app.id_count] = new_user
    app.id_count            = app.id_count + 1

    return jsonify(new_user)

터미널을 열고 app.py 가 위치한 디렉토리로 이동하여 아래의 명령을 입력해보자.

  • FLASK_ENV는 Flask가 실행되는 개발 스테이지를 뜻한다.
    • "development" 로 정해 놓으면 debug mode가 실행된다.
    • 앞서 말했던 것처럼 debug mode가 실행되면 코드가 수정될 때마다 Flask가 자동으로 재실행되어 수정된 코드가 반영되도록 해준다.

이제 실제로 회원가입 요청을 보내 보자.
앞서 했던 것처럼 httpie를 사용하여 터미널에서 회원가입 HTTP 요청을 보내 보자.

📌️ httpie를 사용해서 POST로 JSON 데이터를 보내는 것은 아주 간단하다.
HTTP 요청을 보내는 엔드포인트 주소 다음에 field=value의 형태로 보내면 된다.



Reference

0개의 댓글