スパルタWebページ開発総合10日目日記(5-1~8)


Flashを使用したWebページの作成


MovieStarのページはとても良くて、削除の機能を実現します


<コース目標>
  • Flaskフレームワークを使用してAPIを作成できます.
  • 「私の宝物映画スター」を完成した.
  • EC 2に私のプロジェクトをアップロードして、自慢します!
  • 作品を完成する
  • データスタッキング
    ->APIを事前に作成したコードとしてデータベースにインポートして格納するコードを提供する
    init_db.pyファイルを作成し、次のコードを使用してファイルを実行すると、映画人情報
  • が保存されます.
    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()
  • スケルトン
  • を準備する
    1) 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/[email protected]/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>
    2) 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():
        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)
  • GET練習(プレゼンテーション)
  • を作成するAPI
  • 閲覧機能:全映画人情報
  • 閲覧
  • 賛(更新)機能:クライアントから取得した名前(name give)で賛(like)を検索することで
  • 増加
  • 削除機能:クライアントから受け取った名前(name give)を使用して映画人を検索し、映画人
  • を削除する.
  • 作成するAPI情報
  • A.要求情報
  • 要求URL=/api/list、要求方式=GET
  • 要求データ:
  • なし
    B.サーバが提供する機能:データベースで映画人情報を閲覧し、映画人情報を応答データとして送信する
    C.応答データ:(JSON形式)「stars list」=映画人情報リスト
    1)クライアントとサーバの接続の検証
    <サーバコード>
    @app.route('/api/list', methods=['GET'])
    def show_stars():
        sample_receive = request.args.get('sample_give')
        print(sample_receive)
        return jsonify({'msg': 'list 연결되었습니다!'})
    <クライアントコード>
    function showStar() {
          $.ajax({
              type: 'GET',
              url: '/api/list?sample_give=샘플데이터',
              data: {},
              success: function (response) {
                  alert(response['msg']);
              }
          });
      }
    *更新時に「リストが接続されています」プロンプトが表示されると、この操作が実行されます.
    2)サーバからの作成
    APIは約束です.上記の事前に設計されたAPI情報を表示して作成します!
    映画人のすべての情報を表示するためにサーバが受信できる情報はありません.私は無条件にあなたにすべての情報を見せます!
    したがって、サーバロジックは次のように構成する必要があります.
    a.mystarリスト全体を検索します.LIKEが多い順に並べ替え(IDを除く)
    b.成功したら、stars listリストを成功メッセージとともにクライアントに送信する
    @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})
    3)クライアントの作成
    映画人のすべての情報を表示するためにサーバが受信できる情報はありません.私は無条件にあなたにすべての情報を見せます!
    したがって、クライアントロジックは次のように構成する必要があります.
    a.star boxのすべての内部htmlタグを削除
    b.サーバにstars list(1)GET,2)/api/listアドレスを要求する
    c.サーバから返されたstarsリストをstarsという変数に保存する
    d.for文を用いてstars配列の要素を順次照会する
    e.stars[i]要素のname、url、img url、最新のlikeキー値を使用して値をクエリーする
    f.ムービーカードコードを作成して#star-boxに貼り付ける
    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)
                            }
                        }
                    });
                }
    4)完了確認
    スクリーンをリフレッシュするときは、必ず映画人情報を表示してください.
  • POST練習(好+1)
  • クライアントの「いいね」>「サーバーでいいね」の名前を検索」>「見つかった名前でLikeを検索」>「Like+1」>DB更新
  • を作成するAPI
  • 1)閲覧:映画関係者の情報を閲覧する
    2)いいですね.クライアントから受け取った名前(name give)を使って、「いいね」(like)を検索して追加します.
    3)削除:クライアントから受け取った名前(name give)を使用して映画人を検索し、その映画人を削除する
  • 作成するAPI情報
  • A.要求情報
  • 要求URL=/api/like、要求方式=POST
  • リクエストデータ:映画人名(name give)
  • B.サーバーが提供する機能:映画人の名前(要求データ)に一致する映画人情報の賛数を増加し、データベースを更新し、応答メッセージを送信し、成功を表す
    C.応答データ:(JSON形式)「msg」=「よし、完成!」
    1)クライアントの検証-サーバ接続
    <サーバコード>
    @app.route('/api/like', methods=['POST'])
    def like_star():
        sample_receive = request.form['sample_give']
        print(sample_receive)
        return jsonify({'msg': 'like 연결되었습니다!'})
    <クライアントコード>
    function likeStar(name) {
        $.ajax({
            type: 'POST',
            url: '/api/like',
            data: {sample_give:'샘플데이터'},
            success: function (response) {
                alert(response['msg']);
            }
        });
    }
    *「上へ」ボタンを押すと、「like接続成功!」コンテンツのalertウィンドウが開くと、正常に動作します.
    2)サーバからの作成
    ムービー入力カードの数を増やすには、サーバがクライアントに次の情報を送信する必要があります.
  • 映画人の名前(name give)
  • したがって、サーバロジックは次のように構成する必要があります.
    a.クライアントから渡されたname giveをname receive変数に入れる.
    b.mystarリストでfind oneで名前がname receiveに一致するstarを検索します.
    c.new like変数を作成し、starのlikeに1を追加します.
    d.mystarリストで、name receiveという名前のドキュメントのlikeをnew likeに変更します.
    <サーバコード>
    @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': '좋아요 완료!'})
    3)クライアントの作成
    クライアントは、サブスクリプション数を増やすためにクライアントに次の情報を送信します.
  • 映画人の名前(name give)
  • したがって、クライアントロジックは次のように構成する必要があります.
    a.サーバ上
    1)POST方式で、
    2)/api/likeというURLで、
    3)名前name giveでnameを渡す.
    (注意)データの使用:{"name give":name}をPOSTとして使用
    b.「よし、終わりだ!」alertウィンドウを開きます.
    c.変更された情報を反映するためにリフレッシュする.
    <クライアントコード>
    function likeStar(name) {
        $.ajax({
            type: 'POST',
            url: '/api/like',
            data: {name_give:name},
            success: function (response) {
                alert(response['msg']);
                window.location.reload()
            }
        });
    }
    *「上へ」ボタンをクリックした場合は、「いいね」が追加されたことを確認し、映画カードのランキングを変更してください.
  • POST練習(削除)

  • 作成するAPI
    a.閲覧機能:映画人全体の情報を閲覧する
    b.賛(Update)機能:クライアントで受け取った名前(name give)で賛(like)を検索して追加する
    c.削除機能:クライアントから受け取った名前(name give)で映画人を検索し、その映画人を削除する

  • 作成するAPIについて
  • A.要求情報
  • 要求URL=/api/delete、要求方式=POST
  • リクエストデータ:映画人名(name give)
  • B.サーバが提供する機能:映画人の名前(要求データ)に一致する映画人情報(削除済み)をデータベースから削除し、成功したことを示す応答メッセージを送信する
    C.応答データ:(JSON形式)「msg」=「削除済み!」
    1)クライアントとサーバの接続の検証
    <サーバコード>
    @app.route('/api/delete', methods=['POST'])
    def delete_star():
        sample_receive = request.form['sample_give']
        print(sample_receive)
        return jsonify({'msg': 'delete 연결되었습니다!'})
    <クライアントコード>
    function deleteStar(name) {
        $.ajax({
            type: 'POST',
            url: '/api/delete',
            data: {sample_give:'샘플데이터'},
            success: function (response) {
                alert(response['msg']);
            }
        });
    }
    *[削除]ボタンをクリックすると、[削除]に正常に接続されました.alertウィンドウが表示されたら
    クライアントコードはサーバコードに関連付けられています.
    2)サーバからの作成
    ムービーカードの削除に必要な情報は次のとおりです.
  • 映画人の名前(name give)
  • したがって、サーバロジックは次のように構成する必要があります.
    a.クライアントから渡されたname giveをname receive変数に入れる
    b.mystarからdelete oneという名前のname receiveに一致するstarを削除する
    c.正常に成功メッセージを返す
    @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': '삭제 완료!'})
    3)クライアントの作成
    ムービーカードの削除に必要な情報は次のとおりです.
  • 映画人の名前(name give)
  • したがって、クライアントロジックは次のように構成する必要があります.
    a.サーバ上
    1)POST方式で、
    2)/api/deleteというURLで、
    3)name giveの名前でnameを渡す
    (注意)POST方式を採用しているため、データ:{"name give":name}
    b.削除完了!「こんにちは」フローティングalertウィンドウ
    c.変更を反映するために更新
    function deleteStar(name) {
          $.ajax({
              type: 'POST',
              url: '/api/delete',
              data: {name_give:name},
              success: function (response) {
                  alert(response['msg']);
                  window.location.reload()
              }
          });
      }
    *[削除]ボタンをクリックした場合は、必ず映画カードを削除してください.
  • 完了、
  • 今は少し見覚えがありますが、まだ容易ではありません.