表單 Flask-WTF - 使用


1 配置

可以使用Flask-WTF來處理web表單,在使用之前要先配置下,打開config.py,編輯添加如下內容

WTF_CSRF_ENABLED = True
SECRET_KEY = 'you-will-never-guess'

WTF_CSRF_ENABLED設置為True主要是開啟CSRF保護,SECRET_KEY是為了實現CSRF保護,Flask-WTF需要應用程序去配置一個加密密鑰。Flask-WTF使用這個密鑰去生成加密令牌用於驗證請求表單數據的真實性,注:為了提高安全性,密鑰應該存儲在一個環境變量中,而不是嵌入到代碼中。配置完成后要通知Flask去加載這個配置文件,編輯app/__init__.py,添加如下內容

from flask import Flask

app = Flask(__name__) app.config.from_object('config')

from app import views

 

2 表單類

使用Flask-WTF時,每個web表單是由繼承自 Form 類的子類來展現的。該類在表單中定義了一組表單域,每個都表示為一個對象。每個表單域都可以連接到一個或多個 validators ; validators 是一個用於檢查用戶提交的輸入是否合法的函數,app/forms.py 專門用來存放表單類,用例

from flask.ext.wtf import Form from wtforms import StringField, SubmitField from wtforms.validators import Required  class NameForm(Form): name = StringField('What is your name?', validators=[Required()]) submit = SubmitField('Submit')

示例中, NameForm 表單有一個 name 文本框和 submit 提交按鈕。 StringField 類表示一個 type="text" 屬性的 <input> 標簽。 SubmitField 類表示一個 type="submit" 屬性的 <input> 標簽。表單域構造函數的第一個參數是一個 label ,在渲染表單到HTML時會使用。StringField 構造函數包含可選參數 validators ,它定義了一組檢查來驗證用戶提交的數據。 Required() 驗證確保提交的表單域不為空

WTForms標准HTML表單域

WTForms驗證

3 表單渲染模版

假設視圖函數傳遞一個參數名為 form 的NameForm 實例給模板,模板就會生成一個簡單的HTML表單,如下所示:假設名字為nameform.html

<form method="POST"> { { form.name.label }} { { form.name() }} { { form.submit() }} </form>

當然,結果是什么都沒有。為了改變表單的外觀顯示,任何發送給該表單域的參數會被轉換為HTML表單域屬性;例如,你可以給定表單域 id 或 class 屬性,然后定義CSS樣式:即使有HTML屬性,努力用這種方式渲染表單是非常重要的,所以最好是盡可能的使用Bootstrap自帶的一系列表單樣式。Flask-Bootstrap使用Bootstrap的預定義表單樣式來提供高級的幫助函數來渲染整個Flask-WTF表單,這些操作都只需要一個調用即可完成

<form method="POST"> { { form.name.label }} { { form.name(id='my-text-field') }} { { form.submit() }} </form>
---完善 nameform.html

<!-- extend from base layout -->

{% extends "base.html" %}

{% block content %}

  <h1>{{title}}</h1>

  <form action="" method="post" name="nameform">

      {{ form.hidden_tag() }}

      {{ form.name.label }} {{ form.name() }}

      {{ form.submit() }}

  </form>

{% endblock %}

 

4 視圖函數使用表單

from .forms import NameForm

@app.route('/nameform', methods=['GET', 'POST'])

def nameform():

    form = NameForm()

    """

    處理接收表格數據,Flask-WTF讓這個工作變得簡單,validate_on_submit

    處理了所有表格的基本工作,只需要判斷然后直接引用數據即可

 

    調用validate_on_submit時,這個函數會嘗試接收用戶提交的所有數據,然后做下表格校驗,

    如果一切校驗都通過,意味着數據可以被合法安全處理,如果校驗不通過會直接刷新停在原來頁面

    那如何做錯誤信息提示呢?

    """

    if form.validate_on_submit():

        flash('%s' %(form.name.data))

        return redirect('/index')

   

    return render_template('nameform.html',

                           title='nameform',

                           form=form)

效果

 

5 出錯提醒

name再加個校驗器,需要輸入最少6個字符,最多35個字符

class NameForm(Form): name = StringField('What is your name?', validators=[Required(), validators.Length(min=6, max=35)]) submit = SubmitField('Submit')

點擊無反應,我們希望是能提示用戶錯誤信息,在哪里加,在渲染的html模版里面,錯誤信息會存放到form.FieldName.errors里面,改進渲染模版

<!-- extend from base layout -->

{% extends "base.html" %}

 

{% block content %}

  <h1>{{title}}</h1>

  <form action="" method="post" name="nameform">

      {{ form.hidden_tag() }}

      <p>

           {{ form.name.label }} {{ form.name() }}

           {% for error in form.name.errors %}

          <span style="color: red;">[{{ error }}]</span>

      {% endfor %}

           </p>

          

           <p>

           {{ form.submit() }}

           </p>

  </form>

{% endblock %}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM