항해 99 입학시험이 코앞으로 다가왔다. 바로 내일 ! 10시부터 17시 !!! 

매니저님들이 시험이 쉽다고 걱정하지 말라고 하시면서 예제 링크를 하나 보여주셨다. 

네? 쉽다고요 ....? 전 왜 어렵죠 ....? ㅎ

 

구현되어있는 페이지 소스코드에서 힌트를 얻어 어찌저찌 구현을 하긴 했다.

페이지 html 소스코드 덕분에 구현한거라 내일 새로운 문제를 풀고 구현을 해야 한다면 과연 할 수 있을지 모르겠다.

뭐... 7시간인데 구글링하면 어떻게든 하겠지 !!!


 

 

 

[ 구현해야 하는 부분 ]

 

1. 취소버튼 만들기

2. 취소 누르면 다시 완료버튼이 되도록 하기

 

어쨌든 성공 ! :)

 

1.  BE 부분

 

 

 

2.  FE 부분

 

 

오늘은 11월 9일에 있을 사전 입학시험에 대비하여 웹종합반 강의를 복습해 보았다.

오랜만에 봤더니 여전히 헷갈리는 부분이 있어서 복습하는 동안 헷갈렸던 부분의 코드를 정리해 보았다.

시간이 여유가 있다면 간단한 웹페이지를 하나 만들어 보면 좋을텐데 아쉬움이 남는다.

사전시험 제발 아무런 이슈없이 통과하기를 ! :)

 


 

1. 로그인 박스 배경 이미지 설정 기본값

background-image: url("https://www.ancient-origins.net/sites/default/files/field/image/Agesilaus-II-cover.jpg");
background-position: center;
background-size: cover;

 

2. 화면 중앙으로 로그인 박스 옮기기

//<style> 태그 부분 -> 일단 가로사이즈를 주고, margin값으로 중간으로 옮기기.

.wrap{
            width:300px;
            margin: auto;
        }
        
//<body> 태그 부분 -> 옮기고자 하는 부분 class="wrap"으로 전체 묶어주기.

 <div class="wrap">
        <div class="login_box">
            <h1>로그인 페이지</h1>
            <h5>아이디, 비밀번호를 입력해주세요</h5>
        </div>
        <div>
            <p>ID: <input type="text"/></p>
            <p>PW: <input type="text"/></p>
            <button>로그인하기</button>
        </div>
</div>

 

3. style.css 파일을 같은 폴더에 만들고, head 태그에서 불러오기. <head>태그 안에 아래 코드를 넣어주면 된다.

<link rel="stylesheet" type="text/css" href = "(css파일이름).css">

 

4. 스파르타피디아 헤드부분 제목과 버튼 정렬 코드 (박스 내 중앙으로 옮겨주는)

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

 

5. jQuery 임포트 코드. <head> 태그 안에 아래 코드를 넣어주면 된다.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

 

6. ajax 기본골격

 $.ajax({
	type: "GET",
	url: "여기에URL을입력",
	data: {},
	success: function(response){
	console.log(response)
	}
})

 

7. 로딩 후 바로 호출하기

$(document).ready(function(){
	alert('다 로딩됐다!')
});

 

8. 스파르타피디아 별점 가져오는 법 .repeat() 사용하기

let star_image = '⭐'.repeat(star)

 

9. 크롤링 부분

import requests
from bs4 import BeautifulSoup

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/rmovie.naver?sel=pnt&date=20210829',headers=headers)

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

//#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
//#old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img
//#old_content > table > tbody > tr:nth-child(2) > td.point


movies = soup.select('#old_content > table > tbody > tr')

for movie in movies:
    title = movie.select_one('td.title > div > a')
    if title is not None:
        title = title.text
        rank = movie.select_one('td:nth-child(1) > img')['alt']
        star = movie.select_one('td.point').text
        print(rank, title, star)

 

10. db 관련 코드 (필요에 따라 복붙하기)

from pymongo import MongoClient
import certifi

ca = certifi.where()
client = MongoClient('mongodb+srv://test:비밀번호@cluster0.몽고db개인주소.mongodb.net/?retryWrites=true&w=majority',tlsCAFile=ca)
db = client.dbsparta

