Flask WTF

2023-01-30 15:41 更新

Web應(yīng)用程序的一個重要方面是為用戶提供用戶界面。HTML提供了一個<form>標(biāo)簽,用于設(shè)計界面。

可以適當(dāng)?shù)厥褂?strong>Form(表單) 元素,例如文本輸入,單選按鈕,選擇等。

用戶輸入的數(shù)據(jù)以Http請求消息的形式通過GET或POST方法提交給服務(wù)器端腳本。

  • 服務(wù)器端腳本必須從http請求數(shù)據(jù)重新創(chuàng)建表單元素。因此,實際上,表單元素必須定義兩次 - 一次在HTML中,另一次在服務(wù)器端腳本中。

  • 使用HTML表單的另一個缺點是很難(如果不是不可能的話)動態(tài)呈現(xiàn)表單元素。HTML本身無法驗證用戶的輸入。

這就是WTForms的作用,一個靈活的表單,渲染和驗證庫,能夠方便使用。

Flask-WTF擴(kuò)展為這個WTForms庫提供了一個簡單的接口。

使用Flask-WTF,我們可以在Python腳本中定義表單字段,并使用HTML模板進(jìn)行渲染。還可以將驗證應(yīng)用于WTF字段。

讓我們看看這種動態(tài)生成的HTML是如何工作的。

首先,需要安裝Flask-WTF擴(kuò)展。

pip install flask-WTF

已安裝的軟件包包含一個Form類,該類必須用作用戶定義表單的父級。

WTforms包中包含各種表單字段的定義。下面列出了一些標(biāo)準(zhǔn)表單字段。

序號 標(biāo)準(zhǔn)表單字段與描述
1

TextField

表示<input type ='text'> HTML表單元素

2

BooleanField

表示<input type ='checkbox'> HTML表單元素

3

DecimalField

用于顯示帶小數(shù)的數(shù)字的文本字段

4

IntegerField

用于顯示整數(shù)的文本字段

5

RadioField

表示<input type = 'radio'> HTML表單元素

6

SelectField

表示選擇表單元素

7

TextAreaField

表示<textarea> HTML表單元素

8

PasswordField

表示<input type = 'password'> HTML表單元素

9

SubmitField

表示<input type = 'submit'>表單元素

例如,包含文本字段的表單可以設(shè)計如下:

from flask_wtf import Form
from wtforms import TextField

class ContactForm(Form):
   name = TextField("Name Of Student")

除了'name'字段,還會自動創(chuàng)建CSRF令牌的隱藏字段。這是為了防止Cross Site Request Forgery(跨站請求偽造攻擊。

渲染時,這將導(dǎo)致等效的HTML腳本,如下所示:

<input id = "csrf_token" name = "csrf_token" type = "hidden" />
<label for = "name">Name Of Student</label><br>
<input id = "name" name = "name" type = "text" value = "" />

在Flask應(yīng)用程序中使用用戶定義的表單類,并使用模板呈現(xiàn)表單。

from flask import Flask, render_template
from forms import ContactForm
app = Flask(__name__)
app.secret_key = 'development key'

@app.route('/contact')
def contact():
   form = ContactForm()
   return render_template('contact.html', form = form)

if __name__ == '__main__':
   app.run(debug = True)

WTForms包也包含驗證器類。它對表單字段應(yīng)用驗證很有用。以下列表顯示了常用的驗證器。

序號 驗證器類與描述
1

DataRequired

檢查輸入字段是否為空

2

Email

檢查字段中的文本是否遵循電子郵件ID約定

3

IPAddress

在輸入字段中驗證IP地址

4

Length

驗證輸入字段中的字符串的長度是否在給定范圍內(nèi)

5

NumberRange

驗證給定范圍內(nèi)輸入字段中的數(shù)字

6

URL

驗證在輸入字段中輸入的URL

現(xiàn)在,我們將對聯(lián)系表單中的name字段應(yīng)用'DataRequired'驗證規(guī)則。

name = TextField("Name Of Student",[validators.Required("Please enter your name.")])

如果驗證失敗,表單對象的validate()函數(shù)將驗證表單數(shù)據(jù)并拋出驗證錯誤。Error消息將發(fā)送到模板。在HTML模板中,動態(tài)呈現(xiàn)error消息。

{% for message in form.name.errors %}
   {{ message }}
{% endfor %}

以下示例演示了上面給出的概念。Contact表單的設(shè)計如下(forms.py)。

from flask_wtf import FlaskForm
from wtforms import TextField, IntegerField, TextAreaField, SubmitField, RadioField,
   SelectField

from wtforms import validators, ValidationError

class ContactForm(Form):
   name = TextField("Name Of Student",[validators.Required("Please enter 
      your name.")])
   Gender = RadioField('Gender', choices = [('M','Male'),('F','Female')])
   Address = TextAreaField("Address")
   
   email = TextField("Email",[validators.Required("Please enter your email address."),
      validators.Email("Please enter your email address.")])
   
   Age = IntegerField("age")
   language = SelectField('Languages', choices = [('cpp', 'C&plus;&plus;'), 
      ('py', 'Python')])
   submit = SubmitField("Send")

驗證器應(yīng)用于Name Email字段。

下面給出了Flask應(yīng)用程序腳本(formexample.py)。

from flask import Flask, render_template, request, flash
from forms import ContactForm
app = Flask(__name__)
app.secret_key = 'development key'

@app.route('/contact', methods = ['GET', 'POST'])
def contact():
   form = ContactForm()
   
   if request.method == 'POST':
      if form.validate() == False:
         flash('All fields are required.')
         return render_template('contact.html',form = form)
      else:
         return render_template('success.html')
   elif request.method == 'GET':
      return render_template('contact.html',form = form)

if __name__ == '__main__':
   app.run(debug = True)

模板(contact.html)的腳本如下:

<!doctype html>
<html>
   <body>
   
      <h2 style = "text-align: center;">Contact Form</h2>
		
      {% for message in form.name.errors %}
         <div>{{ message }}</div>
      {% endfor %}
     
      
      <form action = "http://localhost:5000/contact" method = post>
         <fieldset>
            <legend>Contact Form</legend>
            {{ form.hidden_tag() }}
            
            <div style ="font-size:20px;font-weight:bold;margin-left:150px;">
               {{ form.name.label }}<br>
               {{ form.name }}
               <br>
               
               {{ form.Gender.label }} {{ form.Gender }}
               {{ form.Address.label }}<br>
               {{ form.Address }}
               <br>
               
               {{ form.email.label }}<br>
               {{ form.email }}
               <br>
               
               {{ form.Age.label }}<br>
               {{ form.Age }}
               <br>
               
               {{ form.language.label }}<br>
               {{ form.language }}
               <br>
               {{ form.submit }}
            </div>
            
         </fieldset>
      </form>
      
   </body>
</html>

在Python shell中運(yùn)行formexample.py,訪問URL http://localhost:5000/contact顯示Contact表單將如下所示。

Form Example

如果有任何錯誤,頁面將如下所示:

Form Error Page

如果沒有錯誤,將顯示'success.html'

Form Success Page

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號