-
개발공부 14일차[API연동 / Flask]개인공부 2023. 2. 7. 23:10
일단 오늘 블로그를 쓰기에 앞서 아직 이해를 못했다..
너무 어렵다 ..
웹개발 종합반 4주차는 한 10번은 들어야 이해를 할까 싶다....어쩌면 정리한다고 이미 4주차는 2~3회독 했을지도..
api 요청 → request
요청에 대한 api응답 → response
서버만들기
- 폴더를 만든다.
- app.py라는 파일을 만든다.
- 터미널을 생성한다.
- 가상환경을 잡는다. (가상환경 : 프로젝트 별로 라이브러리를 담아두는 통)
python3 -m venv venv - 오른쪽 하단에 3.9.6-bit를 눌러서 ‘venv’:venv로 만들어야함
- 새터미널 열어주기
- 새폴더 생성 templater
- templates 에 새파일로 index.html 만들기
- 원하는 프레임워크 깔아주기
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
- 데이터 명세
잘 연결됬는지 확인하기 - 클라이언트와 서버 연결 확인하기
- 어떤버튼에 들어가있는지 확인하기
- 주문하기 버튼에 save_order라고 적혀 있는걸 확인
- let formData = new FormData(); formData.append("sample_give", "샘플데이터");fetch('/mars', → fetch 이름이 mars
- sample_give라는 이름으로 fetch값을 통해 백엔드로 정보를 보냄
- app.py 파이썬 파일에 @app.route(”/mars” 라는 값으로 정보가 들어옴
- app.py파일의 sample_receive = request.form['sample_give'] sample_give가 값을 찾을꺼임
- sample_receive = “샘플데이터”가 되는거임
- print(sample_receive) →”샘플데이터를 찍고
- return jsonify({'msg':'POST 연결 완료!'}) →POST 연결 완료! 라는 메세지를 찍어줌
- 백엔드 부분에서 저장이되면 자바스크립트로 다시 보내져서 data값에 {'msg':'POST 연결 완료!'}가 들어감.
- 서버부터 만들기
- 서버를 받을땐name_receive = request.form['name_give'] address_receive = request.form['address_give'] size_receive = request.form['size_give'] 로 변경 해준다.
- sample_receive = request.form['sample_give'] 를
- mongoDB에 넣기 위해
- from pymongo import MongoClient client = MongoClient('mongodb+srv://sparta:test@cluster0.wpply3w.mongodb.net/?retryWrites=true&w=majority') db = client.dbsparta 를 넣어줌
- 데이터를 넣기 위해
- doc = { 'name':name_receive, →name이라는 키에 name_receive를 넣어줌 'address':address_receive, 'size':size_receive } db.mars.insert_one(doc) 를 넣어줌
- 서버가 해야할일 - name, address,size를 받아서 DB에 넣어주기
- 클라이언트 만들기
- 이름에 대한 input값, 주소에대한 Input값, 평수값을 담아서 넘겨줌
- 값을 가지고온다. (jqury 사용)
- let name = $("#name").val(); let address = $("#address").val(); let size = $("#size").val();
- name, address, size로 값을 줘야하기 때문에
- formData.append("sample_give", "샘플데이터");값도 formData.append("name_give", name);
formData.append("address_give", address); formData.append("size_give", size); 변경된 값으로 넣어준다
- 완성 확인하기
웹페이지에서 값을 입력 후 저장을 했을때 적었던 값을 비우는 방법
window.location.reload()
GET
- 클라이언트에서 페이지가 로딩이되면 어떤게 불리는지 찾는다.
$(document).ready(function () {
show_order();
});- 페이지가 로딩됬을때 show_order() 불린다.
- fetch(/’mars’) → /mars라고 하는 백엔드 API에 전달
- 파이썬에 가서 확인하기.
get 연결 완료 라고 알려주고 있음 - 자바스크립트 data값으로 들어감.
- 일단 data를 다 가지고 와야하기 때문에 리턴위에
mars_data = list(db.mars.find({},{'_id':False}))
return jsonify({'result':mars_data}) 적어준다.
→ DB에서 모든 데이터를 다 가지고와서 클라이언트로 내려주는 거임 - 리스트를 받기
- index.html 파일에 let rows = data[’result’] 를 적어준다.
- 반복문으로 데이터를 돌려서 보여줌.
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번의 연습이 있다고 했고 .. 남자친구도 지금 당장 꼭 이해를 하고 넘어갈 필요없다 그냥 일단 지나가고 나주에 또 사용할때 해보면 된다 라고 하지만..
난...ㅠㅠ 이해하고싶다고...!!!!!!!!왜 저기에 저건지는..!!!!!!!!!!
'개인공부' 카테고리의 다른 글
개발공부 16일차[API연동 / Flask / 혼자서 다시 해보기!] (0) 2023.02.09 개발공부 15일차[API연동 / Flask/ 배포] (0) 2023.02.08 개발공부 13일차 [웹스크래핑(크롤링), DB] (0) 2023.02.07 개발공부 12일차 [JavaScript 복습, python] (0) 2023.02.05 개발공부 11일차 [Jabascript, JQuery, Fetch] (0) 2023.02.05