개인공부

개발공부 14일차[API연동 / Flask]

stella0905 2023. 2. 7. 23:10

일단 오늘 블로그를 쓰기에 앞서 아직 이해를 못했다..

너무 어렵다 ..

웹개발 종합반 4주차는 한 10번은 들어야 이해를 할까 싶다....어쩌면 정리한다고 이미 4주차는 2~3회독 했을지도..

 

api 요청 → request

요청에 대한 api응답 → response

 

 

서버만들기

  1. 폴더를 만든다.
  2. app.py라는 파일을 만든다.
  3. 터미널을 생성한다.
  4. 가상환경을 잡는다. (가상환경 : 프로젝트 별로 라이브러리를 담아두는 통)
    python3 -m venv venv
  5. 오른쪽 하단에 3.9.6-bit를 눌러서 ‘venv’:venv로 만들어야함
  6. 새터미널 열어주기
  7. 새폴더 생성 templater
  8. templates 에 새파일로 index.html 만들기
  9. 원하는 프레임워크 깔아주기
    pip install flack pymongo dnspython requests bs4

GET 요청

  • 통상적으로 데이터 조회(Read)를 요청할 때 사용한다.→ 데이터 전달 : URL 뒤에 물음표를 붙여 key=value로 전달
  • 예) 영화 목록 조회

POST요청

  • 통상적으로 데이터 생성(Create), 변경(Update), 삭제(Delete)요청 할 때 사용한다.→ 데이터 전달 : 바로 보이지 않는 HTML
  • 예) 회원가입, 회원탈퇴, 비밀번호 수정

불러오는 기능과 저장하는 기능을 만들때 저장하는 기능을 먼저해야 불러오는 기능을할때 잘 되고 있는지 확인 가능하다.

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

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

@app.route("/mars", methods=["POST"])
def movie_post():
    sample_receive = request.form['sample_give']
    print(sample_receive)
    return jsonify({'msg':'POST 연결 완료!'})

@app.route("/mars", methods=["GET"])
def movie_get():
    return jsonify({'msg':'GET 연결 완료!'})

if __name__ == '__main__':
    app.run('0.0.0.0', port=5000, debug=True)
    <script>
        $(document).ready(function () {
            show_order();
        });
        function show_order() {
            fetch('/mars').then((res) => res.json()).then((data) => {
                console.log(data)
                alert(data['msg'])
            })
        }
        function save_order() {
            let formData = new FormData();
            formData.append("sample_give", "샘플데이터");

            fetch('/mars', { method: "POST", body: formData }).then((res) => res.json()).then((data) => {
                console.log(data);
                alert(data["msg"]);
            });
        }
    </script>

강의때 뼈대로 제공된 기본 툴 내용이다.