# 저장 - 예시
doc = {'name':'bobby','age':21}
db.users.insert_one(doc)

# 한 개 찾기 - 예시
user = db.users.find_one({'name':'bobby'})

# 여러개 찾기 - 예시 ( _id 값은 제외하고 출력)
all_users = list(db.users.find({},{'_id':False}))

# 바꾸기 - 예시
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

# 지우기 - 예시
db.users.delete_one({'name':'bobby'})

 

11. 화성땅공동구매 POST BE 코드

@app.route("/mars", methods=["POST"])
def mars_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.orders.insert_one(doc)

    return jsonify({'msg': '주문 완료!'})

 

12. 화성땅공동구매 POST FE 코드

function save_order() {
    let name = $('#name').val()
    let address = $('#address').val()
    let size = $('#size').val()

    $.ajax({
        type: 'POST',
        url: '/mars',
        data: { name_give:name, address_give:address, size_give:size },
        success: function (response) {
            alert(response['msg'])
            window.location.reload()
        }
    });
}

 

 

13. 화성땅공동구매 GET BE 코드

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

 

14. 화성땅공동구매 GET FE 코드

function show_order() {
    $('#order-box').empty()
    $.ajax({
        type: 'GET',
        url: '/mars',
        data: {},
        success: function (response) {
            let rows = response['orders']
            for (let i = 0; i < rows.length; i++) {
                let name = rows[i]['name']
                let address = rows[i]['address']
                let size = rows[i]['size']

                let temp_html = `<tr>
                                    <td>${name}</td>
                                    <td>${address}</td>
                                    <td>${size}</td>
                                  </tr>`
                $('#order-box').append(temp_html)
            }

        }
    });
}

 

5. 크롤링 조각기능 - meta tag

//select_one을 이용해 meta tag를 먼저 가져와봅니다
og_image = soup.select_one('meta[property="og:image"]')
og_title = soup.select_one('meta[property="og:title"]')
og_description = soup.select_one('meta[property="og:description"]')

print(og_image)
print(og_title)
print(og_description)

//가져온 meta tag의 content를 가져와봅시다.
image = og_image['content']
title = og_title['content']
description = og_description['content']

print(image)
print(title)
print(description)

 

16. 버킷리스트 BE POST 

@app.route("/bucket", methods=["POST"])
def bucket_post():
    bucket_receive = request.form["bucket_give"]

    count = list(db.bucket.find({},{'_id':False})) //->이부분을 유의한다 ! 넘버 만든느 법!
    num = len(count) + 1

    doc = {
        'num':num,
        'bucket': bucket_receive,
        'done':0
    }

    db.bucket.insert_one(doc)
    return jsonify({'msg':'등록 완료!'})

 

17. 버킷리스트 FE POST

function save_bucket(){
    let bucket = $('#bucket').val()
    $.ajax({
        type: "POST",
        url: "/bucket",
        data: {bucket_give:bucket},
        success: function (response) {
            alert(response["msg"])
            window.location.reload()
        }
    });
}

 18. 버킷리스트 done BE POST

@app.route("/bucket/done", methods=["POST"])
def bucket_done():
    num_receive = request.form["num_give"] //num으로 받는 점 유의, int로 데이터타입 변환 유의
    db.bucket.update_one({'num': int(num_receive)}, {'$set': {'done': 1}})
    return jsonify({'msg': '버킷 완료!'})

 

19. 버킷리스트 done FE POST

function done_bucket(num){
    $.ajax({
        type: "POST",
        url: "/bucket/done",
        data: {'num_give':num},
        success: function (response) {
            alert(response["msg"])
            window.location.reload()
        }
    });
}

 

 

 

이 글이 나와 같이 완전 제로베이스에 가장 기초라는 웹 개발 종합반을 수강하면서 본인의 부족함과 시작도 하지 않은 공부에 대한 막막함을 느낄 누군가에게 위로가 되길 바라며 적어보려 한다.

 

일단 웹개발 종합반이라는 강의는 항해99 부트캠프에 참여하려는 사람이라면 누구나 들어야 하는 사전과제이다. 나는 강의를 3번 돌리고 나서야 그나마 이 회고록을 작성할 수 있었다. 누군가에게는 너무나 쉬운 강의겠지만, 나처럼 아예 코딩이라는 것이 처음인 사람에게는 이마저도 한 번에 이해가 쉽지 않은 강의였다.

 

