커뮤니티
포인트
쿠폰
내 강의실
국비 신청 내역
증명서
계정
로그아웃
학습 질문
개발 일지
나의 활동
답변 완료
4주차 최종숙제에서 문제가..
undefined주차
북마크
손*민
댓글
27
추천
0
조회수
17
조회수
17
답변 완료


숙제 전까지, 서버에 저장하고 불러와서 화면 보여주는 내용은 잘 됬는데,

숙제에서 star 내용 추가하니까, 화면에 제대로 출력이 되지 않아요. 

수어사이드 스쿼드 4개만 보여요.

그 전에는 $().empty()로 그 전 내용 다 비우고, db에 저장된 내용을 불러서 카드로 보여줬는데 star 내용 삽입 후 초기 뼈대화면 처럼 나옵니다.

(별점 추가 내용은 삽입이 되었습니다. )

시험삼아 url하고 별점, 코멘트 입력해서 기록하기 버튼 클릭했는데 서버로 저장이 안됩니다.


뭐가 문제일까요?


-------------------------

app.py

from flask import Flask, render_template, request, jsonify
app = Flask(__name__)

import requests
from bs4 import BeautifulSoup

from pymongo import MongoClient
client = MongoClient('mongodb+srv://sparta:test@cluster0.eft1r76.mongodb.net/?retryWrites=true&w=majority')
db = client.dbsparta

@app.route('/')
def home():
  return render_template('index.html')

@app.route("/movie", methods=["POST"])
def movie_post():
  url_receive = request.form['url_give']
  comment_receive = request.form['comment_give']
  star_receive = request.form['star_give'] # 프론트엔드 star_give 받기

  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)
  soup = BeautifulSoup(data.text, 'html.parser')

  ogtitle = soup.select_one('meta[property="og:title"]')['content']
  ogimage = soup.select_one('meta[property="og:image"]')['content']
  ogdesc = soup.select_one('meta[property="og:description"]')['content']

  doc = {
    'title': ogtitle,
    'description': ogdesc,
    'image': ogimage,
    'comment': comment_receive,
    'star': star_receive, # DB에 star 집어넣을 준비
  }
  db.movies.insert_one(doc)
  return jsonify({'msg':'저장 완료!'})

@app.route("/movie", methods=["GET"])
def movie_get():
  all_movies = list(db.movies.find({},{'_id':False}))
  return jsonify({'result':all_movies})

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">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
    integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
    integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
    crossorigin="anonymous"></script>

  <title>스파르타 피디아</title>

  <link href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&display=swap" rel="stylesheet">

  <style>
    * {
      font-family: 'Gowun Dodum', sans-serif;
    }

    .mytitle {
      width: 100%;
      height: 250px;

      background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('https://movie-phinf.pstatic.net/20210715_95/1626338192428gTnJl_JPEG/movie_image.jpg');
      background-position: center;
      background-size: cover;

      color: white;

      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
    }

    .mytitle>button {
      width: 200px;
      height: 50px;

      background-color: transparent;
      color: white;

      border-radius: 50px;
      border: 1px solid white;

      margin-top: 10px;
    }

    .mytitle>button:hover {
      border: 2px solid white;
    }

    .mycomment {
      color: gray;
    }

    .mycards {
      margin: 20px auto 0px auto;
      width: 95%;
      max-width: 1200px;
    }

    .mypost {
      width: 95%;
      max-width: 500px;
      margin: 20px auto 0px auto;
      padding: 20px;
      box-shadow: 0px 0px 3px 0px gray;

      display: none;
    }

    .mybtns {
      display: flex;
      flex-direction: row;
      align-items: center;
      justify-content: center;

      margin-top: 20px;
    }

    .mybtns>button {
      margin-right: 10px;
    }
  </style>
  <script>
    $(document).ready(function () {
      listing();
    });

    function listing() {
      fetch('/movie').then((res) => res.json()).then((data) => {
        let rows = data['result']
        $('#cards-box').empty()
        rows.forEach((a)=>{
          let comment = a['comment']
          let desc = a['description']
          let image = a['image']
          let title = a['title']
          let star = a['star']

          let star_repeat = '⭐'.repeat(star_repeat)

          let temp_html = `<div class="col">
                    <div class="card h-100">
                      <img src="${image}"
                        class="card-img-top">
                      <div class="card-body">
                        <h5 class="card-title">${title}</h5>
                        <p class="card-text">${desc}</p>
                        <p>${star_repeat}</p>
                        <p class="mycomment">${comment}</p>
                      </div>
                    </div>
                  </div>`
          $('#cards-box').append(temp_html)


        })
      })
    }

    function posting() {
      let url = $('#url').val()
      let comment = $('#comment').val()
      let star = $('#star').val() //별점 읽기
       

      let formData = new FormData();
      formData.append("url_give", url);
      formData.append("comment_give", comment);
      formData.append("star_give", star); //별점 벡엔드로 보내기

      fetch('/movie', { method: "POST", body: formData }).then((res) => res.json()).then((data) => {
        alert(data['msg'])
      })
      window.location.reload() 
    }

    function open_box() {
      $('#post-box').show()
    }
    function close_box() {
      $('#post-box').hide()
    }
  </script>
