728x90

앞서서 flask 서버에서 라우팅 개념을 이해하면서 자연스레 REST API 개념이 잠깐 등장했다. 

REST API란, 서버와 클라이언트 즉, 백과 프론트 간에 데이터를 주고 받는 통신을 하기위해 쓰이는 API 방식 중 하나이다. 

(이에 대한 개념은 별도로 후에 정리해보겠다.)

 

클라이언트에서 서버로 통신을 보내는 것은 사실, 기존의 rest api-> axios 코드와 큰 차이가 없다. 

(이는 자바스크립트를 통해 클라이언트에서 api 통신 요청 코드 구현을 해보았고, axios 라이브러리를 사용해 보았을 때의 기준이다.

 이에 대해서도 이후 별도로 정리해볼 예정이며, 이번 글은 파이썬의 flask로는, 

클라이언트에서 요청이 왔을 때, 어떻게 rest api를 구현하여 이 통신에 대응할 수 있는지에 중점을 둬서 정리할 예정이다.)

 

client에서 axios를 써서, get 요청 보내는 코드 예시

1
2
3
4
5
6
7
8
9
10
axios("http://localhost:8082/test", {
  method: "get",
  })
   .then((response) => {
    console.log(response);
    })
   .catch((error) => {
     console.log(error);
   });
cs

 

CORS(Cross Origin Resource Sharing)

 CORS 개념이 등장하게 된 이유

 : 웹에서 사용하는 HTTP request는 기본적으로 다른 도메인의 데이터를 요청할 수 있다. 

  ex)  내가 접속한 웹페이지: www.fun-coding.org/index.html

        -> 해당 웹페이지 안에서 태그로 www.kkk.co.kr/google.jpg 파일을 가져와서 이미지로 보여줄 수 있음

 : 하지만! 스크립트 태그(<script></script>)로 둘러싸인 스크립트 코드에서 실행되는

   HTTP request 는 www.fun-coding.org 에만 요청할 수 있음.

   동일한 서버여야만 http 통신이 가능한 것. 정확하게는 프로토콜, 호스트명, 포트가 동일해야 함.

   ( 따라서 보통 클라이언트로 서버코드가 따로 작업되므로 포트 번호가 다른 경우가 일반적이다. 

    같은 서비스 구성인데도 불구하고, 서버에서 클라이언트의 요청을 받아들이지 않는 경우가 발생할 수도 있는 것이다.)

   이를 Same Origin Policy 라고 함

 

 

CORS 에러 해결 : flask_cors 라이브러리 사용

 - flask_cors 라이브러리 설치

    pip install flask_cors

 

 - flask_cors 라이브러리 사용

1
2
3
4
from flask_cors import CORS
 
app = Flask(__name__)
CORS(app) # 이와 같이 선언해주면 전 요청/응답 헤더에 CORS 지원 헤더 정보를 넣어서, CORS 를 지원해줌
cs

 

 

REST API

- 기본적으로 통신이 성공했을 때, 서버에서 코드 보내주기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from flask import Flask, request, make_response, jsonify
 
 
@app.route("/test", methods=['GET'])
def test():
    return make_response(jsonify(success=True), 200)
    # data = {'sucess' = True}
    # jsonify(data)
    # 위와 같은 데이터 전달 방법과 동일하지만 코드 방식만 다를 뿐
    # 즉 통신이 성공적이라는 메시지를 보내는 또 다른 방법이다.
 
 
if __name__ == '__main__':
    app.run(host="0.0.0.0", port="8082")
cs

- 주요 http 헤더 응답 코드

 

 

REST API method

 

각 요청 메서드마다 요청 메서드에 함께 오는 파라미터값을 추출하는 방식이 다름

 -> GET/PUT/DELETE 는 동일, POST 만 다름

API 리턴값은 flask 의 jsonify() 함수를 사용해서, JSON 형식으로 리턴값을 넣어서 보내면 됨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from flask import Flask, request, make_response, jsonify
from flask_cors import CORS
 
app = Flask(__name__)
CORS(app)
 
 
@app.route("/test", methods=['GET''POST''PUT''DELETE'])
def test():
    if request.method == 'POST':
        print('POST')
        data = request.get_json()
        #client에서 post하려고 요청 온 데이터를 해당 방식으로 추출
        #post 방식의 경우에는 데이터뿐 아니라 다양한 값들이 필요한 데이터와 섞여서 오기 때문에 
        #우선 데이터 추출하는 과정이 필요
        print(data)
        # 그러면 데이터가 딕셔너리형태로 추출
        print(data['email'])
        # 그러면 서버에서 데이터 처리에 필요한 데이터 기준으로 키값으로 데이터 "저장"
    if request.method == 'GET':
        print('GET')
        user = request.args.get('email')
        # get 방식의 경우는 post 코드와는 달리 'email'이라는 키값으로 
        # user 데이터를 "추출"
        print(user)
    if request.method == 'PUT':
        print('PUT')
        user = request.args.get('email')
        print(user)
    if request.method == 'DELETE':
        print('DELETE')
        user = request.args.get('email')
        print(user)
 
    return make_response(jsonify({'status'True}), 200)
 
 
if __name__ == '__main__':
    app.run(host="0.0.0.0", port="8082")
cs

->실제로 client에 데이터 전달할 때,

   return ... jsonify(" client에 전달하고자 하는 데이터를 딕셔너리 형태로" ,  상태코드)

728x90

+ Recent posts