python大佬養成計劃----flask應用(表單)

1. 爲何使用Flask-WTF?

request對象公開了全部客戶端發送的請求信息。特別是request.form能夠訪問POST請求提交的表單數據。
儘管Flask的request對象提供的支持足以處理web表單,但依然有許多任務會變得單調且重複。
表單的HTML代碼生成和驗證提交的表單數據就是兩個很好的例子。

優點:html

Flask-WTF擴展使得處理web表單能得到更愉快的體驗。該擴展是一個封裝了與框架無關的WTForms包的Flask集成。

2. 什麼是表單處理?

在網頁中,爲了和用戶進行信息交互老是不得不出現一些表單。
flask設計了WTForm表單庫來使flask能夠更加簡便地管理操做表單數據。
WTForm中最重要的幾個概念以下:

1). Form類,開發者自定義的表單必須繼承自Form類或者其子類。
Form類最主要的功能是經過其所包含的Field類提供對錶單內數據的快捷訪問方式。

2). 各類Field類,即字段。通常而言每一個Field類都對應一個input的HTML標籤。
好比WTForm自帶的一些Field類好比BooleanField就對應<input type="checkbox">,
SubmitField就對應<input type="submit">等等。

3). Validator類。這個類用於驗證用戶輸入的數據的合法性。
好比Length驗證器能夠用於驗證輸入數據的長度,
FileAllowed驗證上傳文件的類型等等。

  另外,flask爲了防範csfr(cross-site request forgery)攻擊, 默認在使用flask-wtf以前要求app必定要設置過secret_key。 最簡單地能夠經過app.config['SECRET_KEY'] = 'xxxx'來配置。前端

3. 常見的Field類

  PasswordField   密碼字段,自動將輸入轉化爲小黑點web

  DateField   文本字段,格式要求爲datetime.date同樣正則表達式

  IntergerField   文本字段,格式要求是整數flask

  DecimalField   文本字段,格式要求和decimal.Decimal同樣bootstrap

  FloatField   文本字段,值是浮點數app

  BooleanField   複選框,值爲True或者False框架

  RadioField   一組單選框dom

  SelectField   下拉列表,須要注意一下的是choices參數肯定了下拉選項,函數

可是和HTML中的<select> 標籤同樣,其是一個tuple組成的列表,
                   能夠認爲每一個tuple的第一項是選項的真正的值,而第二項是alias。

  MultipleSelectField  可選多個值的下拉列表

Validator驗證函數

Validator是驗證函數,把一個字段綁定某個驗證函數以後,flask會在接收表單中的數據以前對數據作一個驗證,
若是驗證成功纔會接收數據。驗證函數Validator以下,具體的validator可能須要的參數不太同樣,這裏只給出
一些經常使用的,更多詳細的用法能夠參見wtforms/validators.py文件的源碼,參看每個validator類須要哪些參數:

  *基本上每個validator都有message參數,指出當輸入數據不符合validator要求時顯示什麼信息。

  Email  驗證電子郵件地址的合法性,要求正則模式是^.+@(12+)$

  EqualTo  比較兩個字段的值,一般用於輸入兩次密碼等場景,可寫參數fieldname,不過注意其是一個字符串變量,指向同表單中的另外一個字段的字段名

  IPAddress  驗證IPv4地址,參數默認ipv4=True,ipv6=False。若是想要驗證ipv6能夠設置這兩個參數反過來。

  Length  驗證輸入的字符串的長度,能夠有min,max兩個參數指出要設置的長度下限和上限,注意參數類型是字符串,不是INT!!

  NumberRange  驗證輸入數字是否在範圍內,能夠有min和max兩個參數指出數字上限下限,注意參數類型是字符串,不是INT!!而後在這個validator的message參數裏能夠設置%(min)s和%(max)s兩個格式化部分,來告訴前端這個範圍究竟是多少。其餘validator也有這種相似的小技巧,能夠參看源碼。

  Optional  無輸入值時跳過同字段的其餘驗證函數

  Required  必填字段

  Regexp  用正則表達式驗證值,參數regex='正則模式'

  URL  驗證URL,要求正則模式是^[a-z]+://(?P<host>3+)(?P<port>:[0-9]+)?(?P<path>/.*)?$

  AnyOf  確保值在可選值列表中。參數是values(一個可選值的列表)。特別提下,和SelectField進行配合使用時,不知道爲何SelectField的choices中項的值不能是數字。。不然AnyOf的values參數中即便有相關數字也沒法識別出當前選項是合法選項。我懷疑NoneOf可能也是同樣的套路。

  NoneOf  確保值不在可選值列表中

#forms.py文件:用來設定規則
from flask_wtf import FlaskForm
from flask_wtf.file import FileRequired, FileAllowed
from wtforms import StringField, PasswordField, SubmitField, FileField
from wtforms.validators import DataRequired, Length


class LoginForm(FlaskForm):
    name = StringField(
        label="用戶名/郵箱/手機號",
        validators=[
            # DataRequired("請輸入用戶名"),
            Length(3, 20, message="長度不符"),
        ]
    )
    passwd = PasswordField(
        label="密碼",
        validators=[
            # DataRequired("請輸入密碼"),
            Length(3, 20),
        ], )

    file = FileField(
        label="簡歷",
        validators=[
            FileRequired(),
            FileAllowed(['pdf', 'txt'], 'pdf 能被接收')
        ]
    )
#templates/demo/login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="POST" action="/login/">
    {{ form.hidden_tag() }}
    {{ form.name.label }} {{ form.name }}
    {{ form.passwd.label }} {{ form.passwd }}
    {{ form.file }}
    <input type="submit" value="Go">
</form>

</body>
</html>
#主程序
import random
from flask import Flask, redirect, render_template
from forms import LoginForm
from flask_bootstrap import  Bootstrap

app = Flask(__name__)
bootstrap = Bootstrap(app)
app.config['SECRET_KEY'] =  random._urandom(24)

@app.route('/success/')
def success():
    return  "success"

@app.route('/login/', methods=('GET', 'POST'))
def submit():
    # 實例化表單對象;
    form = LoginForm()
    if form.validate_on_submit():
        print(form.data)
        return redirect('/success/')
    return render_template('demo/login.html', form=form)
app.run()

圖片描述


  1. .@
  2. @
  3. /:
相關文章
相關標籤/搜索