강의를 3번 돌렸다고 해서 아직 완전히 모든 부분이 이해되는 것은 아니다. 11월 9일에 부트캠프에 참가할 자격을 결정하는 사전시험이 있는데, 그것을 통과하려면 꼭 이해하고 넘어가야 하는 강의이기 때문에 아마 앞으로 최소 1번 혹은 두 번은 더 완강을 해야 그나마 80프로는 이해가 될 것 같다.

 

이렇게 코딩에 대해 아무것도 모르고 다른 사람에 비해 너무나 낮은 실력에 막막한 마음을 갖고 있는 사람이 여기도 있다. 그래도 강의를 듣기 전의 나와 지금의 나를 생각해 보면 분명히 많은 발전이 있다고 생각한다. 그러니 어쩌다 이 글을 보게 될 나와 같은 분도 끝까지 용기를 잃지 마시고! 의지를 잃지 마시고! 천천히 성장하는 개발자가 되셨으면 좋겠다. 

 

모두 화잇팅 !!! 

 

 

[수업 목표]

  1. Flask 프레임워크를 활용해서 API를 만들 수 있다.
  2. '버킷리스트'를 완성한다.
  3. EC2에 내 프로젝트를 올리고, 자랑한다!

웹페이지 배포하기

그 단계를 위해 필요한 프로그램과 사이트를 먼저 정리해 보려 한다.

① Filezilla 설치하기

https://filezilla-project.org/download.php

② 가비아 가입 및 도메인 구매

https://www.gabia.com

 

웹을 넘어 클라우드로. 가비아

그룹웨어부터 멀티클라우드까지 하나의 클라우드 허브

www.gabia.com

③ AWS EC2 서버 사기

https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2 

 

https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2

 

ap-northeast-2.console.aws.amazon.com

1) 버킷리스트 

오늘 다시 한번 연습해본 [POST], [GET] 요청하기. 그중 추가할 부분만 정리해보려 한다.

※아마 이 부분은 강의를 듣지 않으신 분들은 무슨말인지 헷갈리실 수 있기 때문에 그냥 넘어가 주셔도 괜찮습니다 :)

 

① 서버를 만들때 버킷리스트마다 번호를 부여했는데, 그 번호가 [완료 버튼 POST] 서버를 만들 때는 문자열로 인식이 되기 때문에 num_receive 형식을 int(num_receive)로 바꿔주는 작업이 필요했다. 

@app.route("/bucket/done", methods=["POST"])
def bucket_done():
    num_receive = request.form["num_give"]
    db.bucket.update_one({'num': int(num_receive)}, {'$set': {'done': 1}})
    return jsonify({'msg': '버킷 완료!'})

② 그리고 위의 코드에서 보듯이 완료하지 않은 상태일때 0 값을 갖게 되는 'done'을 완료 버튼을 눌렀을 때 1로 업데이트하도록 만들었다.

 

 

2) 내 프로젝트를 서버에 올리기

  • 웹 서비스를 런칭하기 위해 클라이언트의 요청에 항상 응답해줄 수 있는 서버에 프로젝트를 실행시켜줘야 한다
  • 언제나 요청에 응답하려면, 1) 컴퓨터가 항상 켜져있고 프로그램이 실행되어 있어야 하고, 2) 모두가 접근할 수 있는 공개 주소인 공개 IP 주소(Public IP Address)로 나의 웹 서비스에 접근할 수 있도록 해야 함
  • AWS 라는 클라우드 서비스에서 편하게 서버를 관리하기 위해서 항상 켜 놓을 수 있는 컴퓨터인 EC2 사용권을 구입해 서버로 사용

 

AWS 서버 구매하기 (링크는 제일 상단 참고!)

  • 여러 개의 OS 중 오픈소스인 리눅스의 Ubuntu를 설치
  • Name을 설정해 주고, Ubuntu를 선택한 뒤 프리티어 중 최신 버전을 선택해 준다!

