摘要:目前還不是很熟悉的驗證表單的原理,比如驗證應(yīng)該是用,這種就是放在后端處理的。此時就需要手動控制表單的生成。如果表單驗證失敗,失敗的消息保存在中。
Flask-WTF遇到的坑
在使用Flask-WTF的時候,使用qucik_form()快速生成表單的確是很爽,但是生成的表單的樣式并不是想要的,這個時候就不能使用qucik_form()了。
PS:目前還不是很熟悉Flask-WTF的驗證表單的原理,比如Require()驗證應(yīng)該是用JS,EqualTo這種就是放在后端處理的。有時間了需要好好讀一讀官方文檔。
在froms.py中定義了如下的Register表單:
class RegisterForm(Form): """注冊表單""" username = StringField(u"昵稱", validators=[Required()]) email = StringField(u"郵箱", validators=[Required(), Email()]) password = PasswordField(u"密碼", validators=[Required(), Length(6, 12, message=u"密碼長度在6到12為")]) password1 = PasswordField(u"確認(rèn)密碼", validators=[Required(), Length(6, 12, message=u"密碼長度在6到12為"), EqualTo("password", message=u"密碼必須一致")]) verification_code = StringField(u"驗證碼", validators=[Required(), Length(4, 4, message=u"填寫4位驗證碼")]) submit = SubmitField(u"注冊")
在verification_code字段中,需要加載驗證碼圖片,此時在模板中使用qucik_form()就很難處理了。
此時就需要手動控制表單的生成。
自定義生成表單在模板中,手動渲染很麻煩:
下面是在編寫以上代碼時遇到的坑:
在模板中需要處理form.errors。如果表單驗證失敗,失敗的消息保存在form.errors中。
如果表單驗證錯誤,沒有處理`form.errors`的話前端就不會有任何提示,給人造成的錯覺就是`validate_on_submit`方法沒有執(zhí)行。
不要忘記form.hidden_tag()。這個是加載并隱藏csrf_token。沒有csrf_token,一般會報錯。
沒有銀彈
上面的代碼只實現(xiàn)了非空驗證、密碼是否相等驗證、密碼長度驗證等功能,不知道不用Flask-WTF改用HTML + JS實現(xiàn)是不是代碼量差不多。
生成驗證碼使用PIL來生成圖片。廖雪峰有介紹如何生成驗證碼圖片PIL-廖雪峰
在views.py中處理表單處理表單的邏輯:
每次有請求后,就調(diào)用generate_verification_code()返回一個驗證碼圖片的url和驗證碼文本,然后將驗證碼保存在session中。
每次驗證表單后,驗證表單中輸入的驗證碼時候和session中的一致
按條件返回模板
代碼如下:
@user.route("/register", methods=["GET", "POST"]) def register(): form = RegisterForm() if form.validate_on_submit(): username = form.username.data print username if get_user(username): print "賬號已被注冊" flash(u"賬號已被注冊") code_img, code_text = generate_verification_code() session["code_text"] = code_text return render_template("user/register.html", form=form, code_img=code_img) if "code_text" in session and session["code_text"] != form.verification_code.data: code_img, code_text = generate_verification_code() session["code_text"] = code_text return render_template("user/register.html", form=form, code_img=code_img) email = form.email.data password = form.password.data user = User(username=username, password=password, email=email) try: db.session.add(user) db.session.commit() return redirect(url_for(".index")) except: print traceback.print_exc() db.session.rollback() flash(u"注冊失敗") code_img, code_text = generate_verification_code() session["code_text"] = code_text return render_template("user/register.html", form=form, code_img=code_img) code_img, code_text = generate_verification_code() session["code_text"] = code_text return render_template("user/register.html", form=form, code_img=code_img)
將驗證碼保存在圖片中不是一個號辦法,目前也沒有想到如何保存。
最終結(jié)果文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/37769.html
摘要:每個表單域都可以連接到一個或多個是一個用于檢查用戶提交的輸入是否合法的函數(shù)。表單域構(gòu)造函數(shù)的第一個參數(shù)是一個,在渲染表單到時會使用。驗證確保提交的表單域不為空。表單域驗證都是直接從包中導(dǎo)入。表格展示了一組支持的標(biāo)準(zhǔn)表單域。 第二章中介紹的request對象公開了所有客戶端發(fā)送的請求信息。特別是request.form可以訪問POST請求提交的表單數(shù)據(jù)。 盡管Flask的request...
摘要:于是乎服務(wù)器向用戶瀏覽器發(fā)送了一個名為的,它的值是的值。標(biāo)記著該用戶已經(jīng)登陸了跳轉(zhuǎn)到其他頁面,告訴用戶成功登陸了。注冊多個用戶,不斷發(fā)帖子,擾亂正常發(fā)帖秩序。在處理表單的中刷新。監(jiān)聽用戶提交事件。 什么是Session Session 是另一種記錄瀏覽器狀態(tài)的機(jī)制。不同的是Cookie保存在瀏覽器中,Session保存在服務(wù)器中。用戶使用瀏覽器訪問服務(wù)器的時候,服務(wù)器把用戶的信息以某種...
摘要:于是乎服務(wù)器向用戶瀏覽器發(fā)送了一個名為的,它的值是的值。標(biāo)記著該用戶已經(jīng)登陸了跳轉(zhuǎn)到其他頁面,告訴用戶成功登陸了。注冊多個用戶,不斷發(fā)帖子,擾亂正常發(fā)帖秩序。在處理表單的中刷新。監(jiān)聽用戶提交事件。 什么是Session Session 是另一種記錄瀏覽器狀態(tài)的機(jī)制。不同的是Cookie保存在瀏覽器中,Session保存在服務(wù)器中。用戶使用瀏覽器訪問服務(wù)器的時候,服務(wù)器把用戶的信息以某種...
摘要:學(xué)習(xí)網(wǎng)絡(luò)爬蟲主要分個大的版塊抓取,分析,存儲另外,比較常用的爬蟲框架,這里最后也詳細(xì)介紹一下。網(wǎng)絡(luò)爬蟲要做的,簡單來說,就是實現(xiàn)瀏覽器的功能。 Python學(xué)習(xí)網(wǎng)絡(luò)爬蟲主要分3個大的版塊:抓取,分析,存儲 另外,比較常用的爬蟲框架Scrapy,這里最后也詳細(xì)介紹一下。 首先列舉一下本人總結(jié)的相關(guān)文章,這些覆蓋了入門網(wǎng)絡(luò)爬蟲需要的基本概念和技巧:寧哥的小站-網(wǎng)絡(luò)爬蟲,當(dāng)我們在瀏覽器中輸入...
閱讀 4592·2021-09-10 11:22
閱讀 543·2019-08-30 11:17
閱讀 2576·2019-08-30 11:03
閱讀 439·2019-08-29 11:18
閱讀 3466·2019-08-28 17:59
閱讀 3225·2019-08-26 13:40
閱讀 3174·2019-08-26 10:29
閱讀 1145·2019-08-26 10:14