スパルタコードクラブの周りのノート


1.Flaskの起動-サーバの作成


2)Flaskパッケージをインストールしてスタート!


私の考え!パッケージインストール画面へ
ウィンドウ:左上隅File->setting->Pythonインタプリタ
  • Pythonインタプリタ画面で+キー
  • を押す
  • 本を検索し、「install package
  • 」をクリックします.

    3)Flashベース:デフォルト運転


  • Flaskフレームワーク:サーバを駆動するための便利なコードのセット.サーバを駆動するには、必要な複雑な作業を簡単に書くことができます.
    =>フレームを使わなければ、サンセットを潰してコチュジャンに!フレームは3分料理/調味料セット!

  • app.pyファイルを作成し、次のコードを貼り付けます.
    =>通常フラスコサーバを実行するファイルはappです.pyという名前です.
  • from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def home():
       return 'This is Home!'
    
    if __name__ == '__main__':  
       app.run('0.0.0.0',port=5000,debug=True)
  • 右クリック->runappをクリックして、端末にメッセージが表示されたときに正常に実行します.
  • 4)Flaskベース:URLの共有

  • @app.urlはroute("/")セクションを変更することで分割できます.
    =>urlの関数名が同じではないか、ルーティング("/")のアドレスが同じではありません.
  • 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=5000,debug=True)

    2.Flaskの起動—HTMLファイルのライフサイクル


    5)Flash Basice:デフォルトのフォルダ構造-常にこのように設定してから開始します!

  • Flaskサーバを作成する場合は、常に
  • を使用します.
    プロジェクトフォルダで、
    静的フォルダ(画像、cssファイルが暗い)
    ㄴtemplatesフォルダ(htmlファイルを非表示)
    ㄴapp.pyファイル
    これで3つ作ってから始めましょうでは、各フォルダの役割について説明しましょう.
    (我慢しなきゃ!!venvは実際には見えるけど見えない~!覚えてるでしょ?)

    6)Flashベース:HTMLファイルを読み込む

  • templatesフォルダ内のロール:HTMLファイルが含まれてロードされたロール.
  • 単純インデックス.テンプレートにhtmlファイルを作成する
    [コードセグメント]index.htmlサンプルコード
  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
        <title>Document</title>
    </head>
    <body>
        <h1>서버를 만들었다!</h1>
    </body>
    </html>
  • htmlファイル
  • を読み込みます.
  • フラスコ内蔵関数render templateを使用します.これがフレームの威力!
  • 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=5000, debug=True)

    3.Flaskの起動-正式APIの作成


    7)入る前:GET、POST要求タイプ

  • 私の考え!APIは銀行の窓口と同じです.同じ預金ウィンドウでは、顧客が個人顧客なのか企業顧客なのかで処理が異なり、顧客が要求した場合でも「方式」が存在する.クライアントはリクエスト時にHTTPリクエストメソッド(リクエストメソッド)によりレスポンスリクエストタイプのサーバに情報を通知する.
  • -GET、POST方式
    様々な方式が存在するが、その中で最もよく用いられるのはGET、POST方式である.
  • GET
    =>通常!データ照会要求時
    例)ムービーリストの表示
    =>データ転送:URLの後ろに疑問符を付けてkey=valueに転送
    例えば、Google.com?ホッキョクグマ
  • POST
    =>通常!作成、更新、削除を要求します.
    例)会員加入、会員脱退、パスワード修正
    =>データ転送:非表示のHTML本文でkey:value形式で
  • を転送

    8)GET、POST要求クライアントデータの受信方法


    たとえば、クライアントがtitle giveのキー値としてサーバからデータをインポートするとします.(850520-…を身分証明書番号として入力するキー値に相当)
    =>得られた値を印刷して開発者に見せる.実戦では、pirntで撮影する以外にも、いろいろな仕事ができるのではないでしょうか.[コード断片]-GET要求APIコード
    @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コードの確認
    $.ajax({
        type: "GET",
        url: "/test?title_give=봄날은간다",
        data: {},
        success: function(response){
           console.log(response)
        }
      })
    [コード断片]-POST要求APIコード
    @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)
        }
      })

    4.[全員の本コメント]-設定項目


    9)問題分析-完成作品を見て!

  • sparta->projects->書評フォルダを開けてスタート!
  • http://spartacodingclub.shop/bookreview

    10)設定項目-フラスコフォルダ構造の作成

  • 静的、テンプレートフォルダ+app.pyを作ろう!
  • 5.[全員の書評]-骨組みの準備


    11)プロジェクト準備-app。pyの準備


    [コードスナップ]-みんなの書評-apppy
    from flask import Flask, render_template, jsonify, request
    app = Flask(__name__)
    
    from pymongo import MongoClient
    client = MongoClient('localhost', 27017)
    db = client.dbsparta
    
    ## HTML을 주는 부분
    @app.route('/')
    def home():
        return render_template('index.html')
    
    ## API 역할을 하는 부분
    @app.route('/review', methods=['POST'])
    def write_review():
        sample_receive = request.form['sample_give']
        print(sample_receive)
        return jsonify({'msg': '이 요청은 POST!'})
    
    
    @app.route('/review', methods=['GET'])
    def read_reviews():
        sample_receive = request.args.get('sample_give')
        print(sample_receive)
        return jsonify({'msg': '이 요청은 GET!'})
    
    
    if __name__ == '__main__':
        app.run('0.0.0.0', port=5000, debug=True)

    12)プロジェクト準備-index。htmlの準備


    [コードスナップ]-みんなの書評-indexhtml
    <!DOCTYPE html>
    <html lang="ko">
    
        <head>
            <!-- Webpage Title -->
            <title>모두의 책리뷰 | 스파르타코딩클럽</title>
    
            <!-- 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">
    
            <!-- 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>
    
            <!-- 구글폰트 -->
            <link href="https://fonts.googleapis.com/css?family=Do+Hyeon&display=swap" rel="stylesheet">
    
            <script type="text/javascript">
    
                $(document).ready(function () {
                    showReview();
                });
    
                function makeReview() {
                    $.ajax({
                        type: "POST",
                        url: "/review",
                        data: {sample_give:'샘플데이터'},
                        success: function (response) {
                            alert(response["msg"]);
                            window.location.reload();
                        }
                    })
                }
    
                function showReview() {
                    $.ajax({
                        type: "GET",
                        url: "/review?sample_give=샘플데이터",
                        data: {},
                        success: function (response) {
                            alert(response["msg"]);
                        }
                    })
                }
            </script>
    
            <style type="text/css">
                * {
                    font-family: "Do Hyeon", sans-serif;
                }
    
                h1,
                h5 {
                    display: inline;
                }
    
                .info {
                    margin-top: 20px;
                    margin-bottom: 20px;
                }
    
                .review {
                    text-align: center;
                }
    
                .reviews {
                    margin-top: 100px;
                }
            </style>
        </head>
    
        <body>
            <div class="container">
                <img src="https://previews.123rf.com/images/maxxyustas/maxxyustas1511/maxxyustas151100002/47858355-education-concept-books-and-textbooks-on-the-bookshelf-3d.jpg"
                     class="img-fluid" alt="Responsive image">
                <div class="info">
                    <h1>읽은 책에 대해 말씀해주세요.</h1>
                    <p>다른 사람을 위해 리뷰를 남겨주세요! 다 같이 좋은 책을 읽는다면 다 함께 행복해질 수 있지 않을까요?</p>
                    <div class="input-group mb-3">
                        <div class="input-group-prepend">
                            <span class="input-group-text">제목</span>
                        </div>
                        <input type="text" class="form-control" id="title">
                    </div>
                    <div class="input-group mb-3">
                        <div class="input-group-prepend">
                            <span class="input-group-text">저자</span>
                        </div>
                        <input type="text" class="form-control" id="author">
                    </div>
                    <div class="input-group mb-3">
                        <div class="input-group-prepend">
                            <span class="input-group-text">리뷰</span>
                        </div>
                        <textarea class="form-control" id="bookReview"
                                  cols="30"
                                  rows="5" placeholder="140자까지 입력할 수 있습니다."></textarea>
                    </div>
                    <div class="review">
                        <button onclick="makeReview()" type="button" class="btn btn-primary">리뷰 작성하기</button>
                    </div>
                </div>
                <div class="reviews">
                    <table class="table">
                        <thead>
                        <tr>
                            <th scope="col">제목</th>
                            <th scope="col">저자</th>
                            <th scope="col">리뷰</th>
                        </tr>
                        </thead>
                        <tbody id="reviews-box">
                        <tr>
                            <td>왕초보 8주 코딩</td>
                            <td>김르탄</td>
                            <td>역시 왕초보 코딩교육의 명가답군요. 따라하다보니 눈 깜짝할 사이에 8주가 지났습니다.</td>
                        </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </body>
    
    </html>

    6.[全員の書評]-POST練習(コメント保存)


    13)APIの作成と使用:タイトル、作成者、コメント情報の保存


    1.クライアントとサーバの確認

  • ここに書いてあるペアのサーバー-クライアントコードです.確認してみます.
  • ピンクの蛍光ペン部分がどのように一致しているかを確認します.(概念検証)
  • によって作成されたAPI情報
  • 要求情報:要求URL=/レビュー、要求方式=POST
  • .
  • サーバが提供する機能:
  • クライアントに指定されたメッセージを送信
  • 応答データ:(JSON形式)「result」=「success」、「msg」=「コメント作成成功」.
  • [サーバコード-app.py]
    ## API 역할을 하는 부분
    @app.route('/review', methods=['POST'])
    def write_review():
    	# 1. 클라이언트가 준 title, author, review 가져오기.
    	# 2. DB에 정보 삽입하기
    	# 3. 성공 여부 & 성공 메시지 반환하기
        return jsonify({'result': 'success', 'msg': '리뷰가 성공적으로 작성되었습니다.'})
    [クライアントコード-index.html]
    function makeReview() {
    		// 1. 제목, 저자, 리뷰 내용을 가져옵니다.
    		// 2. 제목, 저자, 리뷰 중 하나라도 입력하지 않았을 경우 alert를 띄웁니다.
    		// 3. POST /review 에 저장을 요청합니다.
        $.ajax({
            type: "POST",
            url:  "/review",
            data: { },
            success: function (response) {
                if (response["result"] == "success") {
                    alert(response["msg"] );
                    window.location.reload();
                }
            }
        })
    }
  • 動作テスト
    [コメントの開始]ボタンをクリックすると、[コメントの作成に成功しました]が表示されます.名前のalertウィンドウが表示されると、クライアントコードがサーバコードに関連付けられていることを示します.
  • 2.サーバの作成

  • APIは承諾です.まずはAPIを作りましょう!
  • コメントの作成に必要な情報は、次の3つです.
    -タイトル(title)
    -作成者
    -コメント(コメント)
    したがって、API機能は、以下の3つのステップを含む必要があります.
    1.クライアントからのtitle、author、reviewを取得します.
    2.DBに情報を挿入する
    3.成功するかどうか&成功メッセージを返す
  • を整理した後に作成されるAPI情報は以下の通りである.
  • A.要求情報
    -要求URL=/review、要求方式=POST
    -要求データ:タイトル(title)、作成者(author)、コメント(review)
    B.サーバが提供する機能:クライアントに要求データをデータベース作成(Create)に送信し、保存に成功したことを示す応答データを送信する.
    C.応答データ:(JSON形式)「msg」=「コメント作成に成功しました.」
    @app.route('/review', methods=['POST'])
    def write_review():
        # title_receive로 클라이언트가 준 title 가져오기
        title_receive = request.form['title_give']
        # author_receive로 클라이언트가 준 author 가져오기
        author_receive = request.form['author_give']
        # review_receive로 클라이언트가 준 review 가져오기
        review_receive = request.form['review_give']
    
        # DB에 삽입할 review 만들기
        doc = {
            'title': title_receive,
            'author': author_receive,
            'review': review_receive
        }
        # reviews에 review 저장하기
        db.bookreview.insert_one(doc)
        # 성공 여부 & 성공 메시지 반환
        return jsonify({'msg': '리뷰가 성공적으로 작성되었습니다.'})

    3.クライアントの作成

  • APIは承諾です.APIを使用するクライアントを作成!
  • コメントの作成に必要な情報は、次の3つです.
    -タイトル(title)
    -作成者
    -コメント(コメント)
    したがって、クライアント・コードには、次の3つのステップが含まれている必要があります.
    1.inputからtitle、author、reviewをインポート
    2.値が入力されていない場合はalertをフローティングします.
    3.Ajaxをサーバに保存し、画面の再ロードを要求します.
  • 使用するAPI情報
    A.要求情報
    -要求URL=/review、要求方式=POST
    -要求データ:タイトル(title)、作成者(author)、コメント(review)
  • B.サーバが提供する機能:クライアントに要求データをデータベース作成(Create)に送信し、応答データを送信し、保存に成功したことを示す
    C.応答データ:(JSON形式)「result」=「success」、「msg」=「コメント作成成功」.
    function makeReview() {
        // 화면에 입력어 있는 제목, 저자, 리뷰 내용을 가져옵니다.
        let title = $("#title").val();
        let author = $("#author").val();
        let review = $("#bookReview").val();
    
        // POST /review 에 저장(Create)을 요청합니다.
        $.ajax({
            type: "POST",
            url: "/review",
            data: { title_give: title, author_give: author, review_give: review },
            success: function (response) {
                alert(response["msg"]);
                window.location.reload();
            }
        })
    }

    4.完了確認

  • 動作テスト
    タイトル、作成者、コメントを作成して[コメントを作成](Create Comment)ボタンをクリックすると、[コメントを正常に作成](Create Comment)が表示されます.名前のalertが表示されていることを確認してください.
  • 7.[全員の本レビュー]-GET練習(コメント表示)


    14)保存されたコメントを作成して使用する(Read->GET)


    動作を参照します.