フラスコ開発基礎-2

21342 ワード

これは『JumptoPlacer』を勉強したときにまとめた内容です
ソース:https://wikidocs.net/book/4542

質問リストのクエリー機能

  • 伝言板問題リスト
  • を印刷する.
    main viewsはindex関数を文字列の一部を返して問題データを出力します.変更
    from flask import Blueprint, render_template
    from pybo.models import Question
    
    bp = Blueprint('main', __name__, url_prefix='/')
    
    
    @bp.route('/hello')
    def hello_pybo():
        return 'Hello, Pybo!'
    
    
    @bp.route('/')
    def index():
        question_list = Question.query.order_by(Question.create_date.desc())
        return render_template('question/question_list.html', question_list=question_list)
    
    order by関数は、クエリー結果をソートします.質問です.create_date.desc()コードは、クエリの問題リストを「作成時間基準の逆順序でソート」することを意味します.
    戻り文で呼び出されたrender template関数は、テンプレートファイルを画面に描画し、クエリーの問題リストをテンプレートに渡して、データ組織画面を渡します.
  • 問題リストテンプレートファイル
  • を作成する
    render template関数で使用する問題/問題リスト.htmlテンプレートファイルを作成する必要があります.このファイルをtemplatesというディレクトリの下に保存します.このディレクトリは、フラスコがアプリケーションとして指定したモジュールの下にあります.(特別な設定なしでテンプレートディレクトリとして認識)
    テンプレートファイル:Python構文を許可するHTML
    (myproject) c:\projects\myproject> cd pybo
    (myproject) c:\projects\myproject\pybo> mkdir templates
    このディレクトリにテンプレートファイルを作成します.ファイル名は先ほどの質問/question listです.htmlとして指定されているため、この名前で生成されます.ファイルの作成時にファイル名に/を追加すると、以前の名前がディレクトリとして作成されます.
    すなわち、問題/問題リストです.htmlはquestion listディレクトリを作成し、サブディレクトリにquestion listを自動的に作成します.htmlの作成
    {% if question_list %} 
        <ul>
        {% for question in question_list %}
            <li><a href="/detail/{{ question.id }}/">{{ question.subject }}</a></li>
        {% endfor %}
        </ul>
    {% else %}
        <p>질문이 없습니다.</p>
    {% endif %}
    {%と%}で囲まれた文:テンプレートラベル
    {%if question list%}:render template関数に入力された問題リストデータquestion listがあるかどうかを確認します
    {%for question list%}:question listに格納されているデータを1つずつ取り出し、問題オブジェクトに置き換えます(Pythonのfor~in文)
    {{ question.id }}
    {{ question.subject }}
    文から取得した問題オブジェクトのid,subject出力
    その後localhost:5000にログインすると、以下の内容が表示されます.

    前に登録した2つの質問を検索しました.
    瓶によく使われるテンプレートラベル
    1.四半期の記事ラベル:Pythonのif、elif、else文.閉じる必要があるラベル{%endif%}
    {% if 조건문1 %}
        <p>조건문1에 해당하면 실행</p>
    {% elif 조건문2 %}
        <p>조건문2에 해당하면 실행</p>
    {% else %}
        <p>조건문1, 2 모두 해당하지 않으면 실행</p>
    {% endif %}
  • 繰り返し文ラベル:Pythonのfor Moon.必要な
  • 終了フラグ{%endfor%}
    {% for item in list %}
        <p>순서: {{ loop.index }} </p>
        <p>{{ item }}</p>
    {% endfor %}
    Python構文を使用せずに文タグを繰り返すのに便利なloopプロパティを提供
    loop.index:1から1への順序の繰り返し
    loop.index 0:0から1への順序の繰り返し
    loop.first:繰り返し順が1番目の場合はTrueまたはFalse
    loop.Last:繰り返し順が最後の場合はTrueまたはFalse
    3.オブジェクトタグ
    オブジェクト
    {オブジェクト}
    オブジェクトのプロパティ
    {オブジェクト.プロパティ}

    掲示板詳細照会機能の作成


    質問リンクをクリックするとエラーメッセージが表示されます.これは、未定のアドレスバーに表示されているhttp://127.0.0.1:5000/detail/2/ページのURLによるエラーです.
    実装
  • ルーティング関数
  • http://127.0.0.1:5000/detail/2/このURLは、クエリクエリモデルデータのid値が2のデータを意味する.このリクエストに応答するためにmain views.pyファイルで@db.routeとともにdetail関数を追加します.
    (...생략...)
    
    @bp.route('/detail/<int:question_id>/')
    def detail(question_id):
        question = Question.query.get(question_id)
        return render_template('question/question_detail.html', question=question)
    detail関数のパラメータquestion idは、ルーティングマッピングルールに使用されるを渡します.
  • 問題詳細テンプレートファイル
  • を作成する
    テンプレート/問題ディレクトリの問題/問題details.htmlテンプレートファイルの作成
    <h1>{{ question.subject }}</h1>
    
    <div>
        {{ question.content }}
    </div>
    {problem.subject}}と{problem.content}}の問題はrender template関数から伝達されるデータである.
    先ほどのページを再度要求すると、問題idが2の問題データのタイトルと内容が表示されます.
  • 404エラーページ
  • を表示
    localhost:5000/detail/30/pageリクエストに空のページが表示されます.アプリケーションが受け取ったquestion idは30なのでmain viewsです.pyファイルのdetails関数でクエリーします.query.get(30)は、問題idが30であるため呼び出される.
    エラーのURLを要求する場合、通常は「Not Found(404)」のようにエラーページを表示します.404はHTTPの主要な応答コードの一つである.
  • HTTP主要応答コードのタイプ
    200:成功(OK)
    500:サーバ内部エラー
    404:サーバ要求のないページ
  • 既存のコードget関数のデータがdetail関数に見つからない場合は、get or 404関数を使用して404ページを出力します.
    (...생략...)
    
    @bp.route('/detail/<int:question_id>/')
    def detail(question_id): 
        question = Question.query.get_or_404(question_id)
        return render_template('question/question_detail.html', question=question)

    循環林分離機能を使用するには


    すべての問題リストクエリー、詳細クエリー機能、main views.pyファイルで実現し、各機能をblueprintファイルに分離し、管理とメンテナンスに便利です.
    クエリ
  • 問題リスト、分離問題詳細クエリ機能
  • pybo/viewsディレクトリの問題views.新しいpyファイルを作成し、クエリー問題のリストとクエリー問題の詳細を移動する機能.
    quesiton_views.pyファイルのmain views.pyファイルの内容を元の場所にコピーしますが、ループ林オブジェクトを作成するときにquestionという名前を使用し、url prefixで/questionのmain viewsを使用します.pyファイルのblueprintとは異なります.次にindex関数名をlistに変更し、ルーティングマップ/を/list/に変更します.
    from flask import Blueprint, render_template
    from pybo.models import Question
    
    bp = Blueprint('question', __name__, url_prefix='/question')
    
    
    @bp.route('/list/')
    def _list():
        question_list = Question.query.order_by(Question.create_date.desc())
        return render_template('question/question_list.html', question_list=question_list)
    
    
    @bp.route('/detail/<int:question_id>/')
    def detail(question_id):
        question = Question.query.get_or_404(question_id)
        return render_template('question/question_detail.html', question=question)
    
    question_views.pybo/initは、pyファイルに登録されているループ林を適用します.pyファイルも変更され、question viewsのbpオブジェクトを登録します.
    (...생략...)
    def create_app():
        (...생략...)
        # 블루프린트
        from .views import main_views, question_views
        app.register_blueprint(main_views.bp)
        app.register_blueprint(question_views.bp)
        (...생략...)
  • url for街灯機能追加
  • question_views.pyファイルを使用して問題リストと問題詳細クエリー機能を分離したためmain views.pyファイルからこの機能を削除します.
    from flask import Blueprint, url_for
    from werkzeug.utils import redirect
    
    bp = Blueprint('main', __name__, url_prefix='/')
    
    
    @bp.route('/hello')
    def hello_pybo():
        return 'Hello, Pybo!'
    
    @bp.route('/')
    def index():
        return redirect(url_for('question._list'))
    
    detail関数を削除し、index関数に問い合わせます.リストに対応するURLでリダイレクトするように変更しました.
    redirect関数redirectかんすう:入力されたURLをリダイレクト
    url for関数:ルーティングを設定する関数名を使用してURLを逆検索
    url for関数に渡される問題.Listはquestion,listの順に解釈して関数名を検索する.questionは登録されたループ林名、listはループ林に登録された関数名です.現在list関数に登録されているルーティングは@bpです.route("/list/")であるため、url for(「question.list」)はbp接頭辞/question/および/list/の/question/list/URLを返します.
    localhost:5000に接続すると、リダイレクト機能のおかげでlocalhost:5000/question/list/pageが呼び出されます.
  • ハードコーディングURLでurl for関数を使用
    url for関数を使用すると、ルーティングを設定する関数名を使用してURLが検索されます.この機能を使用して、問題リストテンプレートに問題詳細クエリーを呼び出すコードを記述します.
  • <li><a href="{{ url_for('question.detail', question_id=question.id) }}">{{ question.subject }}</a></li>
    以前,a要素に設定したリンクURLは/detail/とハードコーディングされていたが,この部分ではurl for関数を用いて質問を行った.detailsルーティング関数を使用してURLを検索するように変更しました.このときの問題.detail関数にはquestion idパラメータが必要なので、question idを渡す必要があります.
    url for関数を使用すると、メンテナンスが容易になります
    URLをハードコーディングすると、URLの構成方式自体が変化してしまうと、対応しにくくなります.URLの構成方法を頻繁に変更する場合は、テンプレートで使用されているすべてのURLを巡回して変更する必要があるため、url for関数を使用する必要があります.