출처 : 스파르타코딩클럽 웹개발 종합반 강의

 

  • KEY 생성하기(Create new key pair)를 클릭 후, key를 발급 (서버 접속 시 매우 중요!!!)

  • 나머지 체크리스트들을 체크 후, Launch instance를 클릭

 

② 서버 세팅하기

  • 서버 환경 통일하기 (※ 실제 업무에서는 인프라 엔지니어 또는 개발 팀장님이 해두시는 경우가 많다.)
  • 아래와 같은 코드를 터미널 창에 입력해서 필요한 프로그램들을 미리 다운받고 서버를 세팅해 주어야 한다.
# python3 -> python
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10

# pip3 -> pip
sudo apt-get update
sudo apt-get install -y python3-pip
sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1

# port forwarding
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5002

 

③ 터미널창과 파이질라를 이용해 웹페이지 배포하기

 

이 부분이 가장 헷갈렸던 부분이다. 리눅스 언어를 이용하여 Terminal 창에 입력을 해서 진행시켜야 했는데, 이번이 세 번째 웹 배포다 보니까 뭔가 자꾸 오류가 생기고 할 때마다 헤매는 것 같다. 참고로 오늘 포스팅은 이미 모든 프로그램이 설치되어있고 배포가 되어있는 상태에서 하다 보니 생략된 부분이 많다. (예를 들면, 파이썬 설치 등..)

 

일단 내가 이해한 부분을 차래대로 정리해 보자면,

 

1. Mac 인 경우 Spotlight 검색을 켜고(오른쪽 상단 돋보기 모양 아이콘 클릭) Terminal을 검색 실행시켜준다.

2. Terminal 창이 뜨면, 다음과 같이 입력한다

sudo chmod 400 (여기엔 다운로드하였던 키페어 드래그해서 붙여 넣기) 그리고 엔터!

3. 다음과 같은 화면이 뜨면 맥북 개인 비밀번호를 입력하고 엔터!

4. ssh -i (다시 한번 키페어 드래그) ubuntu@(여기는 AWS 퍼블릭 주소 복붙) 엔터!

저기 퍼블릭 IPv4 주소 숫자부분을 복사해서 @뒤에 붙여주기

5. 중간 과정은 이미 내가 폴더를 만들어 놓고 배포한 상태라 스크린 샷이 없는데 mkdir spart을 입력해서 sparta 폴더를 생성해 준다. 참고로 mkdir 은 폴더를 생성하는 리눅스 언어인데 다음번에 리눅스 관련 언어 정리 포스트를 하면서 다시 정리하도록 하겠다.

 

6. 그런 다음 ls를 입력하면 아래와 같이 sparta 가 뜨는 것을 확인할 수 있다. ls는 현재 위치에서 디렉터리(폴더) 내용물을 보여주는 리눅스 명령어이다.

 

 

7. 이렇게 파일이 만들어진 것을 확인했으면 파이질라를 실행시킨다.

    왼쪽 상단의 스크린 세계 모양 아이콘을 클릭하면 다음과 같은 창이 뜬다.

 

8. My Sites에 myec2라는 파일을 만들어 준 뒤, 다음과 같이 설정을 맞춰 준다. 참고로 Host에는 각자 AWS에 갖고 있는 아까도 복붙 하면서 사용했던 퍼플릭 아이피 주소를 넣어주면 된다.

9. 그렇게 하면 다음과 같은 창이 뜨는데, 왼쪽이 내 컴퓨터 오른쪽이 방금 내가 산 컴퓨터가 된다.

방금 터미널 창을 통해 만들어 두었던 스파르타 폴더에(오른쪽) 내가 올리고자 하는 웹페이지 소스인 static, templates, app.py를 드래그해서 옮겨준다.

 

 

10. 그다음 다시 터미널 창으로 돌아와 아래와 같은 순서로 입력! 

    - cd sparta (sparta 폴더로 들어감)

    - ls (폴더 내용물을 보여줌)

    - python app.py (만들어 뒀던 서버를 실행시켬줌)

    - 그리고 마지막으로 스크린샷에는 없지만 nohup python app.py & 를 치고 엔터를 하면 배포가 완료된다.

 

