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