1 ๋ถ„ ์†Œ์š”

Flask JSON๊ด€๋ จ ๋ชจ๋“ˆ

์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ฝ”๋“œ ๋งจ์œ„์— ์„ ์–ธํ•ด์„œ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜จ๋‹ค.

import json

get_json()

ํ”Œ๋ผ์Šคํฌ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž„.
REST API์—์„œ๋Š” POST๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ json ํ˜•ํƒœ body๋ฅผ ํ†ตํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ.
์ด ๋•Œ, request.get_json()์œผ๋กœ ํŒŒ์ด์ฌ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ.

[์˜ˆ์‹œ]

{
  "user_id": "test01",
  "user_name": "ํ…Œ์ŠคํŠธ01",
}
@user_bp.route('/create', methods=['POST'])
def create():
    print(request.is_json)
    params = request.get_json()
    print(params['user_id'])
    return 'ok'
True
{'user_id': 'test01', 'user_name': 'ํ…Œ์ŠคํŠธ01'}
test01

jsonify()

์‚ฌ์šฉ์ž๊ฐ€ json data๋ฅผ ๋‚ด๋ณด๋‚ด๋„๋ก ์ œ๊ณตํ•˜๋Š” flask์˜ ํ•จ์ˆ˜์ž„.
jsonify()๋Š” json response๋ฅผ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ์ด๋ฏธ content-type header๊ฐ€ โ€˜application/jsonโ€™๋กœ ๋˜์–ด ์žˆ๋Š” flask.Response() ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. jsonify๋Š” json.dump๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„์Šคํ‚ค ์ด์Šค์ผ€์ดํ”„ ์ธ์ฝ”๋”ฉ์„ ์ ์šฉ.
ํ”„๋ก ํŠธ์—”๋“œ์—์„œ๋Š” ๋‹ค์‹œ ์ด ์ฝ”๋“œํฌ์ธํŠธ๋“ค์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ.

์ •๋ฆฌ
content-type : application/json

json.dumps(): Python ๊ฐ์ฒด๋ฅผ json ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜

MIME type header๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” encoded string์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž„.
flask๊ฐ€ ์•Œ์•„์„œ ํŒ๋‹จํ•ด response๋ฅผ ์ž๋™์œผ๋กœ ๋ณด๋‚ด์ฃผ๋„๋ก ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ reponse header fields๋Š” ๋””ํดํŠธ(text/html; charset=utf-8)๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

์ •๋ฆฌ
content-type : text/html; charset=utf-8
jsonify๋ณด๋‹ค ๋” ๋‹ค์–‘ํ•œ type์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ.

MIME Type์ด๋ž€?

MIME Type์€, โ€œMultipurpose Internet Mail Extensionsโ€์˜ ์•ฝ์ž๋กœ, ๊ฐ„๋‹จํžˆ ํŒŒ์ผ ๋ณ€ํ™˜์„ ๋œปํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ MIME Type์€ Type/Subtype์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค.
โ€˜/โ€™๋ฌธ์ž๋กœ ๊ตฌ๋ถ„๋œ ๋‘ ๊ฐœ์˜ ํƒ€์ž…์œผ๋กœ ํŒŒ์ผ์˜ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๊ณ , ํƒ€์ž… ์ด๋ฆ„์—๋Š” ๊ณต๋ฐฑ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ.
ํƒ€์ž…์€ ์นดํ…Œ๊ณ ๋ฆฌ, ์„œ๋ธŒํƒ€์ž…์€ ๊ฐœ๋ณ„ ํ˜น์€ ๋ฉ€ํ‹ฐํŒŒํŠธ ํƒ€์ž…์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

[์˜ˆ์‹œ]

ํƒ€์ž… ์„ค๋ช… ์„œ๋ธŒํƒ€์ž…
text ํ…์ŠคํŠธ๋กœ ํ‘œํ˜„๋˜๋Š” ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์ธ๊ฐ„์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค text/plain, text/html, text/css, text/javascript โ€ฆ
image ํ…์ŠคํŠธ๋กœ ํ‘œํ˜„๋˜๋Š” ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์ธ๊ฐ„์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค image/jpeg, image/png, image/gif โ€ฆ
application ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ„ application/xml, application/json, application/xhtml+xml, application/pdf โ€ฆ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ํŠน์ • ์„œ๋ธŒํƒ€์ž…์ด ์—†์œผ๋ฉด text/plain์œผ๋กœ ์‚ฌ์šฉํ•จ.
  • ํŠน์ • ํƒ€์ž…์ด ์—†๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ application/octet-stream์œผ๋กœ ์‚ฌ์šฉํ•จ.

json.loads(): json ๋ฌธ์ž์—ด์„ Python ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜

json.dumps()๊ฐ€ json -> Python ์ด์—ˆ๋‹ค๋ฉด, json.loads()๋Š” ๋ฐ˜๋Œ€๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.

์–ด๋–ป๊ฒŒ ๋ณ€ํ™˜ํ•ด์ค„๊นŒ?
json ํ˜•์‹์˜ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„๋“ค์ด๊ณ , Python ๋”•์…”๋„ˆ๋ฆฌ ์ž๋ฃŒํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•ด์คŒ!
์ด๋ ‡๊ฒŒ ๋ฌธ์ž์—ด์„ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ์—ญ์ง๋ ฌํ™” ๋ผ๊ณ  ํ•œ๋‹ค.

[์˜ˆ์‹œ]

import json

json_string = '''{
    "id": 1,
    "username": "Bret"
    }
}'''

assert json_object['id'] == 1
assert json_object['username'] == "Bret"


์ผ๋ฐ˜์ ์œผ๋กœ ํŒŒ์ผ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” JSON ๋ฌธ์ž์—ด์„ ์ฝ๊ฑฐ๋‚˜, HTTP ์š”์ฒญ์˜ ์ „๋ฌธ(body)์„ ์ฝ์„ ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

json.loads()
json.dumps()

ํƒœ๊ทธ: ,

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