IT Diary/# Dev Diary

[ Dev Dairy ] 004. Flask API 만들어보기

셜록호움즈 2021. 7. 20. 00:20
728x90
반응형

 

 

JSP 단에서 GET 방식으로 요청을 보내고 그걸 Python Flask 로 받아서 처리한 값을 다시 JSP로 돌려주는걸 해보고싶었다.

쉽게 말하면 Flask 로 API를 만들어서 만든 API 에 요청을 쏴서 잘 처리되는지 해보고싶었다.

 

우선은 간단하게 JSP 에서 ajax 로 get 방식으로 API 호출하는걸 만들었다.

 

JAVA  - index.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
<script>
    $.ajax({
        method: "GET",
        // url: "https://dapi.kakao.com/v2/search/blog",
        url: "http://127.0.0.1:8080/plus",  // flask 서버로 던진다.
        // data: { review : ["리뷰1","리뷰2","리뷰3"]}
        data: { x: "2" , y : "3" },
        // headers: {Authorization: "KakaoAK 9068483aa30e9a2150dad3527a5295a4"}
    })
        .done(function (msg) {
            alert("Data Saved: " + msg.result )
        });
</script>
cs

 

GET 방식으로 내가 만들 Flask 서버 주소 ( 127.0.0.1:8080/plus ) 로 파라메터를 던진다.

그래서 만약 성공한다면 alert 으로 값을 띄워준다.

 

Python - app.py

 

python 에서는 간단하게 flask_restful 을 통해 RESTful API 구현이 가능하다.

( * http 에서 GET, POST , DELETE 등의 http 함수를 써서 json ,xml 을 통해 정보를 주고받는 api로써 기능을 하는걸 Restful API )

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
from flask_restful import Resource
from flask_restful import reqparse
 
# CORS(Cross Origin Resource Sharing) : 동일 출처(같은 호스트네임)가 아니더라도 정상적으로 사용 가능하도록 도와주는 방법입니다.
# 다른 도메인이나 로컬 환경에서 자바스크립트로 api 등을 호출하는 경우 브라우저에서 동일 출처 위반의 에러가 나타날 수 있습니다
from flask_cors import CORS
 
 
class Plus(Resource):
    def get(self):
        try:
            # 요청받은거를 받아주자
            parser = reqparse.RequestParser()
            # add_argument 를 통해 입력 파라미터를 설정할 수 있다.
            parser.add_argument('x', required=True, type=int, help='x cannot be blank'# add_argument(*args, **kwargs)
            parser.add_argument('y', required=True, type=int, help='y cannot be blank')
            args = parser.parse_args() # Parse all arguments from the provided request and return the results as a Namespace
            result = args['x'+ args['y']
            return {'result': result} # 실제 돌려줄 값을 여기에 넣어준다.
        except Exception as e:
            return {'error'str(e)}
 
from flask import Flask
from flask_restful import Api
 
app = Flask('My First App')
api = Api(app)
CORS(app)
api.add_resource(Plus, '/plus')
 
if __name__ == '__main__':
        app.run(host='127.0.0.1', port=8080, debug=True)
cs

나같은 경우에는 python 개발을 위해 conda( 아나콘다 ) 에 웬만한건 다 설치를 해놨지만

만약 없다면 pip install 을 통해서 없는 module 들을 설치한 다음에 진행하면 된다.

 

소스 자체는 간단하다. 

class의 맴버 변수는 Restful api 의 함수를 의미한다. 

따라서, get 함수 외에도 post, put , delete 등의 함수를 필요에 따라서 정의해서 사용하면 된다.

 

이렇게 정의된 클래스는 add_resource 함수로 경로와 함께 등록한다.

해석하면 127.0.0.1:8080/plus 로 GET 요청을 보내면 Result 키에  args['x'+ args['y']값을 JSON으로 반환해준다.

만약 CORS가 없는 상태에서 실행을 해봤다면  JSP -> Flask 로 값이 잘 넘어가는 걸 확인했는데

Flask -> JSP 로 응답이 오지 않을 수 도 있다.

 

 

원인은 CORS 를 해놓지 않았기 때문이다. 

크롬에서는 다른 도메인이나 로컬 환경에서 자바스크립트로 API 등을 호출하는 경우,  브라우저에서 동일 출처 위반 에러가 나타날 수 있기때문에 CORS 하지 않으면 저렇게 에러가 난다.

 

*CORS(Cross Origin Resource Sharing) : 동일 출처(같은 호스트네임)가 아니더라도 정상적으로 사용 가능하도록 도와주는 방법

CORS

해결법은 간단하다.

 

 import CORS 를 설치하고 

app을 선언한 이후에   CORS(app) 를 추가해주면된다.

 

그렇게 되면 정상적으로 값이 출력되는걸 볼 수 있다.

 

 

728x90
반응형