本案例通過實現一個註冊頁面的編寫,來帶你瞭解FLASK-WTF的運用. 主要功能為表單基礎的功能--手機號碼必須為11位數,且通過資料庫查找不能有已經註冊的了,密碼要求輸入兩遍且必須一樣,且所有內容不能為空的提示等內容.那麼現在就開始把! 一.創建表單類. 首先運用flask-wtf你必須確保你的環 ...
本案例通過實現一個註冊頁面的編寫,來帶你瞭解FLASK-WTF的運用.
主要功能為表單基礎的功能--手機號碼必須為11位數,且通過資料庫查找不能有已經註冊的了,密碼要求輸入兩遍且必須一樣,且所有內容不能為空的提示等內容.那麼現在就開始把!
一.創建表單類.
首先運用flask-wtf你必須確保你的環境中已經安裝wtf,如果你是python3的環境,我們可以通過 pip3 install Flask-WTF 來進行安裝.
安裝好了之後我們來進行導入:
from flask_wtf import Form from wtforms import StringField, SubmitField, PasswordField, ValidationError from wtforms.validators import DataRequired, EqualTo, Length from models import USER
讓我們一步步來理解!!
第一行代碼我們從 falsk-wtf 中導入了 Form 類,以後我們創建的所有表單類都要繼承自這個類.
第二行代碼我們從 wtforms 中導入了 StringField,SubmitField,PasswordField,ValidationError ,那麼這些東西是用來乾什麼的呢?我相信如果稍微過一些HTML的人應該都認識HTML表單中<input>元素的type="text",type="submit",type="password"這類屬性吧.原理是一樣的.
第三行代碼我們又從 wtforms.validators 中導入了 DataRequired,EqualTo,Length ,其中 DataRequired用來驗證表單數據不能為空, EqualTo 常用來比較兩個代碼是不是相等, Length 用來限制字元長度.
第四行代碼是導入資料庫模型的USER類,用來查詢資料庫中是不是已經註冊了手機號.如果已經註冊了,再用第二行代碼的 ValidationError 來拋出警告.
實例如下:
class Regist(Form): phone = StringField("請輸入手機號", validators=[DataRequired(), Length(min=11, max=11, message="手機號碼是11位數")]) name = StringField("請輸入用戶名", validators=[DataRequired()]) password = PasswordField("請輸入密碼", validators=[DataRequired()]) password1 = PasswordField("請重覆密碼", validators=[DataRequired(), EqualTo("password", "密碼必須一樣")]) submit = SubmitField("立即提交") def validate_phone(self, field): if USER.query.filter_by(phone=field.data).first(): raise ValidationError("傻子,你的手機號碼被註冊了!!")
如此一個註冊表單類就建立成功了!!
二.視圖函數中編寫邏輯
我先直接把代碼列出來:
# 註冊界面 @app.route("/regist/", methods=["GET", "POST"]) def regist(): form = Regist() if form.validate_on_submit(): telephone = form.phone.data username = form.name.data password = form.password.data if form.validate_phone(): user = USER(phone=telephone, name=username, password=password) db.session.add(user) db.session.commit() return redirect(url_for("login")) else: return render_template("regist.html", form=form)
我們先用 form=Regist() 實例化一個表單類的對象,後面緊跟著一個條件語句, validate_on_submit 意思是判斷表單內的數據是不是為空,最大長度是不是....等先前設置的限制條件以及判斷表單內容是不是提交過了.如果是,那麼就意味著我們提交了表單數據,並且進行後面的操作,如果不是.就意味著我們只是打開了這個註冊頁面,用 return render_template("regist.html", form=form) 渲染模板,並且把實例化的對象form作為參數傳遞到模板中.
我們接著繼續提交表單後的代碼理解 telephone = form.phone.data username = form.name.data password = form.password.data 這三行代碼是獲取用戶填寫的手機號,用戶名,密碼這些數據.
獲取之後,我們在進行判斷.調用註冊表單類的validate_phone()函數,如果忘記內容可以再看看上面.如果為true,就代表著這個手機號沒有被註冊,繼續進行後面的把用戶填寫的數據存進資料庫的操作.
user = USER(phone=telephone, name=username, password=password)
這段代碼的意思是USER用戶表中有phone,name,password的屬性.我們把獲取的用戶數據telephone,username,password賦值給它,在通過 db.session.add(user) db.session.commit() 這兩行代碼提交到資料庫中.
資料庫中是用到了flask-sqlalchemy,這裡不做具體講解,以後有機會再講.我把代碼貼出來:
lass USER(db.Model): __tablename__="user" id=db.Column(db.Integer,primary_key=True,autoincrement=True) phone=db.Column(db.String(11),nullable=False) name=db.Column(db.String(50),nullable=False) password=db.Column(db.String(100),nullable=False)
三.在模板中運用
第三步也是最後一步.如果你的項目運用了flask-bootstrap的話,可以通過:
{% import "bootstrap/wtf.html" as wtf %} <form action="" method="post"> {% block page_content %} {{ wtf.quick_form(form) }} {% endblock %} </form>
wtf.quick_form(form)直接生成表單,是不是很方便?當然沒有樣式,如果你要添加樣式的話可以這樣:
<form method="POST"> {{ form.hidden_tag() }} {{ form.name.label }} {{ form.name(id='my-text-field') }} {{ form.submit() }} </form>
好了,到這裡就結束了.如果你把這些全弄懂了,你還可以直接閱讀它的中文文檔.
待續..........