1주차 할 일
이론 복습
클라이언트 : 요청을 하는 쪽(브라우저, 핸드폰)
서버 : 요청을 받는 쪽(API라는 창구를 통해서 클라이언트와 소통한다.)
(은행 창구처럼 정해진 규칙이 있다. -> 입출력을 하고 싶으면 입출력 창구를 가야 하고 주민등록증이 필요한 것을 의미)
그런 규칙들로 요청을 받으면 HTML, CSS, JS를 가져다가 돌려서 돌려주기도 하고 DB를 거쳐서 데이터를 돌려주기도 했다. / JSON 형태(딕셔너리+리스트 형태)로 값을 돌려준다.
서버는 특수한 컴퓨터가 아니다!
- 서버는 컴퓨터의 역할일 뿐이다. 사람도 투잡을 할 수 있는 것처럼 컴퓨터도 여러 역할을 맡을 수 있다.
DB도 돌리고, 서버도 돌리고, 게임도 하고!
- 서버는 요청을 받으면 HTML + CSS + JavaScript 파일을 주기도 하고, JSON 형식으로 데이터를 주기도 한다.
- JSON 형식으로 생긴 데이터 예시
API란?
- 서버가 요청을 받기 위해서 뚫어놓은 '창구'이다.
- 요청에는 POST(주로 데이터를 수정 할 때), GET(주로 데이터를 가져올 때) 등 여러가지 타입이 있다.
HTML, CSS, JS는 각각 어떤 역할을 할까?
- HTML은 뼈대 / CSS는 꾸미기 / JavaScript는 움직이게 하는 것
- CSS를 꾸밀 때는 이름표를 붙여주고(class="클래스명"), <style></style> 안에 .클래스명으로 사용한다.
JQuery는 어떤 친구였죠??
- JQuery는 JavaScript의 라이브러리로써, HTML 조작을 쉽게 하는 친구
- 라이브러리는 남이 만들어 놓은 갖다쓰기 좋은 코드! 그렇기에 임포트를 해야 한다.
- id로 이름표를 붙여주고(id="아이디"), $('#아이디').val()과 같이 input 박스의 값을 가져 올 수 있다.
Ajax는요?
- Ajax는 서버 통신을 위해 쓰이는 친구
이렇게 생겼습니다.
Flask는 어떤 역할을 하나요?
- 서버를 만드는 프레임워크이다. 서버를 처음부터 만드는 것은 너무 어렵기 때문에 누군가 만들어둔 틀 안에서 코딩 하는 것을 말한다.
폴더 세팅
나홀로 메모장 뜯어보기
1. templets, static 폴더를 만들고 app.py 파일을 만든다.
2. file -> settings -> Python Interpreter -> +버튼
3. 패키지를 설치한다.
: requests, bs4, flask, pymongo
4. index.html과 app.py 코드를 붙여 넣고 app.py를 run 시킨 뒤 localhost:5000을 접속한다.
패키지 import
# 크롤링 연결
import requests
from bs4 import BeautifulSoup
# Mongo DB 연결
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
포스팅 API
## API 역할을 하는 부분
@app.route('/memo', methods=['POST'])
def saving():
url_receive = request.form['url_give']
comment_receive = request.form['comment_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')
title = soup.select_one('meta[property="og:title"]')['content']
image = soup.select_one('meta[property="og:image"]')['content']
desc = soup.select_one('meta[property="og:description"]')['content']
doc = {
'title':title,
'image':image,
'desc':desc,
'url':url_receive,
'comment':comment_receive
}
db.articles.insert_one(doc)
return jsonify({'msg':'저장이 완료되었습니다!'})
function postArticle() {
let url = $('#post-url').val()
let comment = $('#post-comment').val()
$.ajax({
type: "POST",
url: "/memo",
data: {url_give:url, comment_give:comment},
success: function (response) { // 성공하면
alert(response["msg"]);
window.location.reload()
}
})
}
<button type="button" class="btn btn-primary" onclick="postArticle()">기사저장</button>
리스팅 API
@app.route('/memo', methods=['GET'])
def listing():
articles = list(db.articles.find({}, {'_id': False}))
return jsonify({'all_articles':articles})
let comment = articles[i]['comment']
let temp_html = `<div class="card">
<img class="card-img-top"
src="${image}"
alt="Card image cap">
<div class="card-body">
<a target="_blank" href="${url}" class="card-title">${title}</a>
<p class="card-text">${desc}</p>
<p class="card-text comment">${comment}</p>
</div>
</div>`
$('#cards-box').append(temp_html)
}
}
})
}
나홀로 일기장 준비하기
1. templets, static 폴더를 만들고 app.py 파일을 만든다.
2. 패키지 설치
: Flask, Pymongo
3. 만들어 갈 순서
1) 생김새를 먼저 만들기 - HTML, CSS, JS
2) 만들어야 할 기능을 파악하기(포스팅 API, 리스팅 API 두 개)
3) 서버 - 클라이언트 연결 코드 만들기
4) 포스팅 API 만들기 (보통 저장하는 것을 먼저 만들 때가 더 편해요)
5) 리스트 API 만들기
(Lv.1)
나홀로 일기장 만들기 (생김새)
1. 부트스트랩을 사용해서 틀을 만든다.
(부트스트랩 : 남이 만들어둔 CSS)
https://getbootstrap.com/docs/4.0/components/card/
2. Google Fonts를 사용해서 폰트를 설정한다.
완성 코드
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
crossorigin="anonymous"></script>
<title>스파르타코딩클럽 | 나홀로일기장</title>
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Jua&display=swap" rel="stylesheet">
<style>
* {
font-family: 'Jua', sans-serif;
}
.posting-box {
width: 500px;
margin-top: 20px;
}
.wrap {
width: 900px;
margin: auto;
}
.container {
padding-left: 50px;
}
</style>
</head>
<body>
<div class="wrap">
<div class="jumbotron jumbotron-fluid">
<div class="container">
<h1>나홀로 일기장</h1>
<div class="posting-box">
<div class="form-group">
<input type="email" class="form-control" id="exampleFormControlInput1" placeholder="사진 제목">
</div>
<div class="form-group">
<textarea class="form-control" id="exampleFormControlTextarea1" rows="3" placeholder="내용 입력">
나홀로 일기장 만들기 (연결)
1. 기본 flask 코드를 app.py에 넣는다.
from flask import Flask, render_template, jsonify, request
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html')
if __name__ == '__main__':
app.run('0.0.0.0', port=5000, debug=True)
2. API 연결 (저장하기-포스팅, 불러오기-리스팅)
나홀로 일기장 만들기 (API)
- 포스팅 API 만들기
1) 클라이언트와 서버 확인하기
-> 이미 위에서 완료함
2) 서버부터 만들기
-> Mongo DB 연결하기
# Mongo DB 연결
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.dbsparta
# POST 요청 API 코드
@app.route('/diary', methods=['POST'])
def save_diary():
title_receive = request.form['title_give']
content_receive = request.form['content_give']
doc = {
'title' : title_receive,
'content' : content_receive
}
db.diary.insert_one(doc)
print(title_receive, content_receive)
return jsonify({'msg': '저장 완료!'})
3) 클라이언트 만들기
// POST 요청 Ajax 코드
function posting(){
let title = $("#title").val()
let content = $("#content").val()
$.ajax({
type: "POST",
url: "/diary",
data: {title_give: title, content_give: content},
success: function (response) {
alert(response['msg'])
window.location.reload()
}
})
}
4) 완성 확인하기
- 리스팅 API 만들기
1) 클라이언트와 서버 확인하기
-> 이미 위에서 했음
2) 서버부터 만들기
# GET 요청 API 코드
@app.route('/diary', methods=['GET'])
def show_diary():
diaries = list(db.diary.find({}, {'_id': False}))
return jsonify({'all_diary': diaries})
3) 클라이언트 만들기
// GET 요청 Ajax 코드
function listing() {
$.ajax({
type: "GET",
url: "/diary",
data: {},
success: function (response) {
let diaries = response['all_diary']
for(let i = 0; i < diaries.length; i++) {
let title = diaries[i]['title']
let content = diaries[i]['content']
let temp_html = `<div class="card">
<div class="card-body">
<h5 class="card-title">${title}</h5>
<p class="card-text">${content}</p>
</div>
</div>`
$('#cards-box').append(temp_html)
}
}
})
}
4) 완성 확인하기
(Lv.2)
나홀로 일기장 만들기 (생김새)
1) 파일 업로드 만들어 보기
2) 파일 업로드 - 프론트엔드 만들기
- 카드에 이미지 넣기
- 폼 부분에 파일 업로드 넣기
- 파일 업로드에 파일이 들어가게 만들기
3) HTML, CSS - 카드에 이미지 넣기
- 부트스트랩 컴포넌트 페이지의 card에서 이미지 태그 찾아 넣기 -> static 폴더에 사진 넣고 가져오기
<div class="card">
<img src="../static/monet.jpg" class="card-img-top">
<div class="card-body">
<h5 class="card-title">모네의 그림</h5>
<p class="card-text">그림을 보면 마음이 안정된다.</p>
</div>
</div>
4) HTML, CSS - 폼 부분 파일 업로드 넣기
<div class="custom-file">
<input type="file" class="custom-file-input" id="customFile">
<label class="custom-file-label" for="customFile">Choose file</label>
</div>
CSS 조정 해주기
: posting-box 클래스 안에 custom-file이라는 클래스를 지칭
.posting-box > .custom-file {
margin-bottom: 20px;
}
5) HTML, CSS - 파일 업로드가 되게 만들기
: 선택한 파일이 보이지 않기 때문에 이것은 특별한 라이브러리를 임포트 해야 한다.
<script src="https://cdn.jsdelivr.net/npm/bs-custom-file-input/dist/bs-custom-file-input.js"></script>
파일 업로드 코드는 자바스크립트 로딩 시 실행되는 함수에 넣는다.
bsCustomFileInput.init()
나홀로 일기장 만들기 (준비)
1. 파일 업로드
1) 서버 쪽에서 파일 받기 코드 먼저 작성
2) 클라이언트 쪽에서 파일 보내기 코드 작성
3) 잘 저장되나 확인
4) 파일 이름 변경하기 (날짜, 시간으로 - 겹치지 않게)
2. 서버 쪽 파일 받기, 클라이언트 보내기 - 한방에
1) 서버 쪽 받기 코드
file = request.files["file_give"]
save_to = 'static/mypicture.jpg'
file.save(save_to)
2) 클라언트 쪽 보내기 코드
function posting() {
let title = $('#title').val()
let content = $("#content").val()
let file = $('#file')[0].files[0]
let form_data = new FormData()
form_data.append("file_give", file)
form_data.append("title_give", title)
form_data.append("content_give", content)
$.ajax({
type: "POST",
url: "/diary",
data: form_data,
cache: false,
contentType: false,
processData: false,
success: function (response) {
alert(response["msg"])
window.location.reload()
}
});
}
나홀로 일기장 만들기 (서버)
문법 연습
-> f-string
: 알고 있으면 엄청 예쁜 코드를 만들 수 있는 기능
-> datetime 함수
: 더 많은 문법을 원한다면 구글에 python datetime 사용법을 검색해라!
: 날짜 시간을 다루는 함수
1) 파일 이름을 변경 해주고 저장하기
: 파일 이름 변경 해주고 저장하기
(우리의 전략 : 겹치는 이름이 있으면 안되기 때문에 날짜-시간으로 해준다.)
이렇게 하면 파일 이름이 겹칠 일이 거의 없어진다.
title과 content에 해당하는 file을 db에 넣어주면 된다.
나홀로 일기장 만들기 (클라이언트)
1. 카드에 만들어 붙여보기
function listing() {
$.ajax({
type: "GET",
url: "/listing",
data: {},
success: function (response) {
if (response["result"] == "success") {
let articles = response['articles']
for (let i = 0; i < articles.length; i++) {
let title = articles[i]['title']
let content = articles[i]['content']
let file = articles[i]['file']
let temp_html = `<div class="card">
<img src="../static/${file}" class="card-img-top">
<div class="card-body">
<h5 class="card-title">${title}</h5>
<p class="card-text">${content}</p>
</div>
</div>`
$('#cards-box').append(temp_html)
}
}
}
});
}
2. 잘 작동하는 지 확인
AWS 관련 내용은 웹개발 플러스 PHP 파일을 보는 것을 추천함
오늘은 강의 따라하면서 오류가 발생하지 않고 한번에 연결 했다!!! 너무 행복해 완전 행복해 미친다 진짜
'항해 중 > 웹 개발 플러스' 카테고리의 다른 글
웹개발 플러스 4주차 강의 (0) | 2021.11.04 |
---|---|
웹개발 플러스 3주차 강의 (0) | 2021.11.03 |
웹개발 플러스 2주차 강의 (0) | 2021.11.02 |
댓글