</head>

<body>
  <div class="mytitle">
    <h1>내 생애 최고의 영화들</h1>
    <button onclick="open_box()">영화 기록하기</button>
  </div>
  <div class="mypost" id="post-box">
    <div class="form-floating mb-3">
      <input id="url" type="email" class="form-control" placeholder="name@example.com">
      <label>영화URL</label>
    </div>
    <div class="input-group mb-3">
      <label class="input-group-text" for="inputGroupSelect01">별점</label>
      <select class="form-select" id="star">
        <option selected>-- 선택하기 --</option>
        <option value="1"></option>
        <option value="2">⭐⭐</option>
        <option value="3">⭐⭐⭐</option>
        <option value="4">⭐⭐⭐⭐</option>
        <option value="5">⭐⭐⭐⭐⭐</option>
      </select>
    </div>
    <div class="form-floating">
      <textarea id="comment" class="form-control" placeholder="Leave a comment here"></textarea>
      <label for="floatingTextarea2">코멘트</label>
    </div>
    <div class="mybtns">
      <button onclick="posting()" type="button" class="btn btn-dark">기록하기</button>
      <button onclick="close_box()" type="button" class="btn btn-outline-dark">닫기</button>
    </div>
  </div>
  <div class="mycards">
    <div class="row row-cols-1 row-cols-md-4 g-4" id="cards-box">
      <div class="col">
        <div class="card h-100">
          <img src="https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg"
            class="card-img-top">
          <div class="card-body">
            <h5 class="card-title">영화 제목이 들어갑니다</h5>
            <p class="card-text">여기에 영화에 대한 설명이 들어갑니다.</p>
            <p>⭐⭐⭐</p>
            <p class="mycomment">나의 한줄 평을 씁니다</p>
          </div>
        </div>
      </div>
      <div class="col">
        <div class="card h-100">
          <img src="https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg"
            class="card-img-top">
          <div class="card-body">
            <h5 class="card-title">영화 제목이 들어갑니다</h5>
            <p class="card-text">여기에 영화에 대한 설명이 들어갑니다.</p>
            <p>⭐⭐⭐</p>
            <p class="mycomment">나의 한줄 평을 씁니다</p>
          </div>
        </div>
      </div>
      <div class="col">
        <div class="card h-100">
          <img src="https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg"
            class="card-img-top">
          <div class="card-body">
            <h5 class="card-title">영화 제목이 들어갑니다</h5>
            <p class="card-text">여기에 영화에 대한 설명이 들어갑니다.</p>
            <p>⭐⭐⭐</p>
            <p class="mycomment">나의 한줄 평을 씁니다</p>
          </div>
        </div>
      </div>
      <div class="col">
        <div class="card h-100">
          <img src="https://movie-phinf.pstatic.net/20210728_221/1627440327667GyoYj_JPEG/movie_image.jpg"
            class="card-img-top">
          <div class="card-body">
            <h5 class="card-title">영화 제목이 들어갑니다</h5>
            <p class="card-text">여기에 영화에 대한 설명이 들어갑니다.</p>
            <p>⭐⭐⭐</p>
            <p class="mycomment">나의 한줄 평을 씁니다</p>
          </div>
        </div>
      </div>
    </div>
  </div>
</body>

</html>






취소
 공유
취소
댓글 0
댓글 알림
나의얼굴