반응형

이번에는 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>'

 

반응형

+ Recent posts