์ด ๊ธ์ ์ด์ ๋ง ๊ฐ๋ฐ์ ๋ฌธ์ ๋๋๋ฆฌ๊ธฐ ์์ํ [์ฝ๋ฆฐ์ด]๊ฐ ์์ฑํ ๊ธ์
๋๋ค.
๋ณธ์ธ์ ๋จธ๋ฆฟ์์ ๊ฐ์ฅ ๊ธฐ์ต์ด ์ ๋จ๋ ํํ (๋๊ตฐ๊ฐ์๊ฒ ๋ง ํ๋ฏ์ด)๋ก ์์ฑ์ด ๋๋
๊ฐํน ์๋ชป๋ ๋ถ๋ถ์ด๋, ์์ ์ฌํญ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ํผ๋๋ฐฑ ๋ถํ๋๋ฆฌ๊ฒ ์ต๋๋ค.
๋ฐ์ดํฐ์ ํ๋ฆ
์ฐ์ ๋ฐฑ์๋์ธ app.py์ ์ ์ฒด์ฝ๋ ๋ณด๊ณ ๊ฐ๋๋ค.
ํ๋ ์์ํฌ๋ flask ์ฌ์ฉํ์ต๋๋ค.
from flask import Flask, render_template, request, jsonify
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html')
@app.route("/bucket", methods=["POST"])
def bucket_post():
sample_receive = request.form['sample_give']
print(sample_receive)
return jsonify({'msg': 'POST ์ฐ๊ฒฐ ์๋ฃ!'})
@app.route("/bucket", methods=["GET"])
def bucket_get():
return jsonify({'msg': 'GET ์ฐ๊ฒฐ ์๋ฃ!'})
if __name__ == '__main__':
app.run('0.0.0.0', port=5000, debug=True)
์ ์ฝ๋๋ฅผ ๋ณด๋ API๊ฐ 2๊ฐ๋ค์ฉ?? ์ด๋ค๊ฑฐ ์ด๋ค๊ฑฐ??? ์์ ๊ณจ๋ฑ ์ด ๋ถ์๊ฑฐ~
@app.route("/bucket", methods=["POST"])
def bucket_post():
sample_receive = request.form['sample_give']
print(sample_receive)
return jsonify({'msg': 'POST ์ฐ๊ฒฐ ์๋ฃ!'})
์ ์๊ฑฐ ํ๋ ~
@app.route("/bucket", methods=["GET"])
def bucket_get():
return jsonify({'msg': 'GET ์ฐ๊ฒฐ ์๋ฃ!'})
์๊ฑฐ ํ๋ ~ ๊ทธ๋ผ ์ผ๋จ ์ด๋ป๊ฒ ์๊ธด ์ ๋ค์ธ์ง๋ง ํ์ ํ๊ณ ๊ฐ์๋ค.
์ฐ์ ์ฒซ๋ฒ์งธ ์ฝ๋๋ถํฐ
@app.route("/bucket", methods=["POST"])
def bucket_post():
sample_receive = request.form['sample_give']
print(sample_receive)
return jsonify({'msg': 'POST ์ฐ๊ฒฐ ์๋ฃ!'})
๋ฐฉ์์ = POST ์ด๊ณ , /bucketํ๊ณ ๋ค์ด์๋ค๋ค์.
* ์ฐธ๊ณ ๋ก POST = ๋ฐ์ดํฐ๋ฅผ ์์ฑ(Create)ํ๊ฑฐ๋, ์ญ์ (Delete)ํ๊ฑฐ๋, ๋ณ๊ฒฝ(Update)ํ ๋ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ฌ๋๊น ์ผ๋จ ์ด ์์ด๋ /bucket์ ํ๊ณ ์ค๋ฉด์ ๋ญ์ง ๋ชฐ๋ผ๋ ์ฐ์ data๋ ๊ฐ์ง๊ณ ์๊ฒ ๋ค์?? ์ผ๋จ ๋ด ์๋ค.
def bucket_post():
/bucketํ๊ณ ๋ค์ด์ค๋ฉด~ ๋๋ bucket_post() ๋ผ๋ ํจ์๋ฅผ ๋ถ๋ฅผ๊ฑฐ์ผ~ ๊ทธ๊ฒ ๋ญ๋ฐ??
: ๋ฐ์ ์ธ ์ค~
sample_receive = request.form['sample_give']
์ฐ์ ๋๊ฐ ๊ฐ๊ณ ์จ data์ form(ํํ)๊ฐ 'sample_give'๋ผ๋ ์น๊ตฌ๊ฐ ์์ผ๋ฉด ์ฐ๋ฆฐ ๊ทธ๊ฑธ sample_receive๋ผ๋ ๋ณ์๋ก ๋ฐ์๊ฑฐ์ผ.
print(sample_receive)
๊ทธ๋ฆฌ๊ณ sample_receive๋ก ๋ฐ์ data๋ฅผ ์ฐ๋ฆฐ printํ ๊ฑฐ์ผ ~
* ์ฐธ๊ณ ๋ก print()ํ๋ฉด ()๋ด์ฉ์ ๋ณด์ฌ์ค~ ๋ผ๋ ๋ป์ ๋๋ค.
return jsonify({'msg': 'POST ์ฐ๊ฒฐ ์๋ฃ!'})
๊ทธ๋ฆฌ๊ณ data๋ฅผ ๋ด๋ ค์ค๊ฑด๋ฐ data๋ {'msg': 'POST ์ฐ๊ฒฐ ์๋ฃ!'} ์ด๋ ๊ฒ ๋ด๋ ค์ค๊ฑฐ์ผ~
์ฌ๊ธฐ๊น์ง๊ฐ ์ฒซ ๋ฒ์งธ API ํด์
๋ ๋ฒ์งธ API
@app.route("/bucket", methods=["GET"])
def bucket_get():
return jsonify({'msg': 'GET ์ฐ๊ฒฐ ์๋ฃ!'})
๋ฐฉ์์ = GET ๋ฐฉ์์ด๊ณ ~, /bucket ์ด๋ผ๋ ๋ฃจํธ๋ฅผ ํ๊ณ ๋ค์ด์ค๋ฉด~ ์ฐ๋ฆฌ๋ ํจ์ bucket_get() ๋ถ๋ฌ์จ๋ฐ~
๋ด์ฉ์ด ๋ญ์ผ? {'msg': 'GET ์ฐ๊ฒฐ ์๋ฃ!'} ์ด๊ฑฐ๋ฅผ ํด๋ผ์ด์ธํธ๋ก ๋ด๋ ค์ฃผ๋ค~ ์ฌ๊ธฐ๊น์ง๊ฐ ๋ ๋ฒ์งธ API ํด์
* ์ฐธ๊ณ ๋ก GET์ data๋ฅผ ์กฐํ(Read)๋ฅผ ํ ๋ ์ฃผ๋ก ์๋๋ค.
๊ทธ๋ฅ ์ฐธ๊ณ * ์์ POST๋ ์์ฑ(Create)ํ๊ฑฐ๋, ์ญ์ (Delete)ํ๊ฑฐ๋, ๋ณ๊ฒฝ(Update) / GET์ ์กฐํ(Read)
์ด๋ผ๋ผ CRUD ๋ค ๋์๋ค (์ฒดํฌ!)
์ ์ฐ์ ์๋ฒ๊ฐ ์๊ธด๊ฑด ์ด๋ ๊ฒ ์๊ฒผ๊ณ ~ ์ด์ ํด๋ผ์ด์ธํธ(frontend)์ ํจ์๋ค์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ๋ณด๋ฌ ๊ฐ์๋ค.
์ฌ๊ธฐ๋ 2๊ฐ๊ฐ ์๋ค~
<script>
$(document).ready(function () {
show_bucket();
});
function show_bucket() {
fetch('/bucket').then(res => res.json()).then(data => {
console.log(data)
alert(data["msg"]);
})
}
function save_bucket() {
let formData = new FormData();
formData.append("sample_give", "์ํ๋ฐ์ดํฐ");
fetch('/bucket', { method: "POST", body: formData, }).then((response) => response.json()).then((data) => {
alert(data["msg"]);
window.location.reload();
});
}
</script>
์ฒซ ๋ฒ์งธ ํจ์ ๋ถํฐ ๋ด ์๋ค.
<script>
$(document).ready(function () {
show_bucket();
});
function show_bucket() {
fetch('/bucket').then(res => res.json()).then(data => {
console.log(data)
alert(data["msg"]);
})
}
์ ์ฌ๊ธฐ์
<script>
$(document).ready(function () {
show_bucket();
});
$(document).ready()๋ ์น ํ์ด์ง ์ฐฝ์ด ๋ก๋ฉ์ด ๋๋ฉด~ ์ค๋น๊ฐ ๋๋ฉด~ ()ํ ๊ฑฐ์ผ~ ์ด๋ฐ ๋ป์ ๋๋ค.
()๊ฐ ๋ญ์ผ?
function () {
show_bucket();
});
ํจ์๊ฐ ์๋๋ฐ show_bucket() ์ด๋ผ๋ ํจ์๋ฅผ ๋ถ๋ฌ์ฌ๊ฑฐ์ผ~ ๊ทธ๊ฒ ๋ญ๋ฐ~?
์ด์ด์ง๋ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด
function show_bucket() {
fetch('/bucket').then(res => res.json()).then(data => {
console.log(data)
alert(data["msg"]);
})
}
๋ด์ฉ์ ๋ ์ค๊ดํธ{} ํ ๊ฑฐ์ผ~
๋ณด๋ฉด fetch('/bucket') ์ด๋ผ ์ฐ์ฌ์๊ณ , ํด์์ = ์ด ๋ '/bucket' ์ฌ๊ธฐ๋ก fetch(๋ณด๋ผ๊ฑฐ์ผ~) *fetch=๋ณด๋ด๋ค
๊ทธ๋ฆฌ๊ณ
then(res => res.json()).then(data => {
console.log(data)
alert(data["msg"]);
})
res(๊ฒฐ๊ณผ ๊ฐ) ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์์ฌ๊ฑด๋ฐ~ json() (์ ์ด์จํํ) ๋ก ๋ฐ์์ฌ๊ฑฐ์ผ~. then ๊ทธ๋ฆฌ๊ณ ! ๊ฒฐ๊ณผ๊ฐ์ data๋ผ๊ณ ํ๊ณ ,
๋๋ ๊ทธ๊ฑธ {} ์ค๊ดํธ~ ํ ๊ฑฐ์ผ.
{}์ ๋ญ์์ด?
console.log(data)
alert(data["msg"]);
์ ์ด์จ ํํ๋ก ๋ฐ์์จ ๊ฒฐ๊ณผ๊ฐ์ data๋ผ ํ๊ณ ๊ทธ๊ฑฐ๋ฅผ console.log๋ก ์ฝ์์ฐฝ์ ์ฐ์ด๋ณผ๊ฑฐ์ผ~
๊ทธ๋ฆฌ๊ณ alert๋ฅผ ๋์ธ๊ฑฐ์ผ~ ๋ญ๋ฅผ??? data์ "msg" ๊ฐ์ !!
* ์ฐธ๊ณ ๋ก ๊บฝ์ []๋์ค๊ณ ์์ "msg" ์ด๋ฐ ๋ฌธ์์ด ๋์ค๋ฉด ? ๊ทธ๊ฑด dictionary
dictionary๋ ๋ญ๋ก ์ด๋ค์ ธ ์๋ค?? ์ค๊ดํธ ์์ !{ key : value, key: value, ........ }
๊ทธ๋ผ alert์ ๋์ธ ๋ dictionary์ key ๊ฐ์ธ "msg"๋ฅผ ๋์ ์ผ๋๊น? ์ฐํ๋๊ฑด value๊ฐ์ด ์ฐํ๊ฒ ๋ค~
์ฌ๊ธฐ๊น์ง๊ฐ ์ฒซ ๋ฒ์งธ ์ฝ๋ ํด์
๋ ๋ฒ์งธ ์ฝ๋
function save_bucket() {
let formData = new FormData();
formData.append("sample_give", "์ํ๋ฐ์ดํฐ");
fetch('/bucket', { method: "POST", body: formData, }).then((response) => response.json()).then((data) => {
alert(data["msg"]);
window.location.reload();
});
}
save_bucket() ์ด๋ผ๋ ํจ์ ๋ถ๋ฌ์ฌ๊ฑฐ์ผ~ ๋ด์ฉ์ด ๋ญ์ผ? ์ค๊ดํธ !! {}
๊ทผ๋ฐ ์ด๋ฒ save_bucket()ํจ์๋ ์ธ์ ๋ถ๋ฌ์ค๋ ๊ฑธ๊น???
์กฐ๊ธ๋ ์๋์ ๋ด๋ ค๊ฐ์ ์ ์ฒด ์ฝ๋ ์ค <body>๋ถ๋ถ์ ๋ณด๋ฉด ์๋ค. ๊ทธ ๋ถ๋ถ๋ง ๊ฐ์ ธ์ค๊ฒ ์ต๋๋ค.
<button onclick="save_bucket()" type="button" class="btn btn-outline-primary">๊ธฐ๋กํ๊ธฐ</button>
์ฝ๋๋ฅผ ๋ณด๋ฉด <button>์ด๋ผ๋ ๋ฒํผํ๊ทธ๊ฐ ๋ค์ด๊ฐ ์๊ณ ๋ฐ๋ก ์์ onclick="save_bucket()" ์๋ค์.
ํด์ํ๋ฉด '๊ธฐ๋กํ๊ธฐ'๋ผ๋ ๋ฒํผ์ ์ฌ์ดํธ์์ ํด๋ฆญํ๋ฉด~ "save_bucket()"์ด๋ผ๋ ํจ์ ๋ถ๋ฌ์~ ์ด๋ ๊ฒ ํด์ํฉ๋๋ค
๊ทธ๋ผ ๋ค์ save_bucket()๋ก ์ฌ๋ผ์์ ํจ์์ ๋ด์ฉ์ธ ์ค๊ดํธ {} ์์ ๋ถ๋ถ
let formData = new FormData()
๋ฌด์ธ๊ฐ ์๋ก์ด ํํ(form)์ data๋ฅผ formData๋ผ๋ ๋ณ์๋ก ๋ฐ์๊ฑฐ๊ณ ~
formData.append("sample_give", "์ํ๋ฐ์ดํฐ")
๊ทธ formData๋ฅผ append ๋ถ์ผ๊ฑฐ์ผ~ ์ด๋ป๊ฒ~~?
"sample_give"๋ผ๋ ์ด๋ฆ์ "์ํ๋ฐ์ดํฐ"๋ผ๋ data๋ฅผ ๊ฐ์ง formData๋ก~ ๊ทธ๋ฆฌ๊ณ
fetch('/bucket', { method: "POST", body: formData, }).then((response) => response.json()).then((data) => {
alert(data["msg"]);
window.location.reload();
fetch ๋ณด๋ผ๊ฑฐ์ผ~ ์ด๋์? '/bucket' ๋ผ๋ ๊ณณ์~, ๋ฐฉ์์ POST๊ณ , ๋ด์ฉ๋ฌผ์ formData๋ก, then ๊ทธ๋ฆฌ๊ณ
๋ค์ data๋ฅผ ๋ฐ์์ฌ๊ฑฐ๊ณ ~ ๊ทธ data์ "msg"๊ฐ์ alert ๋์ธ๊ฑฐ์ผ~
์ฌ๊ธฐ๊น์งํด์ ๋ ๋ฒ์งธ ์ฝ๋๊น์ง
window.location.reload();
* ์ฐธ๊ณ ๋ก ์ ์ฝ๋๋ alert์ ๋์ ์ผ๋ฉด, ์๋์ฐ ์ฐฝ์ ๋ค์ ์คํํด๋ผ~ (ํ ๋ง๋๋ก ์๋ก๊ณ ์นจ) ์ด๋ผ๋ ๋ป.
๋ฐฑ์๋(app.py) ํ๋ก ํธ์๋(index.html)์์ ํ์ฌ ์๋ํ๋ ๋ชจ๋ ํจ์๋ฅผ ์์ ๋ดค๋ค.
ํด์์ ํ๋ค๋ณด๋~ ์๋ค๊ฐ ์๋ก ์ด๋ค์์ผ๋ก ์๋ต์ ํ๋์ง ๊ทธ ํ๋ฆ์ ๋ํด์ ๋ณด์ด๊ธฐ ์์ํ๋๋ฐ, ๊ทธ ์์์ง์ ์ ์ด ๊ณณ์ด๋ค.
์ ์ผ ๋ง์ง๋ง์ ํด์ํ ํจ์์ค์์
let formData = new FormData()
์ฐ๋ฆฌ๋ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์๊ธฐ๋ฉด ๊ทธ๊ฑธ ํผ๋ฐ์ดํฐ๋ผ๋ ๋ณ์๋ก ๋ฐ๊ณ ,
formData.append("sample_give", "์ํ๋ฐ์ดํฐ")
formData๋ฅผ ๋ถ์ฌ์ค๊ฑฐ์ผ ("sample_give", "์ํ๋ฐ์ดํฐ") ์ด๋ฐํํ๋ก~ ๊ทธ๊ฑธ ์ด๋๋ค ๋ณด๋ด?
๋ฐ๋ก ์ฌ๊ธฐ /bucket
์ด๊ฑฐ ๋งจ์ฒ์ ํด์ํ app.py์๋ ์์์ฃ ?
@app.route("/bucket", methods=["POST"])
def bucket_post():
sample_receive = request.form['sample_give']
print(sample_receive)
return jsonify({'msg': 'POST ์ฐ๊ฒฐ ์๋ฃ!'})
๋ฐ๋ก ์ด ์ฝ๋
์ฐ๋ฆฌ๊ฐ ํด๋ผ์ด์ธํธ์์ ๊ฐ๊ณ ์จ ํํ(form)์ค์~ 'sample_give'์ด๋ฐ์ ๊ฐ ์์ผ๋ฉด
๊ทธ๊ฑธ ๋๋ sample_receive๋ผ๋ ๋ณ์๋ก ๊ทธ data๋ฅผ ๋ฐ๊ฒ ๋ค.
formData.append("sample_give", "์ํ๋ฐ์ดํฐ")
์ฐ๋ฆฌ๊ฐ ์ธ์จ data์ "sample_give" ๊ฐ ์๋ค.
๊ทธ๋ผ "์ํ๋ฐ์ดํฐ" ์ด ๊ฐ์ ์๋ฒ(๋ฐฑ์๋)์ชฝ์ผ๋ก ์ฃผ๋ฉด์ ๋ฐฑ์๋๋ sample_receive ๋ผ๋ ๋ณ์๋ก "์ํ๋ฐ์ดํฐ"๋ฅผ ๋ฐ๋๊ฑฐ๊ณ
ํ๋ฆฐํธ(sample_receive)๋ฅผ ํ ๋ค์~
๊ทธ๋ฆฌ๊ณ ๋ค์ ํด๋ผ์ด์ธํธ ์ชฝ์ผ๋ก {'msg': 'POST ์ฐ๊ฒฐ ์๋ฃ!'} ์ด๋ ๊ฒ ๋ด๋ ค์ฃผ๊ฒ ๋ค.
then((response) => response.json()).then((data) => {
alert(data["msg"])
๊ทธ๋ผ ํด๋ผ์ด์ธํธ๋ ์๋ฒ๊ฐ ๋ด๋ ค์ค {'msg': 'POST ์ฐ๊ฒฐ ์๋ฃ!'}์ฌ๊ธฐ์์ msg๊ฐ์ alert์ ๋์ฐ๋๊น ์ถ๋ ฅ๋๋ ๊ฐ์??
POST ์ฐ๊ฒฐ ์๋ฃ! ๊ฐ ์ถ๋ ฅ์ด ๋๋ค.
์ ์ค์ค๋ก ์ฝ๋ฉ์ ๋ฐฐ์๊ฐ๋ฉด์ ๊ฐ์ฅ ํฅ๋ฏธ๋๊ฐ ๋์์ง๊ณ , ์ง์ค๋๊ฐ ์ฌ๋ผ๊ฐ๋๋
ํญ์ ๋ฌด์ธ๊ฐ๋ฅผ ๊นจ์ฐ์น๊ณ ๊นจ๋ฌ์ ๋, ๊ทธ ๋๊ฐ ๊ฐ์ฅ ์ต๊ณ ๋ก ์ฆ๊ฒ์ต๋๋ค.
์ค๋ ์ ๋ฆฌํ ์ด ํด์์ด ์ ์๊ฒ ์ต๊ณ ์ ์ฆ๊ฑฐ์์ ๋ง๋ค์ด ์ค ์๊ฐ๋ค์ ์ฐ์ ์ฐ์ ์ฐ์์ ๋๋ค.
์ฝ๋ ํ๋ํ๋์ ํด์ ๋ฟ๋ง ์๋๋ผ ์๋ก์ ๋๊ฒจ์ฃผ๊ณ ๋ด๋ ค๋ฐ๋ data๋ค์ด
๊ฐ์ ์์น์์ ์ด๋ป๊ฒ ๋ฐ์ํ๊ณ ์ด๋ป๊ฒ ํ์ฉ์ด ๋๋์ง
๊ทธ ํ๋ฆ์ ํ์ ํ๋ฉด์ ๊ต์ฅํ ์ฆ๊ฑฐ์ ๊ณ ์ฌ๋ฐ์์ต๋๋ค.
์ด์ ์ฝ๋, ์ฝ๋ฉ์ ๋ฐฐ์ด์ง 3์ผ์ฐจ๊ฐ ๋์์ต๋๋ค.[์ฝ๋ฆฐ์ด] ๊ทธ ์์ฒด์ฃ .
์์ง์ ๋ฐฐ์ด ์ฝ๋๋ค์ ๋น์ฅ ํ์ฉํ๊ธฐ์๋ ์ํด๋ฌ์ ๊ธ๊ธํ์ง๋ง
์ด๋ฐ์์ ํ๋ฆ๋ค์ ์ดํดํ๊ณ ๊ฑฐ๊ธฐ์ ์ฝ๋ ์ง์๋ค์ ์์ ๊ฐ๋ค๋ฉด
์ง๊ธ๋ณด๋ค ๋ ํฐ ์ฌ๋ฏธ๋ค์ ๋๋ผ๋ ์๊ฐ๋ค์ด ๋ง์ด ์๊ธฐ๊ฒ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋์
์ค๋๋ ๋ชฐ๋ผ๋ ์ฒ์ฒํ,
๋๋ ค๋ ๊พธ์คํ๊ฒ,
๊ทธ๋ ๊ฒ ๋์๊ฐ๋ ค๊ณ ํฉ๋๋ค.