ใ ์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ ์น๊ฐ๋ฐ ์ข ํฉ โ1์ฃผ์ฐจโ ใ
ใ ์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ ์น๊ฐ๋ฐ ์ข ํฉ โ2์ฃผ์ฐจโ ใ
ใ ์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ ์น๊ฐ๋ฐ ์ข ํฉ โ3์ฃผ์ฐจโ ใ
[ Flask ํ๋ ์์ํฌ ]
- ๊ณต์ ํํ์ด์ง : https://flask-docs-kr.readthedocs.io/ko/latest/index.html
- ํ์ด์ฌ์ผ๋ก ์์ฑ๋ ๋ง์ดํฌ๋ก ์น ํ๋ ์์ํฌ
- Werkzeug ํดํท๊ณผ Jinja2 ํ ํ๋ฆฟ ์์ง์ ๊ธฐ๋ฐ์ ๋ ํ๋ ์์ํฌ
- ์น ์์ง๊ณผ ๋ถ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, API ์๋ฒ๋ฅผ ๋ง๋ค๊ธฐ์ ํธ๋ฆฌํ๋ค๋ ์ฅ์ ์ด ์์
[ Flask Application ]
- ์ฃผ๋ก ์๋ฒ๋ฅผ ์คํํ ๋ฉ์ธ ํ์ผ์ app.py๋ก ์ง์นญํ์ฌ ์ฌ์ฉ
- ํ์ผ ์คํ ์ http://localhost:5000/ ์์น๋ฅผ ํตํด ์ฐ๊ฒฐ ํ์ธ ๊ฐ๋ฅ
# ๊ธฐ๋ณธ ํ์
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run('0.0.0.0', port=5000, debug=True) # port๋ฒํธ๋ฅผ ํตํด ์ ์
[ Flask Routing ]
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์กฐํ๋ URL๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ,
์ฌ์ฉ์๊ฐ ์ธ๋ฑ์ค ํ์ด์ง๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๋ฐ๋ก ์ํ๋ ํ์ด์ง๋ก ์ ๊ทผํ ์ ์์
- ์์ route() ๋ฐ์ฝ๋ ์ดํฐ๋ ํจ์์ URL์ ์ฐ๊ฒฐํด์ฃผ๋ ์ญํ ์ ํจ
# ๊ธฐ๋ณธ ํ์
@app.route(‘/’) # localhost:5000/ ํ์ด์ง
def index():
return ‘Index Page’
@app.route(‘/hello’) # localhost:5000/hello ํ์ด์ง
def hello():
return ‘Hello World’
[ Flask ํ๋ ์์ํฌ ์ฌ์ฉ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ธํ ]
- ํ๋ก์ ํธ ํด๋
โ static ํด๋ (์ด๋ฏธ์ง, css ํ์ผ ๊ด๋ฆฌ)
โ templates ํด๋ (html ํ์ผ ๊ด๋ฆฌ)
โ app.py (main ํ์ผ)
[ render_template Method ]
- ๊ธฐ๋ณธ ํ๋ก์ ํธ ํด๋ ๋ด์ templates ํด๋๋ฅผ ์์ฑํ์ฌ html ํ์ผ์ ๊ด๋ฆฌํ ๊ฒฝ์ฐ
- render_template() ๋ฉ์๋๋ฅผ ํตํด htmlํ์ผ์ ๊ฐ๋จํ๊ฒ app.py์ render ๊ฐ๋ฅ
# ๊ธฐ๋ณธ ํ์
from flask import render_template
@app.route('/')
def home():
return render_template('index.html')
- Flask๋ jinja ํ ํ๋ฆฟ ์์ง์ ํตํด ์๋์ผ๋ก templates/html ํ์ผ์ ์ด์ค์ผ์ดํ
[ API ์์ฑ ์์ ]
- templates/ ํด๋๋ด์ index.html ์์ฑ
- ๋ฉ์ธ ์ฑ์ด ๋ app.py์ routing ๋ฐฉ์์ ์ฌ์ฉํ์ฌ GET ์์ฒญ / POST ์์ฒญ ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐ ํ์ธ
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- aJax / jQuery CDN -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<title>Document</title>
</head>
<body>
<h1>์๋ฒ๋ฅผ ๋ง๋ค์๋ค!</h1>
</body>
</html>
ํต์ ์์ฒญ ๋ฐฉ์ | ์ฌ์ฉ ๋ฒ์ | ๋ฐ์ดํฐ ์ ๋ฌ ๋ฐฉ๋ฒ |
GET | - ํต์์ ์ผ๋ก ๋ฐ์ดํฐ ์กฐํ ์์ฒญ - ๋ฐ์ดํฐ์ ๋ณ๋ ์์ - Ex) ์ํ ๋ชฉ๋ก ์กฐํ |
- URL ๋ค์ ๋ฌผ์ํ๋ฅผ ๋ถ์ฌ key=value๋ก ์ ๋ฌ |
POST | - ํต์์ ์ผ๋ก ๋ฐ์ดํฐ ์์ฑ, ๋ณ๊ฒฝ, ์ญ์ ๋ฑ ์์ฒญ - Ex) ํ์๊ฐ์ , ํ์ํํด, ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ |
- ๋ณด์ด์ง ์๋ HTML body์ key:value ํํ๋ก ์ ๋ฌ |
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html')
# GET ์์ฒญ API
@app.route('/test', methods=['GET'])
def test_get():
title_receive = request.args.get('title_give')
print(title_receive)
return jsonify({'result':'success', 'msg': '์ด ์์ฒญ์ GET!'})
# POST ์์ฒญ API
@app.route('/test', methods=['POST'])
def test_post():
title_receive = request.form['title_give']
print(title_receive)
return jsonify({'result':'success', 'msg': '์ด ์์ฒญ์ POST!'})
if __name__ == '__main__':
app.run('0.0.0.0', port=5000, debug=True)
ํต์ ์์ฒญ ๋ฐฉ์ | ajax ์์ฒญ ์ฝ๋ |
GET | - type : "GET" - url : "/url?key=value" - data : { } |
POST | - type : "POST" - url : "/url" - data : { key : value } |
[ BS4 ๋ชจ๋์ ํตํ ๋ฉํํ๊ทธ ํฌ๋กค๋ง ]
- ๋ฉํํ๊ทธ(MetaTag) : ๊ฒ์์์ง ์ต์ ํ(SEO)๋ฅผ ์ํ ์นํ์ด์ง์ ์์ฝ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ํ๊ทธ
- ๋ฐ๋์ <body/> ํ๊ทธ ์์ ์์นํด์ผ ํ๋ฉฐ ๋ธ๋ผ์ฐ์ ์ ๊ฒ์ ์์ง์ ํตํด ํด๋น ์นํ์ด์ง์ ์ ๋ณด๋ฅผ ๋ํ๋ผ ๋ ์ฌ์ฉ
# meta ํ๊ทธ ํฌ๋กค๋ง ์์
import requests
from bs4 import BeautifulSoup
# -- requests settings --
url = 'https://movie.naver.com/movie/bi/mi/basic.nhn?code=171539' # ๋ค์ด๋ฒ ์ํ '๊ทธ๋ฆฐ๋ถ' ํ์ด์ง
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get(url,headers=headers)
# -- bs4 settings --
soup = BeautifulSoup(data.text, 'html.parser')
# -- meta tag crawling --
og_title = soup.select_one('meta[property="og:title"]')['content']
og_image = soup.select_one('meta[property="og:image"]')['content']
og_description = soup.select_one('meta[property="og:description"]')['content']
print(og_title) # ๋ค์ด๋ฒ ์ํ ํ์ด์ง์ ์ ๋ชฉ ์ถ๋ ฅ
print(og_image) # ๋ค์ด๋ฒ ์ํ ํ์ด์ง์ ์ด๋ฏธ์ง ๋งํฌ ์ถ๋ ฅ
print(og_description) # ๋ค์ด๋ฒ ์ํ ํ์ด์ง์ ์ค๋ช
ํ
์คํธ ์ถ๋ ฅ
ใ ๋ชจ๋์ ์ฑ ๋ฆฌ๋ทฐ ๋ฏธ๋ ํ๋ก์ ํธ ์์ ใ
[ ํด๋๊ตฌ์กฐ ]
- bookReview
โ static
โ templates
โ index.html
โ app.py
[ ๋ฆฌ๋ทฐ ์ ์ฅ ]
- (ํด๋ผ์ด์ธํธ) ์ ๋ชฉ, ์ ์, ๋ฆฌ๋ทฐ๋ฅผ ์ฌ์ฉ์๊ฐ ์ง์ ์ ๋ ฅํ์ฌ POST ์์ฒญ ๋ฐฉ์์ผ๋ก ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ
- (์๋ฒ) ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ DB์ ์ ์ฅ
[ ๋ฆฌ๋ทฐ ๋์ํ ]
- (์๋ฒ) DB๋ก๋ถํฐ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌ
- (ํด๋ผ์ด์ธํธ) ์๋ฒ๋ก๋ถํฐ GET ์์ฒญ ๋ฐฉ์์ผ๋ก ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ผ์ฐ์ ์ ํํ
[ ํด๋ผ์ด์ธํธ ํ์ผ (index.html) JavaScript ์ฝ๋ ]
- $(document).ready(function( ) ) { } : ๋ธ๋ผ์ฐ์ ๊ฐ ๋ถ๋ ค์ค๋ ์ฆ์ ์คํ ๋๋ ํจ์(์ต์ด ์คํ ํจ์)
$(document).ready(function () {
showReview();
});
- makeReview( ) : ๋ฆฌ๋ทฐ ๋ฐ์ค์ ๊ฐ ์์๋ค์ ๊ฐ์ ๊ฐ์ ธ์ POST์์ฒญ ๋ฐฉ์์ผ๋ก ์๋ฒ๋ก ์ ๋ฌํ๋ ํจ์
function makeReview() {
let title = $("#title").val();
let author = $("#author").val();
let review = $("#bookReview").val();
$.ajax({
type: "POST",
url: "/review",
data: { title_give: title, author_give: author, review_give: review },
success: function (response) {
alert(response["msg"]);
window.location.reload();
},
});
}
- showReview( ) : ์๋ฒ๋ก๋ถํฐ GET ์์ฒญ๋ฐฉ์์ ํตํด ๋ถ๋ฌ์จ ๋ฐ์ดํฐ๋ค์ HTML ์์์ ์ฝ์ ํ๋ ํจ์
function showReview() {
$.ajax({
type: "GET",
url: "/review",
data: {},
success: function (response) {
let reviews = response["all_reviews"];
for (let i = 0; i < reviews.length; i++) {
let title = reviews[i]["title"];
let author = reviews[i]["author"];
let review = reviews[i]["review"];
let temp_html = `<tr>
<td>${title}</td>
<td>${author}</td>
<td>${review}</td>
</tr>`;
$("#reviews-box").append(temp_html);
}
},
});
}
[ ์๋ฒ ํ์ผ ( app.py ) ]
# app.py
from flask import Flask, render_template, jsonify, request
from pymongo import MongoClient
# -- Flask Server Run --
app = Flask(__name__)
# -- MongoDB Settings --
client = MongoClient('localhost', 27017)
db = client.dbsparta
# render_template ๋ฉ์๋๋ฅผ ํตํด HTML ์ ๋ฌ
@app.route('/')
def home():
return render_template('index.html')
# -- API --
# ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ ์ ๋ฌ๋ฐ์ ๋์
๋๋ฆฌํ ๋ฐ์ดํฐ ์์ฑ ํ DB์ ์์ฑ [ POST ์์ฒญ ]
@app.route('/review', methods=['POST'])
def write_review():
title_receive = request.form['title_give']
author_receive = request.form['author_give']
review_receive = request.form['review_give']
doc = { 'title': title_receive,
'author': author_receive,
'review': review_receive }
db.bookreview.insert_one(doc)
return jsonify({'msg': '๋ฆฌ๋ทฐ ์ ์ฅ ์๋ฃ'})
# DB๋ด collection์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌ [ GET ์์ฒญ ]
@app.route('/review', methods=['GET'])
def read_reviews():
reviews = list(db.bookreview.find({}, {'_id': False}))
return jsonify({'all_reviews': reviews})
if __name__ == '__main__':
app.run('0.0.0.0', port=5000, debug=True)
[ ์์ฑ ๋ชจ์ต ]
ใ ๋ํ๋ก ๋งํฌ ๋ฉ๋ชจ์ฅ ํ๋ก์ ํธ ์์ ใ
[ ํด๋๊ตฌ์กฐ ]
- aloneMemo
โ static
โ index.css
โ templates
โ index.html
โ app.py
[ ๊ธฐ์ฌ ์ ์ฅ ]
- (ํด๋ผ์ด์ธํธ) ํฌ์คํ ๋ฐ์ค๋ฅผ ํตํด URL๊ณผ ์ฝ๋ฉํธ๋ฅผ POST ์์ฒญ ๋ฐฉ์์ผ๋ก ์๋ฒ์ ์ ๋ฌ
- (์๋ฒ) ์ ๋ฌ๋ฐ์ URL์ ๋ฉํ ํ๊ทธ๋ฅผ ํฌ๋กค๋ง(์ ๋ชฉ, ์ด๋ฏธ์ง, ์ค๋ช , ๋งํฌ)ํ์ฌ DB์ ์ ์ฅ
[ ๊ธฐ์ฌ ๋์ํ ]
- (์๋ฒ) DB๋ก๋ถํฐ ์ ์ฅ๋์ด ์๋ ๋ฐ์ดํฐ(์ ๋ชฉ, ์ด๋ฏธ์ง, ์ค๋ช , ๋งํฌ, ์ฝ๋ฉํธ)๋ฅผ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌ
- (ํด๋ผ์ด์ธํธ) GET์์ฒญ ๋ฐฉ์์ ํตํด ์๋ฒ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ผ์ฐ์ ์ ํํ
[ ๊ธฐ์ฌ ์ ๊ฑฐ ]
- (ํด๋ผ์ด์ธํธ) '์ญ์ ' ๋ฒํผ์ ํตํด ํด๋น ๊ธฐ์ฌ์ ์ ๋ณด๋ฅผ POST ์์ฒญ๋ฐฉ์์ผ๋ก ์๋ฒ์ ์ ๋ฌ
- (์๋ฒ) ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ DB์์ ์ญ์
[ ํด๋ผ์ด์ธํธ ํ์ผ (index.html) JavaScript ์ฝ๋ ]
- $(document).ready(function( ) ) { } : ๋ธ๋ผ์ฐ์ ๊ฐ ๋ถ๋ ค์ค๋ ์ฆ์ ์คํ ๋๋ ํจ์(์ต์ด ์คํ ํจ์)
$(document).ready(function(){
showArticle();
});
- handleCommenting( ) : ๊ฐ๋จ ์ฝ๋ฉํธ์ ํ์ฌ ๊ธ์์๋ฅผ ํ์ํ๊ณ ์ด ๊ธ์์๋ฅผ 24์๋ก ์ ํํ๋ ํจ์
function handleCommenting(response){
$(".comment_count").html("(" + $(response).val().length + " / 24" + ")");
if($(response).val().length > 24){
$(response).val($(response).val().substring(0, 24));
$(".comment_count").html("(24 / 24)");
}
}
- handlePosting( ) : ์ด๊ธฐ ํฌ์คํ ๋ฐ์ค๋ฅผ '๋ซ๊ธฐ' ์ํ๋ก ์ ์งํ๊ณ ํด๋ฆญ์ ๋ง๋ค ์ํ๊ฐ ๋ณํ๋ ํจ์
function handlePosting(){
let status = $('.posting-box').css('display');
if(status == 'block'){
$('.posting-box').hide();
$('#btn-posting-box').text('ํฌ์คํ
๋ฐ์ค ์ด๊ธฐ');
}else{
$('.posting-box').show();
$('#btn-posting-box').text('ํฌ์คํ
๋ฐ์ค ๋ซ๊ธฐ');
}
}
- handleRemove( ) : ๊ธฐ์ฌ '์ญ์ ' ๋ฒํผ ํด๋ฆญ์ ํ์ธ ์๋ด ๋ฌธ๊ตฌ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํจ์
function handleRemove(response){
if(confirm("์ ๋ง ์ญ์ ํ์๊ฒ ์ต๋๊น?")){
deleteArticle($(response));
} else{
false;
}
};
- deleteArticle( ) : ํ์ฌ ๋๋ฌ์ง '์ญ์ ' ๋ฒํผ ์์์ 'title'๊ณผ 'comment' ๊ฐ์ POST์์ฒญ ๋ฐฉ์์ผ๋ก ์๋ฒ๋ก ์ ๋ฌํ๋ ํจ์
function deleteArticle(response){
let data = $(response)[0].dataset;
let title = data.title;
let comment = data.comment;
$.ajax({
type : 'post',
url : '/delete',
data : {article_title : title, article_comment : comment},
success: function(response){
alert(response["msg"]);
window.location.reload() // ํ์ด์ง ์๋ก ๊ณ ์นจ
}
})
}
- postArticle( ) : ํ์ฌ ํฌ์คํ ๋ฐ์ค์ url ๊ฐ๊ณผ comment ๊ฐ์ POST์์ฒญ ๋ฐฉ์์ผ๋ก ์๋ฒ๋ก ์ ๋ฌํ๋ ํจ์
function postArticle(){
let url = $(".post-url").val();
let comment = $(".post-comment").val();
$.ajax({
type : 'post',
url : '/memo',
data : {url_give : url, comment_give : comment},
success: function(response){
alert(response["msg"]);
window.location.reload() // ํ์ด์ง ์๋ก ๊ณ ์นจ
}
})
}
- showArticle ( ) : ์๋ฒ๋ก๋ถํฐ GET์์ฒญ ๋ฐฉ์์ ํตํด title, image, comment ๋ฑ์ ์ ๋ณด๋ฅผ ์ ๋ฌ๋ฐ์ html ์์์ ์ฝ์ ํ๋ ํจ์
function showArticle(){
$.ajax({
type: "GET",
url: "/memo",
data: {},
success: function(response){
let articles = response['all_articles'];
for(let i=0; i<articles.length; i++){
let title = articles[i]["title"];
let image = articles[i]["image"];
let comment = articles[i]["comment"];
let url = articles[i]["url"];
let description = articles[i]["description"];
let temp_html = `<div class="card">
<img
class="card-img-top"
src="${image}"
alt="Card image cap"
/>
<div class="card-body">
<a href="${url}" class="card-title">${title}</a>
<p class="card-text">${description.slice(0, 180)}</p>
<p class="card-comment">${comment.slice(0, 24)}</p>
</div>
<button type="button"
class="article-btn btn btn-danger"
data-title="${title}"
data-comment="${comment}"
onclick="handleRemove(this)">์ญ์ </button>
</div>`;
$(".card-columns").append(temp_html);
}
}
})
}
[ ์๋ฒ ํ์ผ ( app.py ) ]
from flask import Flask, render_template, jsonify, request
import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
# -- flask settings --
app = Flask(__name__)
# -- pyMongo settings --
client = MongoClient('localhost', 27017)
db = client.dbsparta
## -- flask APP Routing --
@app.route('/')
def home():
return render_template('index.html')
# Listing API
@app.route('/memo', methods=['GET'])
def listing():
articles = list(db.articles.find({}, {'_id': False}))
return jsonify({'all_articles': articles})
# Posting API
@app.route('/memo', methods=['POST'])
def saving():
url_receive = request.form['url_give']
comment_receive = request.form['comment_give']
# request
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get(url_receive, headers=headers)
# bs4 set
soup = BeautifulSoup(data.text, 'html.parser')
og_title = soup.select_one('meta[property="og:title"]')['content']
og_image = soup.select_one('meta[property="og:image"]')['content']
og_description = soup.select_one('meta[property="og:description"]')['content']
# pyMongo set
doc = {'title': og_title,
'image': og_image,
'description': og_description,
'url': url_receive,
'comment': comment_receive}
db.articles.insert_one(doc)
return jsonify({'msg': '๊ธฐ์ฌ ์ ์ฅ์ด ์๋ฃ๋์์ต๋๋ค.'})
# Delete API
@app.route('/delete', methods=['POST'])
def delete_article():
title = request.form['article_title']
comment = request.form['article_comment']
# pyMongo set
collection = db.articles
target_data = collection.find_one({'title': title, 'comment': comment}, {'_id': False})
collection.delete_one(target_data)
return jsonify({'msg': '๊ธฐ์ฌ๊ฐ ์ ๊ฑฐ๋์์ต๋๋ค.'})
if __name__ == '__main__':
app.run('0.0.0.0', port=5000, debug=True)
[ ์์ฑ ๋ชจ์ต ]
ใ ๋ํ๋ก ์ผํ๋ชฐ ํ๋ก์ ํธ ์์ ใ
[ ํด๋๊ตฌ์กฐ ]
- aloneShop
โ static
โ index.css
โ eva_t.jpg
โ templates
โ index.html
โ app.py
[ ์ฃผ๋ฌธ ์ ๋ณด ์ ์ฅ ]
- (ํด๋ผ์ด์ธํธ) ์ฃผ๋ฌธ ์ ๋ณด ์ ๋ ฅ์ ํตํด ์ด๋ฆ, ์๋, ์ฃผ์, ์ ํ๋ฒํธ๋ฅผ POST ์์ฒญ ๋ฐฉ์์ผ๋ก ์๋ฒ์ ์ ๋ฌ
- (์๋ฒ) ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ค์ ์ ๋ณด๋ฅผ DB์ ์ ์ฅ
[ ์ฃผ๋ฌธ ๋ด์ญ ํ์ ]
- (์๋ฒ) DB๋ก๋ถํฐ ์ ์ฅ๋์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌ
- (ํด๋ผ์ด์ธํธ) GET์์ฒญ ๋ฐฉ์์ ํตํด ์๋ฒ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ผ์ฐ์ ์ ํ์
[ ์ฃผ๋ฌธ ๋ด์ญ ์ ๊ฑฐ ]
- (ํด๋ผ์ด์ธํธ) 'X' ๋ฒํผ์ ํตํด ํด๋น ์ฃผ๋ฌธ๋ด์ญ์ ์ ๋ณด๋ฅผ POST ์์ฒญ๋ฐฉ์์ผ๋ก ์๋ฒ์ ์ ๋ฌ
- (์๋ฒ) ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ DB์์ ์ญ์
[ ํด๋ผ์ด์ธํธ ํ์ผ (index.html) JavaScript ์ฝ๋ ]
- $(function( ) ) { } : ๋ธ๋ผ์ฐ์ ๊ฐ ๋ถ๋ ค์ค๋ ์ฆ์ ์คํ ๋๋ ํจ์(์ต์ด ์คํ ํจ์)
$(function () {
$(".exchange_rate__btn").empty(); // ํ์จ ํ์๋ ๋น์ฐ๊ธฐ
$.ajax({ // GET์์ฒญ ๋ฐฉ์์ผ๋ก ์๋ก๊ณ ์นจ์ ๋ง๋ค ์๋ก์ด ํ์จ ์ ์ฉ
type: "GET",
url: "http://spartacodingclub.shop/sparta_api/rate",
data: {},
success: function (response) {
let rate = response["rate"];
$(".exchange_rate").append(`<span>: ${rate}</span>`);
},
});
showOrders() // ์ฃผ๋ฌธ๋ด์ญ ํ์
});
- showOrders( ) : GET์์ฒญ ๋ฐฉ์์ ํตํด ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ HTML ์์์ ์ฝ์ ํ๋ ํจ์
function showOrders(){
$.ajax({
type: "GET",
url: "/orderInfo",
data: {},
success: function(response){
let orders = response['all_orders'];
for(let i=0; i<orders.length; i++){
let order_name = orders[i]["order_name"];
let order_amount = orders[i]["order_amount"];
let order_address = orders[i]["order_address"];
let order_phone = orders[i]["order_phone"];
let temp_html = `<tr>
<td>${order_name}</td>
<td>${order_amount}</td>
<td>${order_address}</td>
<td>${order_phone}
<button type="button"
class="delete-btn btn btn-danger"
data-name="${order_name}"
data-amount="${order_amount}"
onclick="handleRemove(this)">X</button>
</td>
</tr>`;
$(".orders_table").append(temp_html);
}
}
})
}
- addOrders( ) : ์ ๋ ฅํ ์ฃผ๋ฌธ์ ๋ณด ๊ฐ์ ๊ฐ์ ธ์ POST์์ฒญ ๋ฐฉ์์ผ๋ก ์๋ฒ๋ก ์ ๋ฌํ๋ ํจ์
function addOrders(){
let name = $(".order-name").val();
let amount = $(".order-amount").val();
let adreess = $(".order-address").val();
let phone = $(".order-phone").val();
$.ajax({
type : 'post',
url : '/orderInfo',
data : {name_give: name, amount_give: amount,
address_give: adreess, phone_give: phone },
success: function(response){
alert(response["msg"]);
window.location.reload() // ํ์ด์ง ์๋ก ๊ณ ์นจ
}
})
}
- deleteOrder( ) : 'X' ๋ฒํผ ํด๋ฆญ์ ํตํด ํด๋น ์ฃผ๋ฌธ๋ด์ญ์ ์ ๋ณด๋ฅผ POST ์์ฒญ๋ฐฉ์์ผ๋ก ์๋ฒ๋ก ์ ๋ฌํ๋ ํจ์
function deleteOrder(response){
let data = $(response)[0].dataset;
let name = data.name;
let amount = data.amount;
$.ajax({
type : 'post',
url : '/delete',
data : {order_name : name, order_amount : amount},
success: function(response){
alert(response["msg"]);
window.location.reload() // ํ์ด์ง ์๋ก ๊ณ ์นจ
}
})
}
[ ์๋ฒ ํ์ผ ( app.py ) ]
from flask import Flask, render_template, jsonify, request
from pymongo import MongoClient
# -- flask settings --
app = Flask(__name__)
# -- pyMongo settings --
client = MongoClient('localhost', 27017)
db = client.dbsparta
## -- flask APP Routing --
@app.route('/')
def home():
return render_template('index.html')
# Listing API
@app.route('/orderInfo', methods=['GET'])
def listing():
orders = list(db.orders.find({}, {'_id': False}))
return jsonify({'all_orders': orders})
# Ordering API
@app.route('/orderInfo', methods=['POST'])
def saving():
name_receive = request.form['name_give']
amount_receive = request.form['amount_give']
address_receive = request.form['address_give']
phone_receive = request.form['phone_give']
# pyMongo set
doc = {'order_name': name_receive,
'order_amount': amount_receive,
'order_address': address_receive,
'order_phone': phone_receive}
db.orders.insert_one(doc)
return jsonify({'msg': '์ฃผ๋ฌธ์ด ์๋ฃ๋์์ต๋๋ค.'})
# Delete API
@app.route('/delete', methods=['POST'])
def delete_article():
name = request.form['order_name']
amount = request.form['order_amount']
# pyMongo set
collection = db.orders
target_data = collection.find_one({'order_name': name, 'order_amount': amount}, {'_id': False})
collection.delete_one(target_data)
return jsonify({'msg': '์ฃผ๋ฌธ ์ ๋ณด๊ฐ ์ ๊ฑฐ๋์์ต๋๋ค.'})
if __name__ == '__main__':
app.run('0.0.0.0', port=5000, debug=True)
[ ์์ฑ ๋ชจ์ต ]