※ 나의 페이지가 이미 배포가 되어있는 상태에서 정리하려다 보니 뭔가 과정이 깔끔하지 않은 점 양해 부탁드립니다! 

 

11. 이 과정을 마무리하고 브라우저에 [http://내 AWS아이피/]를 입력하면 내가 만들어 두었던 웹페이지가 화면에 뜨는 것을 확인할 수 있다.

 

 

3) 도메인 연결하기

① 도메인 구입/연결

  • 도메인을 구매한다는 것은 네임서버를 운영해주는 업체에 IP와 도메인 매칭 유지비를 내는 것.
  • 가비아라는 사이트를 이용해 도메인을 구입해 놓았다.

 

  • 가비아에서 내 아이피 주소에 원하는 도메인 이름을 설정해 준다.

 

 

4) 웹페이지 수정하고 다시 업로드하는 방법

※ 나는 이미 이전에 같은 도메인에 첫 과제로 만들었던 팬명록 페이지를 올려놓은 상태였기 때문에 다시 새로 만든 웹페이지를 업로드하는 과정이 가장 많이 헷갈렸다. 이 부분을 내가 이해한 방식대로 정리해 보자면!

 

 

1. 위에 정리해 둔 [2) 내 프로젝트 서버에 올리기 -②서버 세팅하기] 과정을 참고하여 1번부터 6번까지 실행시켜 sparta 폴더에 접속해 준다. 그다음 cd spart 엔터, 그 후 다시 python app.py 엔터 실행. 

 

2. 여기가 중요하다! 실행시켜 놓았던 웹페이지를 잠시 꺼주는 역할을 하는 코드를 입력한다. 

ps -ef | grep 'python app.py' | awk '{print $2}' | xargs kill 엔터

 

3. 이제 브라우저에 웹페이지 주소를 쳐보면 꺼져있는 것을 확인할 수 있을 것이다.

 

4. 파이질라를 실행시키고 오른쪽 컴퓨터 부분에 있는 원래 있던 파일을 삭제하고, 다시 왼쪽 내 컴퓨터 부분에서 새롭게 업로드할 파일의 static, templates, app.py를 오른쪽 컴퓨터로 드래그해준다.

 

5. 다시 터미널 창으로 돌아와 

nohup python app.py & 엔터 

 

6. 이제 다시 브라우저에서 도메인을 입력해보면 수정된 웹페이지가 배포되었음을 확인할 수 있다.

 

 

5) 과제

내가 만든 도메인 leejincha.shop 을 브라우저에서 열어주면 결과물을 확인할 수 있다.

웹버전
<meta>태그를 통해 만들어 준 og : image

 

 

 


아 쉽지 않다 쉽지 않아! 리눅스 명령어를 입력하는 과정이 너무나 생소하고 헷갈리고 또 commend not found 등과 같은 다양한 에러를 구글링을 통해 해결하며 따라가야 했던 수업이다. 이 부분은 차라리 첫 강의를 수강했을 때 따라만 했기 때문에 오류가 없었는데, 만들어 놓았던 도메인에 똑같은 작업을 반복하려다 보니까 자꾸만 에러가 났던 것 같다.

 

아마도 제 3자의 눈으로 오늘 나의 포스트를 보자면 스킵되어있는 부분이 많아서 (스크린샷을 일일이 하지 못함 ㅠ) 이해하기 어렵게 느껴지실 것 같다. 일단 중요한 부분은 원래 만들었던 웹페이지를 내리고 수정하는 과정이라고 생각하는데, 리눅스 명령어를 잘 입력해서 원하는 폴더에 접근을 해주고, 삭제 코드를 입력해서 페이지를 내려주고, 파이질라에 다시 새로운 파일을 업데이트해주고, 다시 nohup코드로 페이지를 다시 배포해주는 이 과정! (헥헥) 그것을 잘 기억해 주면 될 것 같다.

[수업 목표]

  1. Flask 프레임워크를 활용해서 API를 만들 수 있다.
  2. '화성에 땅사기' API를 만들고 클라이언트에 연결한다.
  3. '스파르타피디아' API를 만들고 클라이언트와 연결한다.

수업에 앞서 먼저 이해하고 가야 할 부분 : 로컬 개발환경

