フラスコ開発基礎-2
21342 ワード
これは『JumptoPlacer』を勉強したときにまとめた内容です
ソース:https://wikidocs.net/book/4542
伝言板問題リスト を印刷する.
main viewsはindex関数を文字列の一部を返して問題データを出力します.変更
戻り文で呼び出されたrender template関数は、テンプレートファイルを画面に描画し、クエリーの問題リストをテンプレートに渡して、データ組織画面を渡します.問題リストテンプレートファイル を作成する
render template関数で使用する問題/問題リスト.htmlテンプレートファイルを作成する必要があります.このファイルをtemplatesというディレクトリの下に保存します.このディレクトリは、フラスコがアプリケーションとして指定したモジュールの下にあります.(特別な設定なしでテンプレートディレクトリとして認識)
テンプレートファイル:Python構文を許可するHTML
すなわち、問題/問題リストです.htmlはquestion listディレクトリを作成し、サブディレクトリにquestion listを自動的に作成します.htmlの作成
{%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%}繰り返し文ラベル:Pythonのfor Moon.必要な 終了フラグ{%endfor%}
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関数を追加します.を渡します.問題詳細テンプレートファイル を作成する
テンプレート/問題ディレクトリの問題/問題details.htmlテンプレートファイルの作成
先ほどのページを再度要求すると、問題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ページを出力します.
すべての問題リストクエリー、詳細クエリー機能、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/に変更します. url for街灯機能追加 question_views.pyファイルを使用して問題リストと問題詳細クエリー機能を分離したためmain views.pyファイルからこの機能を削除します.
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が検索されます.この機能を使用して、問題リストテンプレートに問題詳細クエリーを呼び出すコードを記述します.
url for関数を使用すると、メンテナンスが容易になります
URLをハードコーディングすると、URLの構成方式自体が変化してしまうと、対応しにくくなります.URLの構成方法を頻繁に変更する場合は、テンプレートで使用されているすべてのURLを巡回して変更する必要があるため、url for関数を使用する必要があります.
ソース: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 %}
{% 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によるエラーです.
実装
(...생략...)
@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の問題データのタイトルと内容が表示されます.
localhost:5000/detail/30/pageリクエストに空のページが表示されます.アプリケーションが受け取ったquestion idは30なのでmain viewsです.pyファイルのdetails関数でクエリーします.query.get(30)は、問題idが30であるため呼び出される.
エラーのURLを要求する場合、通常は「Not Found(404)」のようにエラーページを表示します.404はHTTPの主要な応答コードの一つである.
200:成功(OK)
500:サーバ内部エラー
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ファイルに分離し、管理とメンテナンスに便利です.
クエリ
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)
(...생략...)
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 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関数を使用する必要があります.
Reference
この問題について(フラスコ開発基礎-2), 我々は、より多くの情報をここで見つけました https://velog.io/@jusung-c/플라스크-개발-기초-2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol