반응형

이번에는 request 할 때, 서버로 데이터를 전송하는 것에 대해서 알아보겠습니다.

 

먼저 데이터를 전송하는 방법에 대해서 정리해 보겠습니다.

클라이언트에서 서버로 http를 이용해서 데이터를 전송하는 방법은 크게 3가지가 있습니다.

1. Query string

2. URI parameter

3. request body

 

Query string 은 request 뒤에 [key]=[value] 형식으로 값을 붙여서 전달하는 방식입니다.

ex) 

curl "http://localhost:5000?key=value"

 

두 개 이상 값을 전송할 때는 key, value 셋 사이에 &를 사용합니다.

curl "http://localhost:5000?key1=value1&key2=value2"

 

URI parameter는 URL에 값을 넣어서 호출하는 방식으로, 서버쪽에서 URL을 parsing 해서 사용합니다.

ex)

category 에 food 라는 값을 전송

curl http://localhost:5000/category/food

category1 에는 food, category2 에는 fruit 전송

curl http://localhost:5000/category1/food/category2/fruit

 

request body 의 경우는 POST method를 이용해서 데이터를 추가로 전송합니다.

ex)

form 전송

curl -X POST http://localhost:5000 -d 'key1=value1&key2=value2'

 

json 데이터 전송 (header 정보가 필요합니다.)

curl -X POST http://localhost:5000 -H "Content-Type: application/json" -d '{"key1":"value1", "key2":"value2"}'

 

각각에 대해서 flask 서버에서 처리하는 방법은 다음과 같습니다.

 

먼저 Query string 을 처리하는 방법입니다. 

request.args.get(<key>) 를 이용해서 값을 받아 올 수 있습니다.

@app.route("/query")
def query_test():
    return ("<br>".join( map(lambda key: '{}={}'.format(key, request.args.get(key)), request.args) ))

 

테스트를 위해서는 아래와 같이 path 를 query로 지정합니다. 

curl "http://localhost:5000/query?key=value"

 

URI parameter 를 처리하는 방법입니다.

route annotation path에 parameter들을 <> 를 이용해서 세팅합니다. 

method에 해당 parameter를 인자로 받아서 처리합니다.

@app.route("/category1/<category1>/category2/<category2>")
def uri_test(category1, category2):
    return "<p>Category1: {} <br>Category2: {}</p>".format(category1, category2)

 

아래 처럼 호출을 하면,

curl http://localhost:5000/category1/food/category2/fruit

 category1 은 food, category2 는 fruit 이 들어오는 것을 확인할 수 있습니다.

 

request body로 오는 정보는 request.form, request.json 혹은 request.data 으로 처리할 수 있습니다.

form은 데이터가 query string 과 같이 <key>=<value> 형식으로 오는 경우 처리가 가능합니다.

json은 header에 Content-Type 을 application/json 으로 지정해주고, body가 json 포맷으로 되어 있는 경우 처리가 가능합니다.

마지막으로 data는 클라이언트에서 보내주는 binary 데이터를 그대로 받아올 수 있습니다.

 

먼저 method 를 POST 로 지정해 줍니다. 

form의 경우는 method를 지정해 주고, 위의 query에서 사용한 request.args 를 request.form 으로 변경해 주기만 하면 됩니다.

참고로 query 혹은 form 에 대해서 방식에 관계없이 처리하는 경우에는 request.value 를 이용할 수 있습니다. query 와 form 모두 같은 키로 데이터를 보낸 경우 query가 우선합니다.

@app.route("/form", methods=['POST'])
def form():
    return ("<br>".join( map(lambda key: '{}={}'.format(key, request.form.get(key)), request.form) ))

 

json의 경우 request.json 을 이용하면 됩니다.

import json

...

@app.route("/json", methods=['POST'])
def json_test():
    return json.dumps(request.json)

 

테스트 할 때는 header를 지정해야 합니다.

curl -X POST http://localhost:5000 -H "Content-Type: application/json" -d '{"key1":"value1", "key2":"value2"}'

 

 

반응형
반응형

이번에는 request 에 대해서 알아보겠습니다.

 

먼저 HTTP 요청 방식은 GET, POST, PUT, PATCH, DELETE 등이 있습니다.

이것은 하나의 convention 으로, 클라이언트에서 요청할 때 method 를 지정하며, 서버쪽에서는 method 에 맞게 response 를 구현해 주면 됩니다.

 

curl 을 이용해서 테스트를 해 보겠습니다. 

 

참고로 -X 옵션을 따로 지정하지 않으면 GET method 로 요청을 합니다. 

 

GET 방식으로 요청

> curl -X GET http://localhost:5000

 

GET 요청에 대한 리턴

<p>Hello World</p>

 

 

POST 방식으로 요청

> curl -X POST http://localhost:5000

 

같은 url 을 요청했는데, POST 방식에서는 다음과 같이 리턴이 왔습니다.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1>
<p>The method is not allowed for the requested URL.</p>

 

내용을 살펴보면 해당 method 를 지원하지 않는다고 합니다.

이슈를 해결하기 위해서 이전에 작성한 app.py 코드를 다음과 같이 수정해 봅니다.

from flask import Flask

app = Flask(__name__)

@app.route("/test")
def path_test():
    return '<p>test</p>'