로컬 개발환경이란 같은 컴퓨터에다 서버도 만들고, 요청도 하는 방식. 즉, 클라이언트 = 서버가 되는 것!

클라우드 서비스를 이용하면 아래와 같은 그림이 될 수 있다.

출처 : 스파르타코딩클럽

 

Flask 프레임워크 

  • 서버를 구동시켜주는 편한 코드 모음. 서버를 구동하려면 필요한 복잡한 일들을 쉽게 가져다 쓸 수 있다.
  • 파일 이름은 아무렇게나 해도 상관없지만, 통상적으로 flask 서버를 돌리는 파일은 app.py라고 이름 짓는다.
  • 지난 글에 올린 것처럼 환경설정 → python interpreter에서 검색 후 패키지 설치하면 준비 완료!

 

Flask 기초

① @app.route('/) 부분을 수정해서 URL을 나눌 수 있다. 단, 주의할 점은 url 별로 함수명이 같거나, route('/') 내의 주소가 같으면 안 됨.

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
   return 'This is Home!'

@app.route('/mypage')
def mypage():  
   return 'This is My Page!'

if __name__ == '__main__':  
   app.run('0.0.0.0',port=5002,debug=True)

이렇게 한 후 오른쪽 마우스 클릭 → 실행 → 브라우저에서 localhost:5002/ 주소창으로 가면 웹페이지가 생성되는 것을 볼 수 있다.

 

② 기본 폴더구조

  • 프로젝트 폴더 안에 static 폴더 (이미지, css파일을 넣어둡니다), templates 폴더 (html 파일을 넣어둡니다), app.py 파일 이렇게 세 개를 만들어두고 시작

왼쪽 프로젝트 아래부분 참고!

 

  • index.html 파일을 templates 안에 만들어 준 다음 flask 내장 함수 render_template를 이용해 html 파일을 불러줄 수 있음
from flask import Flask, render_template //이 라인에서 프레임워크 임포트를 확인 할 수 있다
app = Flask(__name__)

## URL 별로 함수명이 같거나,
## route('/') 등의 주소가 같으면 안됩니다.

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

if __name__ == '__main__':
   app.run('0.0.0.0', port=5002, debug=True)

③ GET, POST 요청 타입

클라이언트는 요청할 때 HTTP request method(요청 메소드)라는 방식을 통해 어떤 요청 종류인지 응답하는 서버 쪽에 정보를 알려준다.

 

[GET 요청 방식]  

  •  통상적으로 데이터 조회(Read)를 요청할 때 → 영화 목록 조회
  •  데이터 전달 : URL 뒤에 물음표를 붙여 key=value로 전달 → 예: google.com?q=북극곰
//GET 요청 API코드 app.py 파이썬파일에서 사용, 들여쓰기 주의하기

@app.route('/test', methods=['GET'])
def test_get():
   title_receive = request.args.get('title_give')
   print(title_receive)
   return jsonify({'result':'success', 'msg': '이 요청은 GET!'})

 

//GET 요청 확인 Ajax코드 - HTML파일에서 사용
$.ajax({
    type: "GET",
    url: "/test?title_give=봄날은간다",
    data: {},
    success: function(response){
       console.log(response)
    }
  })

 

[POST 요청 방식]

  •  통상적으로 데이터 생성(Create), 변경(Update), 삭제(Delete) 요청할 때 → 예) 회원가입, 회원 탈퇴, 비밀번호 수정
  •  데이터 전달 : 바로 보이지 않는 HTML body에 key:value 형태로 전달
//POST 요청 API코드 - 마찬가지고 app.py 파이썬 파일에서 사용, 들여쓰기 주의하기

@app.route('/test', methods=['POST'])
def test_post():
   title_receive = request.form['title_give']
   print(title_receive)
   return jsonify({'result':'success', 'msg': '이 요청은 POST!'})
//POST 요청 확인 Ajax코드

$.ajax({
    type: "POST",
    url: "/test",
    data: { title_give:'봄날은간다' },
    success: function(response){
       console.log(response)
    }
  })

 

[화성땅 공동구매] 연습

준비하기

  • 패키지 설치 : flask, pymongo, dnspython, certifi
  • app.py, static, templates ( → 안에 index.html 파일 만들기) 이 3가지 만들기
  • mongoDB Atlas 창 띄워두기

