Just Fighting
[Flask] MongoDB에 데이터 저장하고 받아오기 본문
2022.01.19 - [Web/백엔드] - API 만들기
위에 글에 이어서 이번엔 몽고DB에 데이터를 저장하고 불러오는 것을 정리하려고 한다.
app.py는 그대로 두고 index.html만 바꿔서
과일을 저장하는 홈페이지를 작성했다.
<index.html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Flask 연습</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script>
$(document).ready(function () {
show_get();
});
function show_get() {
$.ajax({
type: "GET",
url: "/test?title=hello",
data: {},
success: function (response) {
console.log(response)
}
})
}
function show_post() {
let fruit = $('#fruit').val() /* 입력값 가져오기 */
let temp_html = `<li>${fruit}</li>` /* 추가할 html */
$('#fruit_list').append(temp_html) /* id가 fruit_list인 태그 안에 추가 */
$('#fruit').val(''); /* 입력창 비워주기 */
$.ajax({
type: "POST",
url: "/test",
data: {title: 'Hello!'},
success: function (response) {
console.log(response)
}
})
}
</script>
<style>
html {
width: 500px;
margin: 20px;
}
</style>
</head>
<body>
<h1>먹고싶은 과일 저장하기!</h1>
<hr>
<div class="input-group mb-3" id="input">
<input type="text" class="form-control" placeholder="과일 이름" aria-label="과일 이름"
aria-describedby="button-addon2" id="fruit">
<button class="btn btn-outline-secondary" type="button" id="button-addon2" onclick="show_post()">추가</button>
</div>
<ul id="fruit_list">
</ul>
</body>
</html>
데이터 저장과 조회는 아래 게시글에 사용했던 방법을 사용한다.
2022.01.16 - [Web/백엔드] - MongoDB와 Python 연결하기
< 데이터 저장하기 >
index.html에 show_post() 부분을 아래 코드로 바꿔준다.
입력창에 값을 가져와 fruit_name으로 /test에 보내준다.
function show_post() {
let fruit = $('#fruit').val() /* 입력값 가져오기 */
let temp_html = `<li>${fruit}</li>` /* 추가할 html */
$('#fruit_list').append(temp_html) /* id가 fruit_list인 태그 안에 추가 */
$('#fruit').val(''); /* 입력창 비워주기 */
$.ajax({
type: "POST",
url: "/test",
data: {fruit_name : fruit},
success: function (response) {
console.log(response)
}
})
}
그리고 app.py 파일에 test_pots() 를 아래와 같이 바꿔준다.
이 코드는 받은 데이터를 fruit에 넣는다.
이 코드가 정상적으로 실행하기 위해선 몽고DB와의 연결이 우선이다.
위에 링크로 가서 순서대로 연결하면 된다.
@app.route('/test', methods=['POST'])
def test_post():
fruit_name = request.form['fruit_name']
doc = {'fruit_name': fruit_name}
db.fruit.insert_one(doc)
return jsonify({'msg': '저장 완료'})
데이터 저장은 성공적으로 이루어졌다!
< 데이터 가져오기 >
index.html에 show_get()을 아래와 같이 바꿔준다.
show_get()이 실행되면 /test로 가 test_get()함수를 호출한다.
function show_get() {
$.ajax({
type: "GET",
url: "/test",
data: {},
success: function (response) {
let rows = response['fruits']
for(let i=0; i<rows.length; i++) {
let fruit = rows[i]['fruit_name']
let temp_html = `<li>${fruit}</li>` /* 추가할 html */
$('#fruit_list').append(temp_html) /* id가 fruit_list인 태그 안에 추가 */
}
}
})
}
test_get()함수는 fruit에 있는 모든 데이터를 가져와 리턴한다.
@app.route('/test', methods=['GET'])
def test_get():
fruit_list = list(db.fruit.find({}, {'_id': False}))
return jsonify({'fruits': fruit_list})
새로고침 하면 아까 넣은 데이터를 확인할 수 있다.
위의 방식은 데이터를 저장할 때 화면에 표시하도록 되어있다.
데이터를 저장할 때마다 저장된 데이터를 불러와서 로드하는 방식으로 코드를 바꿔보자.
show_post()에서 POST를 성공적으로 마쳤을 때,
window.location.reload()를 하면 페이지가 새로고침되면서 show_get()을 불러온다.
function show_post() {
let fruit = $('#fruit').val() /* 입력값 가져오기 */
$.ajax({
type: "POST",
url: "/test",
data: {fruit_name : fruit},
success: function (response) {
console.log(response)
window.location.reload()
}
})
}
전체 코드는 아래와 같다.
<app.py>
3행에 mongodb 연결할 때의 주소는 각자 주소를 써주면 된다.
from flask import Flask, render_template, jsonify, request
from pymongo import MongoClient
client = MongoClient('mongodb+srv://yeeun:[비밀번호]@cluster0.pasxm.mongodb.net/Cluster0?retryWrites=true&w=majority')
db = client.hobby
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html')
@app.route('/test', methods=['GET'])
def test_get():
fruit_list = list(db.fruit.find({}, {'_id': False}))
return jsonify({'fruits': fruit_list})
@app.route('/test', methods=['POST'])
def test_post():
fruit_name = request.form['fruit_name']
doc = {'fruit_name': fruit_name}
db.fruit.insert_one(doc)
return jsonify({'msg': '저장 완료'})
if __name__ == '__main__':
app.run('0.0.0.0', port=5000, debug=True)
<index.html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Flask 연습</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script>
$(document).ready(function () {
show_get();
});
function show_get() {
$.ajax({
type: "GET",
url: "/test",
data: {},
success: function (response) {
let rows = response['fruits']
for(let i=0; i<rows.length; i++) {
let fruit = rows[i]['fruit_name']
let temp_html = `<li>${fruit}</li>` /* 추가할 html */
$('#fruit_list').append(temp_html) /* id가 fruit_list인 태그 안에 추가 */
}
}
})
}
function show_post() {
let fruit = $('#fruit').val() /* 입력값 가져오기 */
$.ajax({
type: "POST",
url: "/test",
data: {fruit_name : fruit},
success: function (response) {
console.log(response)
window.location.reload()
}
})
}
</script>
<style>
html {
width: 500px;
margin: 20px;
}
</style>
</head>
<body>
<h1>먹고싶은 과일 저장하기!</h1>
<hr>
<div class="input-group mb-3" id="input">
<input type="text" class="form-control" placeholder="과일 이름" aria-label="과일 이름"
aria-describedby="button-addon2" id="fruit">
<button class="btn btn-outline-secondary" type="button" id="button-addon2" onclick="show_post()">추가</button>
</div>
<ul id="fruit_list">
</ul>
</body>
</html>
'Web > 백엔드' 카테고리의 다른 글
API 만들기 (0) | 2022.01.19 |
---|---|
Flask 시작하기 (0) | 2022.01.19 |
MongoDB와 Python 연결하기 (0) | 2022.01.16 |