@app.route("/", methods=['GET', 'POST'])
def hello_world():
    return '<p>Hello World</p>'

 

"/" 경로에 method 를 추가해 준 것입니다.

변경 후 재 실행 하면 POST 요청에 대한 리턴도 GET 과 같은 것을 확인 할 수 있습니다.

 

 

이번에는 method 에 따라 다른 결과를 보내주는 코드를 작성해 보겠습니다.

요청을 구분하기 위해서는 request.method 사용합니다. 

 

먼저 request 를 import 해주고, 아래처럼 분기하면 요청 method 에 따라 다른 결과가 리턴 됩니다.

from flask import Flask, request

app = Flask(__name__)

@app.route("/test")
def path_test():
    return '<p>test</p>'

@app.route("/", methods=['GET', 'POST'])
def hello_world():
    if request.method == 'GET':
        return '<p>GET: Hello World</p>'
    elif request.method == 'POST':
        return '<p>POST: Hello World</p>'

 

반응형
반응형

지난번 포스트에서는 기본적인 서비스를 시작해 보았습니다.

이번 포스팅부터는 윈도우 환경에서 실행되며, 포트는 default인 5000번을 사용한다고 가정하고 진행하겠습니다.

 

이번에는 경로를 추가해 보겠습니다.

 

app.py 파일을 열어서 아래와 같이 편집합니다.

from flask import Flask

app = Flask(__name__)

@app.route("/test")
def r_test():
    return '<p>test</p>'
    
@app.route("/")
def hello_world():
    return '<p>Hello World</p>'

 

flask 앱을 다시 실행하고, 웹브라우저에 다음과 같이 입력합니다.

 

http://localhost:5000/test

 

그러면 화면에 test라고 나옵니다.

 

 

flask 앱에 test 라는 경로가 추가되었습니다.

 

따라서 원하는 경로를 추가하려면, @app.route 에 경로를 지정하고, 바로 method 를 구현해 주면됩니다.

여기서 method 이름은 크게 중요하진 않지만, 다른 method 이름과 중복되지 않게 적어 주셔야 합니다.

 

만약 같은 경로를 중복해서 지정하면 어떻게 될까요?

 

아래와 같이, 같은 경로(/test)에 여러 개의 method를 구현하면, 제일 처음에 나오는 r_test()가 실행됩니다.

from flask import Flask

app = Flask(__name__)

@app.route("/test")
def r_test():
    return '<p>test</p>'

@app.route("/test")
def r_test2():
    return '<p>test2</p>'

@app.route("/")
def hello_world():
    return '<p>Hello World</p>'

 

반응형
반응형

Python Flask를 이용해서 REST 서비스를 구현해 보겠습니다.

 

먼저 Python 3.x가 설치되어 있다고 가정하고 진행해 보겠습니다.

 

Python 의 가상환경을 이용할 예정이며, 테스트 환경은 Windows 10 이지만, OS 의 영향이 거의 없을 듯 합니다.

 

Python 의 가상환경은 가상으로 isolated 된 실행 환경을 생성해 주며, 각 환경 별로 다른 모듈을 설치하여 실행할 수 있게 해줍니다.

 

 

프로젝트 실행 위치를 myApp 폴더라고 가정하겠습니다.

 

명령프롬프트를 사용해서 해당 위치로 이동후에 아래 명령어로 가상환경을 생성합니다.

 

> python3 -m venv venv

마지막의 venv는 가상환경이 생성되는 경로이기 때문에 원하시는 폴더로 변경해서 지정할 수 있습니다.

 

 

가상환경을 실행합니다. (윈도우)

> venv\Scripts\activate

맥OS나 리눅스에서는 다음과 같이 실행합니다.

$ source venv/bin/activate

 

참고로 가상환경을 종료할 때는 deactivate 명령어를 입력하면 됩니다.

 

 

실행후에는 명령프롬프트 앞쪽에 가상환경에 대한 정보가 나타납니다.

(venv) >

 

Flask 모듈을 설치합니다.

(venv) > pip3 install flask

 

 

간단한 Flask 앱을 만들어 보겠습니다.

 

먼저 app.py 파일을 생성해서 편집기로 열고 다음과 같이 입력합니다.

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return '<p>Hello World</p>'

 

그리고 가상환경의 명령프롬프트에서 다음과 같이 입력합니다. (윈도우)

> set FLASK_APP=app
> flask run

 

맥OS나 리눅스라면 다음과 같이 입력합니다.

$ export FLASK_APP=app
$ flask run

 

실행시키면 어떤 포트에서 실행 중인지에 대한 정보가 화면에 나타납니다.  참고로 default 는 5000포트인데, 맥에서는 AirPlay Receiver 서비스가 해당 포트를 사용중이기 때문에, 서비스를 중지시키거나 다른 포트를 사용해야 합니다.

 

Monterey 에서 서비스 중지시키는 방법:

System Preferences > Sharing > AirPlay Receiver 체크 해제

 

포트 지정은 -p 옵션을 사용합니다.

$ flask run -p 4999

 

웹 브라우저를 열어 아래 주소를 입력해서 결과를 확인해 봅니다.

 

http://localhost:5000 

 

브라우저에 Hello World 라고 나오면 성공입니다.

 

 

 

 

 

반응형

+ Recent posts