② POST 연습하기 ( 주문 저장 )

  • API 만들고 사용하기 - 이름, 주소, 평수 저장하기(Create → POST)
  • 서버부터 만들기 ( 필요한 정보인 name, address, size 정보를 받아서 저장해 준다)

[POST 아래 참조]클라이언트 만들기

  • 이어서 html 파일에 클라이언트 만들기

name, address, size 정보를 내보내 주는 것

  • 그리고 mongoDB Atlas에서 잘 들어갔는지 확인해주면 끝.

이렇게 잘 저장되어 있는 것을 확인했다면 성공 !

 

③ GET 연습하기 ( 주문 보여주기 )

  • API 만들고 사용하기 - 저장된 주문을 화면에 보여주기(Read → GET)
  • 서버부터 만들기 (받을 것 없이 orders에 주문정보를 담아서 내려주기만 하면 끝)

지난 번에 만들어 두었던 dbprac.py 파일에서 여러 리스트를 불러오는 함수를 복붙해 줬다.

  • 클라이언트 만들기 (응답을 잘 받아서 for 문으로 붙여주면 끝!)

 

  • 화면을 새로고침 했을 때, DB에 저장된 리뷰가 화면에 올바르게 나타나는지 확인하면 끝

[스파르타피디아]

※ 화성땅 공동구매와 겹치는 부분이 많기 때문에 추가적으로 필요한 부분만 정리

조각 기능 구현해보기

  •  API에서 수행해야 하는 작업 중 익숙하지 않은 것들은, 따로 python 파일을 만들어 실행해보고, 잘 되면 코드를 붙여 넣는 방식으로 하는 게 편하다. 

② meta 태그에 대해 알아보기

  • 메타 태그는, <head></head> 부분에 들어가는, 눈으로 보이는 것(body) 외에 사이트의 속성을 설명해주는 태그들입니다. 예) 구글 검색 시 표시될 설명문, 사이트 제목, 카톡 공유 시 표시 될 이미지 등
  • 그중 og:image / og:title / og:description 을 크롤링 할 예정
  • meta 태그 스크래핑 할 때는 select_one을 이용해 meta tag를 임시로 만들어 둔 meta_prac.py파일에 먼저 가져와 본다
og_image = soup.select_one('meta[property="og:image"]')
og_title = soup.select_one('meta[property="og:title"]')
og_description = soup.select_one('meta[property="og:description"]')

print(og_image)
print(og_title)
print(og_description)
  • 가져온 meta tag의 content를 가져와 app.py 필요한 부분에 붙여준다.
image = og_image['content']
title = og_title['content']
description = og_description['content']

print(image)
print(title)
print(description)

과제

  • 응원 남기기(POST): 정보 입력 후 '응원 남기기' 버튼 클릭 시 주문 목록에 추가
  • 응원 보기(GET): 페이지 로딩 후 하단 응원 목록이 자동으로 보이기

오늘의 과제 결과물

 


확실히 강의를 3번째 듣다 보니까 예전에 강의를 따라서 치던 코드를 이젠 과제할 때 직접 쳐볼 수 있게 되었다. POST형식과 GET형식의 유기적인 구조를 조금은 더 이해할 수 있게 된 것 같다. 물론 아직 완벽하진 않지만, 한 번 더 수강을 한다면 더 이해가 쉬울 것 같은 느낌 ! 처음부터 완전히 이해를 하기보다 일단 반복해보고 그 과정을 통해 서서히 이해하는 것이 도움이 되는 것 같다. 그리고 오늘 과제를 하면서 계속해서 오류가 떴는데, 알고 보니 comment 스펠링이 하나 틀려서 발생했던 버그였다. 

 

이젠 오류가 발생해도 오류 창의 메시지 첫 줄을 확인하는 습관이 생겼는데, 정확한 오류가 무엇인지는 몰라도 몇 번째 줄의 오류인지는 알 수 있어서 오류를 찾는 방법도 발전한 것 같다. 남들보다 느리지만 어제의 나보다 발전하고 있는 나를 칭찬하며 오늘 회고 끝. 

+ Recent posts