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はこの鍵を用いて暗号化トークンを生成し,トークンで要求中のフォームデータの真偽を検証する.
#       :
app.config['SECRET_KEY'] = '       '

フォームクラス
flask_の使用wtfの場合、各フォームはクラスとして抽象化され、このクラスはFlaskFormクラスから継承され、このクラスは様々なフォームのフィールドを定義し、各フィールドはオブジェクトで表される.そしてflask_wtfには、ユーザがコミットした入力値が要求に合致するかどうかを検証するための様々な検証関数も定義されている.
#      html     
"post"> :"text" name="username" /> "submit" value=" " />
# 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()は、コミットされたフィールドが空でないことを確認します.
  • 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のフォームになります
    #          form   
    {#    #}
    
    {{ form.hidden_tag() }} {{ form.name.label() }}{{ form.name(id='xxx',class='yyy') }} {{ form.submit() }} form> {# bootstrap #} {% extends 'bootstrap/base.html' %} {% import 'bootstrap/wtf.html' as wtf %} {% block content %} <div class="container">{{ wtf.quick_form(form) }}div> {% endblock %}

    フォーム検証
       @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メッセージ表示
  • 説明:ユーザが要求を出した後、状態が変化し、プロンプトや警告などの情報を与える必要がある場合、警告ボックスをポップアップすることで、ユーザは手動でキャンセルすることができる.
  • 使用:適切なタイミングでflashメッセージを書き、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
    flask-moment
  • は、この拡張がJqueryに依存する時間ローカライズ表示のライブラリであることを示している.
  • 取付: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 %}
  • を使用