王初甫はクラスを始めました-04週間開発日記

21877 ワード

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


sparta→projects→pracフォルダを開いてスタート!

  • 2)Flaskパッケージをインストールしてスタート!
    私の考え!パッケージインストール画面へ
    ウィンドウ:左上隅ファイル→設定→Pythonインタプリタ
    Mac:左上Pychat→Preference→Python Interpreter

  • python interpreter画面で、+ボタンを押すと次のウィンドウが表示されます!
    (Macは下部、Windowsは右側)
  • flaskを検索し、「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)

  • 右クリック→「Run app」をクリックし、端末が次のメッセージを表示したときに実行に成功しました.


  • クロムからhttp://localhost:5000/に接続されます.
    画面に表示される情報はHello World!ですか?あんなに成功した!👏

  • 終了方法
    ターミナルウィンドウをクリックし、ctrl+cを押してサーバを終了します.

  • 4)Flaskベース:URLの共有

  • @app.route('/)セクションを変更することでURLを分割できます!簡単でしょう.
    各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)
  • 02.Flashの起動:HTMLファイルのライフサイクル


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

  • 6)Flashベース:HTMLファイルを読み込む
    templatesフォルダの役割について説明します.
    HTMLファイルを含めて、読み込みの役割を果たします!

  • シンプルなindex.テンプレートにhtmlファイルを作成する
  • [コード断片]インデックス.htmlサンプルコード

  • htmlファイルを読み込む
    flask内蔵関数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)
  • 03.Flaskの起動-正式APIの作成


  • 7)入場前:GET、POST要求タイプ-再入力
    私の考え!
    銀行の窓口はAPIと同じだったのを覚えていますか?
    ****同じ顧客窓口においても、個人の顧客であるか企業の顧客であるかによって、
    クライアント要求時でも「方式」が存在する.
    HTTP通信規約を守るのを忘れていませんか?クライアントはリクエスト時にHTTPリクエストメソッド(リクエストメソッド)を介してリクエストタイプに応答するサーバに情報を提供する.
    GET、POST方式
    様々な方法が存在するが(リンク)、最も一般的なGET、POST方式について議論する.

  • GET→通常!データ照会要求時
    例)ムービーリストの表示
    →データ転送:URLの後ろに疑問符を付けてkey=valueに転送する
    →例:google.com?ホッキョクグマ

  • POST→通常!作成、更新、削除を要求します.
    例)会員加入、会員脱退、パスワード修正
    →データ転送:key:value形式で非表示のHTML bodyに転送

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

  • たとえば、クライアントがサーバからtitle giveキー値としてデータをインポートするとします.
    (850120-...を身分証明書番号として入力するキー値に相当)
    받은 값을 개발자가 볼 수 있게 print 로 찍어볼 수 있게 했습니다. 실전에선 print로 찍어주는 것 외에, 여러가지 작업을 할 수 있겠죠?
    
    - **[코드스니펫] - GET 요청 API코드**
    
        ```python
        @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코드**
    
        ```jsx
        $.ajax({
            type: "GET",
            url: "/test?title_give=봄날은간다",
            data: {},
            success: function(response){
               console.log(response)
            }
          })
        ```
    
    - **[코드스니펫] - POST 요청 API코드**
    
        ```python
        @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코드**
    
        ```jsx
        $.ajax({
            type: "POST",
            url: "/test",
            data: { title_give:'봄날은간다' },
            success: function(response){
               console.log(response)
            }
          })
        ```
        
  • 04.[全員の書評]-POST練習(コメント保存)


  • 13)APIの作成と使用:タイトル、作成者、コメント情報の保存(Create→POST)
  • クライアントとサーバの検証

  • ここには、サーバ-クライアントコードのペアが書かれています.

  • ピンクの蛍光ペンの部分がどのようにマッチしているかを確認してください!
    作成されたAPIについて
    1.要求情報:要求URL=/review,要求方式=POST2.サーバが提供する機能:指定したメッセージをクライアントに送信する
    3.応答データ:(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ウィンドウが表示されると、クライアントコードがサーバコードに関連付けられていることを示します.

  • サーバから作成
    APIは約束です.まずAPIを作成しましょう!
    コメントの作成に必要な情報は、次の3つです.

  • タイトル(title)

  • 作者の紹介

  • コメント
    したがって、API機能は、以下の3つのステップを含む必要があります.

  • クライアントからのtitle、author、reviewをインポートします.

  • DBに情報を挿入する

  • 成功するかどうか&成功メッセージを返す
    整理後、作成する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': '리뷰가 성공적으로 작성되었습니다.'})

  • クライアントの作成
    APIは約束です.APIを使用したクライアントを作成しましょう.
    コメントの作成に必要な情報は、次の3つです.

  • タイトル(title)

  • 作者の紹介

  • コメント
    したがって、クライアント・コードには、次の3つのステップが含まれている必要があります.

  • inputからtitle、author、reviewをインポート

  • 値が入力されていない場合はalertが表示されます.

  • 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();
            }
        })
    }

  • 検査完了
    テストアクション
    タイトル、作成者、コメントを作成し、「コメントの作成」ボタンをクリックします.
    コメントの作成に成功しました名前のalertが表示されていることを確認してください.