728x90

무비스타 프로젝트 만들어보기!

1. DB만들기 (데이터 쌓기)

크롤링해서 -> DB에 저장

 

2. 보여주기 ! (GET)

- 클라이언트와 서버 연결 확인

- 서버 만들기 (app.py)

서버가 해야할일 : 나홀로 메모장에서 articles내려주듯이 db데이터들 내려주기.

like큰순서대로 거꾸로 내려줘야함.==> 정렬 .sort (모를땐 검색해보기 pymonho 정렬 w3hschool인가..)

- 클라이언트 만들기(index.html)

- 완성

 

3. 좋아요 +1 기능 (POST)

이름을 받아서 -> 그 이름의 좋아요값  db에서 찾은다음에 -> 덮어씌우고 +1

 

4. 삭제하기! (POST)

이름으로 찾고, 영화인을 삭제

완성코드

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) {
                        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']
                            // console.log(name,img_url,recent,url,like)

                            let temp_html =` <div className="card">
                                                <div className="card-content">
                                                    <div className="media">
                                                        <div className="media-left">
                                                            <figure className="image is-48x48">
                                                                <img
                                                                    src="${img_url}"
                                                                    alt = "Placeholder image"
                                                                />
                                                            </figure>
                                                        </div>
                                                        <div className="media-content">
                                                            <a href="#" target="_blank" className="star-name title is-4">${name} (좋아요:${like})</a>
                                                            <p className="subtitle is-6">${recent}</p>
                                                        </div>
                                                    </div>
                                                </div>
                                                <footer className="card-footer">
                                                    <a href="#" onClick="likeStar('${name}')" className="card-footer-item has-text-info">
                                                        위로!
                                                        <span className="icon">
                                              <i className="fas fa-thumbs-up"></i>
                                            </span>
                                                    </a>
                                                    <a href="#" onClick="deleteStar('${name}')" className="card-footer-item has-text-danger">
                                                            삭제
                                                            <span className="icon">
                                              <i className="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>

이건 스파르타 꺼

<!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']
                        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>

app.py

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': 'delete 완료'})


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

완성화면:


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

서버의 역할: 

브라우저가 ajax와 같이 요청을 하면 ajax에 대한 답변을 주거나

그런 어떤 뭔가를 주는 행위

어떤 컴퓨터든지 그 역할을 수행할 수 있다.

 

언제나 요청에 응답하려면,

1) 컴퓨터가 항상 켜져있고 프로그램이 실행되어 있어야하고,

2) 모두가 접근할 수 있는 공개 주소인 공개 IP 주소(Public IP Address)로 나의 웹 서비스에 접근할 수 있도록 해야해요.

 

요새는 클라우드 환경 (인터넷 환경에 있는 컴퓨터를 사서 그쪽으로 접속하게 만들어둠 )

옛날에는 서버실 같이 막 컴퓨터 몰아넣고 만들었는데 요새는 클라우드에서 서버사서 코드올려놓고 사람들한테 접속하게 함.

 

AWS서버

컴퓨터 한대한대를 인스턴스라고 부름.

리눅스 OS(Operating System)

특징 : 오픈소스! 무료임, 라이센스비가 필요없대

리눅스도 여러가지 계열이 있느넫, 그중에서 ubuntu를 사용.(보편적)

보편적인거를 써야 찾을 수 있는게 많음.

컴퓨터를 원격접속해가지고 그걸 조작하고, 실행하고 할거임.

그때 원격접속하러 들어갈 수 있는key임.

보통 메일이라던가 머 보관해둬야함.

 

AWS 1년동안 무료임..

종료하려면(끝내려면): 인스턴스 종료 누르면끝남.


원격접속 하는법:

1. Git Bash켠다.

2.

ssh -i (아까 그 키붙여넣고) ubuntu@인스턴스 퍼블릭 ip주소 복사해서 마지막에 붙여넣고 엔터!

 

이렇게 나와야 원격접속 해 있는거임.


명령어 배우깅

리눅스에는 마우스가없어서 명령어 해야함

  • makdir 폴더이름 : (폴더만들기)
  • ls 엔터 : 내위치의 폴더 알려줌
  • cd sparta/ :라는 폴더로 들어가달라
  • cd.. :폴더에서 나간다.

 


서버 세팅하기

filezilla: 내컴퓨터에 있는 파일을 올려주는 업로더를 이용

요렇게! 해주고

 

아까 만든 sparta파일 확인할 수있다.

 

test.py 다운받으면 확인할ㅇ 수 있음.

 

왼쪽이 내컴퓨터(이건 지금 sparta측 컴퓨터 화면), 오른쪽이 파일을 올리고 받을 컴퓨터

test.py를 sparta에 옮겨줌

cd sparta/ 

ls

하면test.py볼 수 있음.

만약에 머 하려면

리눅스에서 필요한것들 다 깔아야 하기는 함. mongoDB라던가..


스파르타 측에서 세팅된 파일 줬음

실행시켜야함.

실행시키기 전에

권한 주기

명령어들이 잘 실행될 수 있도록

 

./ini 하고 탭 해서 엔터하면 설치됨

설치하는즁..

ls -> python test.py

하면 잘 나옴

mongodb쳐보면 들어온것도 확인가능


flask서버를 실행해보기

git bash에서 app.py를 실행시켰을때

에러가뜬다.

Flask가 있어야하는디 마우스가 없으므로 pip install flask 해주기~

 

pip란? : pip라이브러리는  파이썬의 패키지를 쉽게깔아주는 것 ,python과 절친


AWS자체 방화벽을 뚫어놔야함 

포트들을 막아놨기때문에

풀어주기!

 

해당EC2체크 -> 보안 -> 보안그룹 -> 인바운드 규칙편집->

 

포트 입력해주기!

그러면 다시 새고하면 들어가짐

 

app.py일때

1. 서버 끄는법 :

 Ctrl+C

2. 서버 켜는법:

 ls -> python app.py


쇼핑몰 배포하기

 

전에 서버에서 robo3T 에 접속해서 DB확인해야하므로

이번에 id,pw한 이유는 남들이DB조작할 위험방지

 

그 다음

client = MongoClient('mongodb://test:test@localhost', 27017)

이거 넣어주고

filezila에서 homework파일의 templates,static,app.py옮겨줌

그러면 나옴


포트번호 5000떼는법

일종의 항구 : 포트

5000포트 -> 플라스크

27017 = > 몽고DB

80 =>http(안붙여도 됨, 기본이라)

 

80으로 받은걸 5000으로 보낸다 : 포워딩

아까 세팅에 포함되어있었음

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

GIT BASH를 닫아도 작동하도록 만들기

nohub python app.py&

 

끄기

ps -ef | grep 'app.py' 엔터하고 ((ps -ef는 모든 프로세스를 보여줌, 그 중에서 app.py만 포함된애를 솎아내라))

 kill -9 22***(각자뜨는숫자)

 


도메인붙이기!

gabia에서 550원으로 도메인샀음

 

가비아 접속 -> DNS관리툴 -> 설정 -> 레코드 수정 -> @, ip주소 등록 후 저장

pinetree.shop

근데.. 입력하고 저장이 안된다 ㅜㅜDB에 또 문제생긴듯 으익!!짜증


og태그 만들기

<meta property="og:title" content="내 사이트의 제목" />
<meta property="og:description" content="보고 있는 페이지의 내용 요약" />
<meta property="og:image" content="{{ url_for('static', filename='ogimage.png') }}" />

 

og태그 이미지 바꾸거나 내용 변경하려면

일단 서버끄고, 파일 바꾼 내용filezila에서 지워서 다시옮기고 서버 재실행

카톡에 보낸건 https://developers.kakao.com/tool/clear/og

 

카카오계정 로그인

여기를 눌러 링크를 확인하세요.

accounts.kakao.com

여기에서 초기화를 해줘야함 왜냐면 바로 반영안됨.


숙제

ㅎㅎ

728x90

'✍2021,2022 > WEB' 카테고리의 다른 글

웹개발+/2주차 필기,개발일지  (0) 2021.07.18
WEB 개발+ / 1주차 필기, 개발일지  (0) 2021.07.12
4주차 개발/필기일지  (0) 2021.07.01
3주차 필기/개발일지  (0) 2021.06.20
2주차 필기/ 개발일지  (0) 2021.06.18
리촬리