Flaskノート(3)--拡張パッケージFlask-WTF,Flask-Ment
12148 ワード
flask-wtf
インストール:pip install flask-wtf
flask_wtfはフォームに関する拡張ライブラリであり、デフォルトではFlask-WTFはすべてのフォームをクロスステーション要求偽造(Cross-Site Request Forgery,CSRF)の攻撃から保護することができる.悪意のあるサイトが攻撃者が登録した他のサイトにリクエストを送信するとCSRF攻撃を引き起こす.CSRF保護を実現するために、FlaskWTFはプログラムに鍵を設定する必要がある.Flask-WTFはこの鍵を用いて暗号化トークンを生成し,トークンで要求中のフォームデータの真偽を検証する.
フォームクラス
flask_の使用wtfの場合、各フォームはクラスとして抽象化され、このクラスはFlaskFormクラスから継承され、このクラスは様々なフォームのフィールドを定義し、各フィールドはオブジェクトで表される.そしてflask_wtfには、ユーザがコミットした入力値が要求に合致するかどうかを検証するための様々な検証関数も定義されている.
このフォームのフィールドはクラス変数として定義され、クラス変数の値は対応するフィールドタイプのオブジェクトです.この例では、Name Formフォームにはnameというテキストフィールドとsubmitというコミットボタンがあります.StringFieldクラスは、属性が WTFormsがサポートするHTML標準フィールド: フィールドタイプ
はっきり言う
StringField
テキストフィールド
TextAreaField
複数行テキストフィールド
PasswordField
パスワードテキストフィールド
HiddenField
テキストフィールドの非表示
DateField
テキストフィールド、値はdatetime.dateフォーマット
DateTimeField
テキストフィールド、値はdatetime.datetimeフォーマット
IntegerField
テキストフィールド、値は整数
DecimalField
テキストフィールド、値はdecimal.Decimal
FloatField
テキストフィールド、値は浮動小数点数
BooleanField
チェックボックス、値はTrueとFalse
RadioField
ラジオ・ボックスのセット
SelectField
ドロップダウンリスト
SelectMultipleField
複数の値を選択できるドロップダウン・リスト
SubmitField
フォーム送信ボタン
FileField
ファイルアップロードフィールド
FormField
フォームをフィールドとして別のフォームに埋め込む
FieldList
指定したタイプのフィールドのセット
+WTFormsに組み込まれた検証関数
表4-2
検証関数
はっきり言う
Email
Eメールアドレスの確認
EqualTo
2つのフィールドの値を比較します.パスワードを2回入力して確認する場合によく使われます
IPAddress
IPv 4ネットワークアドレスの確認
Length
入力文字列の長さの検証
NumberRange
入力値が数値範囲内であることを確認
Optional
入力値なしで他の検証関数をスキップ
Required
フィールドにデータがあることを確認
Regexp
正規表現を使用した入力値の検証
URL
URLの検証
AnyOf
入力値がオプションの値リストにあることを確認します.
NoneOf
入力値がオプションリストにないことを確認します
フォームクラスをHTMLにレンダリング
ビュー関数集合でフォームクラスをインスタンス化し、インスタンスオブジェクトをパラメータとしてHTMLに入力すると行レンダリングがHTMLのフォームになります
フォーム検証
POSTリダイレクトGET
###カスタムフィールド検証:
「validate」と書くことですフィールド'の関数は、次のとおりです.
Flashメッセージ表示説明:ユーザが要求を出した後、状態が変化し、プロンプトや警告などの情報を与える必要がある場合、警告ボックスをポップアップすることで、ユーザは手動でキャンセルすることができる. 使用:適切なタイミングでflashメッセージを書き、flash関数 Flask_Moment
flask-momentは、この拡張がJqueryに依存する時間ローカライズ表示のライブラリであることを示している. 取付: 使用: テンプレート を使用
インストール:pip install flask-wtf
flask_wtfはフォームに関する拡張ライブラリであり、デフォルトではFlask-WTFはすべてのフォームをクロスステーション要求偽造(Cross-Site Request Forgery,CSRF)の攻撃から保護することができる.悪意のあるサイトが攻撃者が登録した他のサイトにリクエストを送信するとCSRF攻撃を引き起こす.CSRF保護を実現するために、FlaskWTFはプログラムに鍵を設定する必要がある.Flask-WTFはこの鍵を用いて暗号化トークンを生成し,トークンで要求中のフォームデータの真偽を検証する.
# :
app.config['SECRET_KEY'] = ' '
フォームクラス
flask_の使用wtfの場合、各フォームはクラスとして抽象化され、このクラスはFlaskFormクラスから継承され、このクラスは様々なフォームのフィールドを定義し、各フィールドはオブジェクトで表される.そしてflask_wtfには、ユーザがコミットした入力値が要求に合致するかどうかを検証するための様々な検証関数も定義されている.
# html
# flask_wtf :
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField #
from wtforms.validators import DataRequired, ValidationError #
class NameForm(FlaskForm):
class NameForm(FlaskForm):
name = StringField(' ', validators=[DataRequired()])
submit = SubmitField(' ')
このフォームのフィールドはクラス変数として定義され、クラス変数の値は対応するフィールドタイプのオブジェクトです.この例では、Name Formフォームにはnameというテキストフィールドとsubmitというコミットボタンがあります.StringFieldクラスは、属性が
type="text"
の
要素を表します.SubmitFieldクラスは、属性がtype="submit"
の
要素を表す.フィールドコンストラクション関数の最初のパラメータは、フォームをHTMLにレンダリングするときに使用されるラベルです.StringFieldコンストラクション関数のパラメータ可能なvalidatorsは、ユーザーがコミットしたデータを受け入れる前にデータを検証する検証関数からなるリストを指定します.検証関数Required()は、コミットされたフィールドが空でないことを確認します.はっきり言う
StringField
テキストフィールド
TextAreaField
複数行テキストフィールド
PasswordField
パスワードテキストフィールド
HiddenField
テキストフィールドの非表示
DateField
テキストフィールド、値はdatetime.dateフォーマット
DateTimeField
テキストフィールド、値はdatetime.datetimeフォーマット
IntegerField
テキストフィールド、値は整数
DecimalField
テキストフィールド、値はdecimal.Decimal
FloatField
テキストフィールド、値は浮動小数点数
BooleanField
チェックボックス、値はTrueとFalse
RadioField
ラジオ・ボックスのセット
SelectField
ドロップダウンリスト
SelectMultipleField
複数の値を選択できるドロップダウン・リスト
SubmitField
フォーム送信ボタン
FileField
ファイルアップロードフィールド
FormField
フォームをフィールドとして別のフォームに埋め込む
FieldList
指定したタイプのフィールドのセット
+WTFormsに組み込まれた検証関数
表4-2
検証関数
はっきり言う
Eメールアドレスの確認
EqualTo
2つのフィールドの値を比較します.パスワードを2回入力して確認する場合によく使われます
IPAddress
IPv 4ネットワークアドレスの確認
Length
入力文字列の長さの検証
NumberRange
入力値が数値範囲内であることを確認
Optional
入力値なしで他の検証関数をスキップ
Required
フィールドにデータがあることを確認
Regexp
正規表現を使用した入力値の検証
URL
URLの検証
AnyOf
入力値がオプションの値リストにあることを確認します.
NoneOf
入力値がオプションリストにないことを確認します
フォームクラスをHTMLにレンダリング
ビュー関数集合でフォームクラスをインスタンス化し、インスタンスオブジェクトをパラメータとしてHTMLに入力すると行レンダリングがHTMLのフォームになります
# form
{# #}
フォーム検証
@app.route('/', methods=['GET', 'POST'])
def index():
#
form = NameForm()
name = None
#
if form.validate_on_submit():
name = form.name.data
form.name.data = ''
#
return render_template('form.html', form=form, name=name)
POSTリダイレクトGET
@app.route('/', methods=['GET', 'POST'])
def index():
#
form = NameForm()
#
if form.validate_on_submit():
session['name'] = form.name.data
return redirect(url_for('index'))
name = session.get('name')
#
return render_template('form.html', form=form, name=name)
###カスタムフィールド検証:
「validate」と書くことですフィールド'の関数は、次のとおりです.
class NameForm(FlaskForm):
name = StringField(' ', validators=[DataRequired()])
submit = SubmitField(' ')
#
def validate_name(self, field):
if len(field.data) < 6:
raise ValidationError(' 6 ')
Flashメッセージ表示
@app.route('/', methods=['GET', 'POST'])
def index():
#
form = NameForm()
#
if form.validate_on_submit():
last_name = session.get('name')
# , ,
if last_name and last_name != form.name.data:
flash(' ')
session['name'] = form.name.data
return redirect(url_for('index'))
name = session.get('name')
#
return render_template('form.html', form=form, name=name)
を使用するこの例では、コミットされるたびにユーザセッションに格納された名前と比較され、セッションに格納された名前は、前回このフォームにコミットされたデータである.2つの名前が異なる場合、flash()関数が呼び出され、クライアントに送信される次の応答にメッセージが表示されます.Flash()関数のみを呼び出すとメッセージが表示されず、プログラムで使用するテンプレートがこれらのメッセージをレンダリングします.すべてのページで使用できるように、テンプレートでFlashメッセージをレンダリングすることが望ましい.Flaskはget_をflashed_Messages()関数はテンプレートに開き、メッセージを取得してレンダリングします.{% for message in get_flashed_messages() %}
<div class="alert alert-warning alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert"
aria-label="Close"><span
aria-hidden="true">×span>button>
{{ message }}
div>
{% endfor %}
flask-moment
pip install flask-moment
from flask_moment import Moment
moment = Moment(app)
{% extends 'bootstrap/base.html' %}
{% block content %}
<div> :{{ moment(current_time).format('L') }}div>
<div> :{{ moment(current_time).format('YYYY-MM-DD') }}div>
<div> :{{ moment(current_time).fromNow() }}div>
{% endblock %}
{% block scripts %}
{{ super() }}
{# jquery,bootstrap , #}
{{ moment.include_jquery() }}
{# moment.js #}
{{ moment.include_moment() }}
{# , #}
{{ moment.locale('zh-CN') }}
{% endblock %}