스파르타코딩클럽 웹개발 왕초보 종합반 5주차 정리!
5-1 5주차 파일설치
- 파일질라(filezilla) 다운로드 가장 왼쪽에 있는 무료버전
- 도메인 구매하기는 가비아에서 구매하는것을 추천했지만 호스팅kr에서도 구매할 수 있다.
5-2 5주차 배울것
5주차에는 미니프로젝트와 그동안 했던 것들을 복습하고, 만든 프로젝트들을 클라우드라고 불리우는 가상의 컴퓨터를 사서 우리가 만든 코드들을 올리고 남들이 볼 수 있게 만드는 것을 할 예정!
5-3 [무비스타] – 프로젝트 세팅
프로젝트 세팅하기 !!
- 파이참 상단 File → New Project 누르고 sparta 폴더 → projects 폴더 → moviestar폴더를 선택 한 후 Create버튼을 눌러준다. (4주차 개발일지 4-3, 4-6, 4-10을 참조)
- New Project 가 생성완료되면 밑에 단계를 실행해서 폴더 기본 세팅을 해준다.
- app.py 파일을 만든다.
- static, templates 라는 폴더를 만든다.
- templates 폴더 안에 index.html이라는 html파일을 만든다.
- alt+ctrl+s 를눌러 Settings을 실행 후 Python Interpreter에서 ‘ flask ‘, ‘ pymongo ‘, ‘ requests ‘, ‘ bs4 ‘ 총 4가지 패키지를 다운받아 설치한다. (3주차 개발일지 3-6 참고)
5-4 [무비스타] – DB만들기 (데이터쌓기)
크롤링 파일만들기 ! (만드는데 시간이 많이 소비되므로 미리 만들어 놓은 코드를 스파르타에서 제공해주셨습니다.
moviestar폴더에 init_db 라는 파이썬 파일을 만든뒤, 아래 코드를 붙여넣기 한 후 run을 하면 크롤링이 된다.
import requests from bs4 import BeautifulSoup from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client.dbsparta # DB에 저장할 영화인들의 출처 url을 가져옵니다. def get_urls(): 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('https://movie.naver.com/movie/sdb/rank/rpeople.nhn', headers=headers) soup = BeautifulSoup(data.text, 'html.parser') trs = soup.select('#old_content > table > tbody > tr') urls = [] for tr in trs: a = tr.select_one('td.title > a') if a is not None: base_url = 'https://movie.naver.com/' url = base_url + a['href'] urls.append(url) return urls # 출처 url로부터 영화인들의 사진, 이름, 최근작 정보를 가져오고 mystar 콜렉션에 저장합니다. def insert_star(url): 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') name = soup.select_one('#content > div.article > div.mv_info_area > div.mv_info.character > h3 > a').text img_url = soup.select_one('#content > div.article > div.mv_info_area > div.poster > img')['src'] recent_work = soup.select_one( '#content > div.article > div.mv_info_area > div.mv_info.character > dl > dd > a:nth-child(1)').text doc = { 'name': name, 'img_url': img_url, 'recent': recent_work, 'url': url, 'like': 0 } db.mystar.insert_one(doc) print('완료!', name) # 기존 mystar 콜렉션을 삭제하고, 출처 url들을 가져온 후, 크롤링하여 DB에 저장합니다. def insert_all(): db.mystar.drop() # mystar 콜렉션을 모두 지워줍니다. urls = get_urls() for url in urls: insert_star(url) ### 실행하기 insert_all()
5-5 [무비스타] – 뼈대 준비하기
데이터도 쌓았고, 뼈대를 준비해보자. 아래 코드를 복사하여 index.html에 붙여넣기 한다. (스파르타 제공) <!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>마이 페이보릿 무비스타 | 프론트-백엔드 연결 마지막 예제!</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.8.0/css/bulma.min.css"/>
<script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script>
<style>
.center {
text-align: center;
}
.star-list {
width: 500px;
margin: 20px auto 0 auto;
}
.star-name {
display: inline-block;
}
.star-name:hover {
text-decoration: underline;
}
.card {
margin-bottom: 15px;
}
</style>
<script>
$(document).ready(function () {
showStar();
});
function showStar() {
$.ajax({
type: 'GET',
url: '/api/list?sample_give=샘플데이터',
data: {},
success: function (response) {
alert(response['msg']);
}
});
}
function likeStar(name) {
$.ajax({
type: 'POST',
url: '/api/like',
data: {sample_give:'샘플데이터'},
success: function (response) {
alert(response['msg']);
}
});
}
function deleteStar(name) {
$.ajax({
type: 'POST',
url: '/api/delete',
data: {sample_give:'샘플데이터'},
success: function (response) {
alert(response['msg']);
}
});
}
</script>
</head>
<body>
<section class="hero is-warning">
<div class="hero-body">
<div class="container center">
<h1 class="title">
마이 페이보릿 무비스타😆
</h1>
<h2 class="subtitle">
순위를 매겨봅시다
</h2>
</div>
</div>
</section>
<div class="star-list" id="star-box">
<div class="card">
<div class="card-content">
<div class="media">
<div class="media-left">
<figure class="image is-48x48">
<img
src="https://search.pstatic.net/common/?src=https%3A%2F%2Fssl.pstatic.net%2Fsstatic%2Fpeople%2Fportrait%2F201807%2F20180731143610623-6213324.jpg&type=u120_150&quality=95"
alt="Placeholder image"
/>
</figure>
</div>
<div class="media-content">
<a href="#" target="_blank" class="star-name title is-4">김다미 (좋아요: 3)</a>
<p class="subtitle is-6">안녕, 나의 소울메이트(가제)</p>
</div>
</div>
</div>
<footer class="card-footer">
<a href="#" onclick="likeStar('김다미')" class="card-footer-item has-text-info">
위로!
<span class="icon">
<i class="fas fa-thumbs-up"></i>
</span>
</a>
<a href="#" onclick="deleteStar('김다미')" class="card-footer-item has-text-danger">
삭제
<span class="icon">
<i class="fas fa-ban"></i>
</span>
</a>
</footer>
</div>
</div>
</body>
</html>
from pymongo import MongoClient
from flask import Flask, render_template, jsonify, request
app = Flask(__name__)
client = MongoClient('localhost', 27017)
db = client.dbsparta
# HTML 화면 보여주기
@app.route('/')
def home():
return render_template('index.html')
# API 역할을 하는 부분
@app.route('/api/list', methods=['GET'])
def show_stars():
sample_receive = request.args.get('sample_give')
print(sample_receive)
return jsonify({'msg': 'list 연결되었습니다!'})
@app.route('/api/like', methods=['POST'])
def like_star():
sample_receive = request.form['sample_give']
print(sample_receive)
return jsonify({'msg': 'like 연결되었습니다!'})
@app.route('/api/delete', methods=['POST'])
def delete_star():
sample_receive = request.form['sample_give']
print(sample_receive)
return jsonify({'msg': 'delete 연결되었습니다!'})
if __name__ == '__main__':
app.run('0.0.0.0', port=5000, debug=True)
5-6 [무비스타] – GET연습(보여주기)
1. 클라이언트와 서버 연결 확인하기 2. 서버 만들기 (파이썬) 3. 클라이언트 만들기 (html) 4. 완성 확인하기from pymongo import MongoClient from flask import Flask, render_template, jsonify, request app = Flask(__name__) client = MongoClient('localhost', 27017) db = client.dbsparta # HTML 화면 보여주기 @app.route('/') def home(): return render_template('index.html') # API 역할을 하는 부분 @app.route('/api/list', methods=['GET']) def show_stars(): movie_star = list(db.mystar.find({}, {'_id': False}).sort('like',-1)) return jsonify({'movie_stars': movie_star}) @app.route('/api/like', methods=['POST']) def like_star(): sample_receive = request.form['sample_give'] print(sample_receive) return jsonify({'msg': 'like 연결되었습니다!'}) @app.route('/api/delete', methods=['POST']) def delete_star(): sample_receive = request.form['sample_give'] print(sample_receive) return jsonify({'msg': 'delete 연결되었습니다!'}) if __name__ == '__main__': app.run('0.0.0.0', port=5000, debug=True)
<!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>마이 페이보릿 무비스타 | 프론트-백엔드 연결 마지막 예제!</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.8.0/css/bulma.min.css"/> <script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script> <style> .center { text-align: center; } .star-list { width: 500px; margin: 20px auto 0 auto; } .star-name { display: inline-block; } .star-name:hover { text-decoration: underline; } .card { margin-bottom: 15px; } </style> <script> $(document).ready(function () { showStar(); }); function showStar() { $.ajax({ type: 'GET', url: '/api/list?sample_give=샘플데이터', data: {}, success: function (response) { let mystars = response['movie_stars'] console.log(mystars) for (let i = 0; i < mystars.length; i++) { let name = mystars[i]['name'] let img_url = mystars[i]['img_url'] let recent = mystars[i]['recent'] let url = mystars[i]['url'] let like = mystars[i]['like'] let temp_html = `<div class="card"> <div class="card-content"> <div class="media"> <div class="media-left"> <figure class="image is-48x48"> <img src="${img_url}" alt="Placeholder image" /> </figure> </div> <div class="media-content"> <a href="${url}" target="_blank" class="star-name title is-4">${name} (좋아요 : ${like})</a> <p class="subtitle is-6">${recent}</p> </div> </div> </div> <footer class="card-footer"> <a href="#" onclick="likeStar('${name}')" class="card-footer-item has-text-info"> 위로! <span class="icon"> <i class="fas fa-thumbs-up"></i> </span> </a> <a href="#" onclick="deleteStar('${name}')" class="card-footer-item has-text-danger"> 삭제 <span class="icon"> <i class="fas fa-ban"></i> </span> </a> </footer> </div>` $('#star-box').append(temp_html); } } }); } function likeStar(name) { $.ajax({ type: 'POST', url: '/api/like', data: {sample_give:'샘플데이터'}, success: function (response) { alert(response['msg']); } }); } function deleteStar(name) { $.ajax({ type: 'POST', url: '/api/delete', data: {sample_give:'샘플데이터'}, success: function (response) { alert(response['msg']); } }); } </script> </head> <body> <section class="hero is-warning"> <div class="hero-body"> <div class="container center"> <h1 class="title"> 마이 페이보릿 무비스타😆 </h1> <h2 class="subtitle"> 순위를 매겨봅시다 </h2> </div> </div> </section> <div class="star-list" id="star-box"> <div class="card"> <div class="card-content"> <div class="media"> <div class="media-left"> <figure class="image is-48x48"> <img src="https://search.pstatic.net/common/?src=https%3A%2F%2Fssl.pstatic.net%2Fsstatic%2Fpeople%2Fportrait%2F201807%2F20180731143610623-6213324.jpg&type=u120_150&quality=95" alt="Placeholder image" /> </figure> </div> <div class="media-content"> <a href="#" target="_blank" class="star-name title is-4">김다미 (좋아요: 3)</a> <p class="subtitle is-6">안녕, 나의 소울메이트(가제)</p> </div> </div> </div> <footer class="card-footer"> <a href="#" onclick="likeStar('김다미')" class="card-footer-item has-text-info"> 위로! <span class="icon"> <i class="fas fa-thumbs-up"></i> </span> </a> <a href="#" onclick="deleteStar('김다미')" class="card-footer-item has-text-danger"> 삭제 <span class="icon"> <i class="fas fa-ban"></i> </span> </a> </footer> </div> </div> </body> </html>
5-7 [무비스타] – POST연습(좋아요+1)
1. 클라이언트와 서버 연결 확인하기 2. 서버 만들기 (파이썬) 3. 클라이언트 만들기 (html) 4. 완성 확인하기 ※핵심※ 이름을 받아서 이름의 좋아요 값을 찾은 후 그 좋아요 값에 1을 더해서 업데이트 해주면 된다.from pymongo import MongoClient from flask import Flask, render_template, jsonify, request app = Flask(__name__) client = MongoClient('localhost', 27017) db = client.dbsparta # HTML 화면 보여주기 @app.route('/') def home(): return render_template('index.html') # API 역할을 하는 부분 @app.route('/api/list', methods=['GET']) def show_stars(): movie_star = list(db.mystar.find({}, {'_id': False}).sort('like',-1)) return jsonify({'movie_stars': movie_star}) @app.route('/api/like', methods=['POST']) def like_star(): name_receive = request.form['name_give'] target_star = db.mystar.find_one({'name': name_receive}) current_like = target_star['like'] new_like = current_like + 1 db.mystar.update_one({'name': name_receive}, {'$set': {'like': new_like}}) return jsonify({'msg': '좋아요 완료!'}) @app.route('/api/delete', methods=['POST']) def delete_star(): sample_receive = request.form['sample_give'] print(sample_receive) return jsonify({'msg': 'delete 연결되었습니다!'}) if __name__ == '__main__': app.run('0.0.0.0', port=5000, debug=True)
<!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>마이 페이보릿 무비스타 | 프론트-백엔드 연결 마지막 예제!</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.8.0/css/bulma.min.css"/> <script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script> <style> .center { text-align: center; } .star-list { width: 500px; margin: 20px auto 0 auto; } .star-name { display: inline-block; } .star-name:hover { text-decoration: underline; } .card { margin-bottom: 15px; } </style> <script> $(document).ready(function () { showStar(); }); function showStar() { $.ajax({ type: 'GET', url: '/api/list?sample_give=샘플데이터', data: {}, success: function (response) { let mystars = response['movie_stars'] console.log(mystars) for (let i = 0; i < mystars.length; i++) { let name = mystars[i]['name'] let img_url = mystars[i]['img_url'] let recent = mystars[i]['recent'] let url = mystars[i]['url'] let like = mystars[i]['like'] let temp_html = `<div class="card"> <div class="card-content"> <div class="media"> <div class="media-left"> <figure class="image is-48x48"> <img src="${img_url}" alt="Placeholder image" /> </figure> </div> <div class="media-content"> <a href="${url}" target="_blank" class="star-name title is-4">${name} (좋아요 : ${like})</a> <p class="subtitle is-6">${recent}</p> </div> </div> </div> <footer class="card-footer"> <a href="#" onclick="likeStar('${name}')" class="card-footer-item has-text-info"> 위로! <span class="icon"> <i class="fas fa-thumbs-up"></i> </span> </a> <a href="#" onclick="deleteStar('${name}')" class="card-footer-item has-text-danger"> 삭제 <span class="icon"> <i class="fas fa-ban"></i> </span> </a> </footer> </div>` $('#star-box').append(temp_html); } } }); } function likeStar(name) { $.ajax({ type: 'POST', url: '/api/like', data: {name_give:name}, success: function (response) { alert(response['msg']); window.location.reload(); } }); } function deleteStar(name) { $.ajax({ type: 'POST', url: '/api/delete', data: {sample_give:'샘플데이터'}, success: function (response) { alert(response['msg']); } }); } </script> </head> <body> <section class="hero is-warning"> <div class="hero-body"> <div class="container center"> <h1 class="title"> 마이 페이보릿 무비스타😆 </h1> <h2 class="subtitle"> 순위를 매겨봅시다 </h2> </div> </div> </section> <div class="star-list" id="star-box"> </div> </body> </html>
5-8 [무비스타] – POST연습(삭제하기)
from pymongo import MongoClient from flask import Flask, render_template, jsonify, request app = Flask(__name__) client = MongoClient('localhost', 27017) db = client.dbsparta # HTML 화면 보여주기 @app.route('/') def home(): return render_template('index.html') # API 역할을 하는 부분 @app.route('/api/list', methods=['GET']) def show_stars(): movie_star = list(db.mystar.find({}, {'_id': False}).sort('like',-1)) return jsonify({'movie_stars': movie_star}) @app.route('/api/like', methods=['POST']) def like_star(): name_receive = request.form['name_give'] target_star = db.mystar.find_one({'name': name_receive}) current_like = target_star['like'] new_like = current_like + 1 db.mystar.update_one({'name': name_receive}, {'$set': {'like': new_like}}) return jsonify({'msg': '좋아요 완료!'}) @app.route('/api/delete', methods=['POST']) def delete_star(): name_receive = request.form['name_give'] db.mystar.delete_one({'name': name_receive}) return jsonify({'msg': '삭제 완료!'}) if __name__ == '__main__': app.run('0.0.0.0', port=5000, debug=True)
<!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>마이 페이보릿 무비스타 | 프론트-백엔드 연결 마지막 예제!</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.8.0/css/bulma.min.css"/> <script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script> <style> .center { text-align: center; } .star-list { width: 500px; margin: 20px auto 0 auto; } .star-name { display: inline-block; } .star-name:hover { text-decoration: underline; } .card { margin-bottom: 15px; } </style> <script> $(document).ready(function () { showStar(); }); function showStar() { $.ajax({ type: 'GET', url: '/api/list?sample_give=샘플데이터', data: {}, success: function (response) { let mystars = response['movie_stars'] console.log(mystars) for (let i = 0; i < mystars.length; i++) { let name = mystars[i]['name'] let img_url = mystars[i]['img_url'] let recent = mystars[i]['recent'] let url = mystars[i]['url'] let like = mystars[i]['like'] let temp_html = `<div class="card"> <div class="card-content"> <div class="media"> <div class="media-left"> <figure class="image is-48x48"> <img src="${img_url}" alt="Placeholder image" /> </figure> </div> <div class="media-content"> <a href="${url}" target="_blank" class="star-name title is-4">${name} (좋아요 : ${like})</a> <p class="subtitle is-6">${recent}</p> </div> </div> </div> <footer class="card-footer"> <a href="#" onclick="likeStar('${name}')" class="card-footer-item has-text-info"> 위로! <span class="icon"> <i class="fas fa-thumbs-up"></i> </span> </a> <a href="#" onclick="deleteStar('${name}')" class="card-footer-item has-text-danger"> 삭제 <span class="icon"> <i class="fas fa-ban"></i> </span> </a> </footer> </div>` $('#star-box').append(temp_html); } } }); } function likeStar(name) { $.ajax({ type: 'POST', url: '/api/like', data: {name_give:name}, success: function (response) { alert(response['msg']); window.location.reload(); } }); } function deleteStar(name) { $.ajax({ type: 'POST', url: '/api/delete', data: {name_give:name}, success: function (response) { alert(response['msg']); window.location.reload(); } }); } </script> </head> <body> <section class="hero is-warning"> <div class="hero-body"> <div class="container center"> <h1 class="title"> 마이 페이보릿 무비스타😆 </h1> <h2 class="subtitle"> 순위를 매겨봅시다 </h2> </div> </div> </section> <div class="star-list" id="star-box"> </div> </body> </html>
5-9 내 프로젝트를 서버에 올리기
내가 만든 코드를 남들이 볼 수 있게 만드는 작업! 어떤 컴퓨터도 서버가 될 수 있다. 서버는 항상 켜져있는 상태에서 프로그램이 실행되어야 하고, 모두가 접근 할 수 있는 IP주소로 내 웹 서비스로 접근할 수 있도록 해야한다. 보안상의 이유로 내가 사용하는 컴퓨터로 하진 않고, 클라우드 환경의 서버를 사서 이용한다. AWS에 가입한다.
5-10 AWS 서버 구매하기
EC2 서버구매하기
- 리전이 서울인지 확인!
- 인스턴스 시작 클릭
- 리눅스 우분투 18.04 구매! (Ubuntu Server 18.04 LTS (HVM), SSD Volume Type)
5-11 서버 세팅하기
파일질라(filezilla)를 통해 간단한 python파일을 올려보자! 52.79.151.5
5-12 flask 서버 실행해보기
5-13 AWS에서 포트 열어주기
5-14 원페이지 쇼핑몰 업로드 해보기
Robo3T를 이용해서 내컴퓨터에서 서버에 있는 mongoDB에 접속하기
5-15 포트포워딩
5-16 nohup 설정하기
5-17 도메인 구입하기
5-18 og태그
nohup 강제종류 후 다시 실행해야함.
5-18 5주차 끝 & 숙제