POST

  1. 데이터 명세
    잘 연결됬는지 확인하기
  2. 클라이언트와 서버 연결 확인하기
    1. 어떤버튼에 들어가있는지 확인하기
    2. 주문하기 버튼에 save_order라고 적혀 있는걸 확인
    3. let formData = new FormData(); formData.append("sample_give", "샘플데이터");fetch('/mars', → fetch 이름이 mars
    4. sample_give라는 이름으로 fetch값을 통해 백엔드로 정보를 보냄
    5. app.py 파이썬 파일에 @app.route(”/mars” 라는 값으로 정보가 들어옴
    6. app.py파일의 sample_receive = request.form['sample_give'] sample_give가 값을 찾을꺼임
    7. sample_receive = “샘플데이터”가 되는거임
    8. print(sample_receive) →”샘플데이터를 찍고
    9. return jsonify({'msg':'POST 연결 완료!'}) →POST 연결 완료! 라는 메세지를 찍어줌
    10. 백엔드 부분에서 저장이되면 자바스크립트로 다시 보내져서 data값에 {'msg':'POST 연결 완료!'}가 들어감.
  3. 서버부터 만들기
    1. 서버를 받을땐name_receive = request.form['name_give'] address_receive = request.form['address_give'] size_receive = request.form['size_give'] 로 변경 해준다.
    2. sample_receive = request.form['sample_give'] 를
    3. mongoDB에 넣기 위해
    4. from pymongo import MongoClient client = MongoClient('mongodb+srv://sparta:test@cluster0.wpply3w.mongodb.net/?retryWrites=true&w=majority') db = client.dbsparta 를 넣어줌
    5. 데이터를 넣기 위해
    6. doc = { 'name':name_receive, →name이라는 키에 name_receive를 넣어줌 'address':address_receive, 'size':size_receive } db.mars.insert_one(doc) 를 넣어줌
  4. 서버가 해야할일 - name, address,size를 받아서 DB에 넣어주기
  5. 클라이언트 만들기
    1. 이름에 대한 input값, 주소에대한 Input값, 평수값을 담아서 넘겨줌
    2. 값을 가지고온다. (jqury 사용)
    3. let name = $("#name").val(); let address = $("#address").val(); let size = $("#size").val();
    4. name, address, size로 값을 줘야하기 때문에
    5. formData.append("sample_give", "샘플데이터");값도 formData.append("name_give", name);
      formData.append("address_give", address); formData.append("size_give", size); 변경된 값으로 넣어준다
  6. 완성 확인하기
    웹페이지에서 값을 입력 후 저장을 했을때 적었던 값을 비우는 방법
    window.location.reload()

 

GET

  1. 클라이언트에서 페이지가 로딩이되면 어떤게 불리는지 찾는다.
    $(document).ready(function () {
           show_order();
       });
    1. 페이지가 로딩됬을때 show_order() 불린다.
    2. fetch(/’mars’) → /mars라고 하는 백엔드 API에 전달
  2. 파이썬에 가서 확인하기.
    get 연결 완료 라고 알려주고 있음
  3. 자바스크립트 data값으로 들어감.
  4. 일단 data를 다 가지고 와야하기 때문에 리턴위에
    mars_data = list(db.mars.find({},{'_id':False}))
    return jsonify({'result':mars_data}) 적어준다.
    → DB에서 모든 데이터를 다 가지고와서 클라이언트로 내려주는 거임
  5. 리스트를 받기
  6. index.html 파일에 let rows = data[’result’] 를 적어준다.
  7. 반복문으로 데이터를 돌려서 보여줌.
    rows.forEach((a) ⇒{
        let name = a["name"];                                                    →let name에 a안에 name값을 담는다.
        let address = a["address"];
        let size = a["size"];
        let temp_html = <tr>
                                            <td>${name}</td>
                                           <td>${address}</td>
                                            <td>${size}</td>
                                           </tr>;
        $('#order-box').append(temp_html)
    })

위내용 결과코드 

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

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

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

@app.route("/mars", methods=["POST"])
def movie_post():
    name_receive = request.form['name_give']
    address_receive = request.form['address_give']
    size_receive = request.form['size_give']

    doc = {
        'name':name_receive,
        'address':address_receive,
        'size':size_receive
    }
    db.mars.insert_one(doc)

    return jsonify({'msg':'저장완료!'})

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

if __name__ == '__main__':
    app.run('0.0.0.0', port=5001, debug=True)
<script>
      $(document).ready(function () {
        show_order();
      });
      function show_order() {
        fetch("/mars")
          .then((res) => res.json())
          .then((data) => {
            let rows = data["result"];
            $('#order-box').empty()
            rows.forEach((a) => {
              let name = a["name"];
              let address = a["address"];
              let size = a["size"];
              let temp_html = `<tr>
                                <td>${name}</td>
                                <td>${address}</td>
                                <td>${size}</td>
                              </tr>`;
              $('#order-box').append(temp_html)
            });
          });
      }
      function save_order() {
        let name = $("#name").val();
        let address = $("#address").val();
        let size = $("#size").val();

        let formData = new FormData();
        formData.append("name_give", name);
        formData.append("address_give", address);
        formData.append("size_give", size);

        fetch("/mars", { method: "POST", body: formData })
          .then((res) => res.json())
          .then((data) => {
            alert(data["msg"]);
            window.location.reload();
          });
      }
    </script>
  </head>

  <body>
    <div class="mask"></div>
    <div class="order">
      <h1>화성에 땅 사놓기!</h1>
      <h3>가격: 평 당 500원</h3>
      <p>
        화성에 땅을 사둘 수 있다고?<br />
        앞으로 백년 간 오지 않을 기회. 화성에서 즐기는 노후!
      </p>
      <div class="order-info">
        <div class="input-group mb-3">
          <span class="input-group-text">이름</span>
          <input id="name" type="text" class="form-control" />
        </div>
        <div class="input-group mb-3">
          <span class="input-group-text">주소</span>
          <input id="address" type="text" class="form-control" />
        </div>
        <div class="input-group mb-3">
          <label class="input-group-text" for="size">평수</label>
          <select class="form-select" id="size">
            <option selected>-- 주문 평수 --</option>
            <option value="10평">10평</option>
            <option value="20평">20평</option>
            <option value="30평">30평</option>
            <option value="40평">40평</option>
            <option value="50평">50평</option>
          </select>
        </div>
        <button
          onclick="save_order()"
          type="button"
          class="btn btn-warning mybtn"
        >
          주문하기
        </button>
      </div>
      <table class="table">
        <thead>
          <tr>
            <th scope="col">이름</th>
            <th scope="col">주소</th>
            <th scope="col">평수</th>
          </tr>
        </thead>
        <tbody id="order-box">
          <tr>
            <td>홍길동</td>
            <td>서울시 용산구</td>
            <td>20평</td>
          </tr>
          <tr>
            <td>임꺽정</td>
            <td>부산시 동구</td>
            <td>10평</td>
          </tr>
          <tr>
            <td>세종대왕</td>
            <td>세종시 대왕구</td>
            <td>30평</td>
          </tr>
        </tbody>
      </table>
    </div>
  </body>
</html>

조각기능구현 / 크롤링

1. 썸네일 사진 - og:image

2. 썸네일 제목 - og:title

3. 썸네일 설명 - og:description

 

크롤링 하는방법 

import requests
from bs4 import BeautifulSoup

url = 'https://movie.naver.com/movie/bi/mi/basic.naver?code=191597'

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)

soup = BeautifulSoup(data.text, 'html.parser')

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

meta[property="og:title"] → meta안에 property="og:title"를 가져올 수 있음

 

 

오늘 진짜 뭔 말인지도 모르고 하루를 다 써버렸다 이게 말인가..? 3주차 까지는 그래도 한번 더 듣고 몇번 들으면 이해가됬는데 이건 뭐.. 에..?이게 왜..?또 이러고 있다 오전에 강의를 시작하고.. 오후에 끝나고 블로그를 쓰는 지금까지도 오늘 들은게 이해가 안된다..ㅎ..

아직 2번의 연습이 있다고 했고 .. 남자친구도 지금 당장 꼭 이해를 하고 넘어갈 필요없다 그냥 일단 지나가고 나주에 또 사용할때 해보면 된다 라고 하지만.. 

난...ㅠㅠ 이해하고싶다고...!!!!!!!!왜 저기에 저건지는..!!!!!!!!!!