成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用Flask-WTF制作一個帶驗證碼的登陸表單

i_garfileo / 805人閱讀

摘要:目前還不是很熟悉的驗證表單的原理,比如驗證應(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.hidden_tag() }}
{{ form.username.label(class="control-label") | safe }} {{ form.username(class="form-control", required=True) }}
{{ form.email.label(class="control-label") | safe }} {{ form.email(class="form-control", required=True) }}
{% if form.errors.password %}
{{ form.password.label(class="control-label") | safe }} {{ form.password(class="form-control", required=True) }} {% for error in form.errors.password %}

{{ error }}

{% endfor %}
{% else %}
{{ form.password.label(class="control-label") | safe }} {{ form.password(class="form-control", required=True) }}
{% endif %} {% if form.errors.password1 %}
{{ form.password1.label(class="control-label") | safe }} {{ form.password1(class="form-control", required=True) }} {% for error in form.errors.password1 %}

{{ error }}

{% endfor %}
{% else %}
{{ form.password1.label(class="control-label") | safe }} {{ form.password1(class="form-control", required=True) }}
{% endif %} {% if form.errors.verification_code %}
{{ form.verification_code.label(class="control-label") | safe }} {{ form.verification_code(class="form-control", required=True) }} {% for error in form.errors.verification_code %}

{{ error }}

{% endfor %}
{% else %}
{{ form.verification_code.label(class="control-label") | safe }} {{ form.verification_code(class="form-control", required=True) }}
{% endif %} {{ form.submit(class="btn btn-info submit") }}

下面是在編寫以上代碼時遇到的坑:

在模板中需要處理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

相關(guān)文章

  • Flask Web Development —— Web表單(上)

    摘要:每個表單域都可以連接到一個或多個是一個用于檢查用戶提交的輸入是否合法的函數(shù)。表單域構(gòu)造函數(shù)的第一個參數(shù)是一個,在渲染表單到時會使用。驗證確保提交的表單域不為空。表單域驗證都是直接從包中導(dǎo)入。表格展示了一組支持的標(biāo)準(zhǔn)表單域。 第二章中介紹的request對象公開了所有客戶端發(fā)送的請求信息。特別是request.form可以訪問POST請求提交的表單數(shù)據(jù)。 盡管Flask的request...

    CODING 評論0 收藏0
  • Servlet第六篇【Session介紹、API、生命周期、應(yīng)用、與Cookie區(qū)別】

    摘要:于是乎服務(wù)器向用戶瀏覽器發(fā)送了一個名為的,它的值是的值。標(biāo)記著該用戶已經(jīng)登陸了跳轉(zhuǎn)到其他頁面,告訴用戶成功登陸了。注冊多個用戶,不斷發(fā)帖子,擾亂正常發(fā)帖秩序。在處理表單的中刷新。監(jiān)聽用戶提交事件。 什么是Session Session 是另一種記錄瀏覽器狀態(tài)的機(jī)制。不同的是Cookie保存在瀏覽器中,Session保存在服務(wù)器中。用戶使用瀏覽器訪問服務(wù)器的時候,服務(wù)器把用戶的信息以某種...

    Java_oldboy 評論0 收藏0
  • Servlet第六篇【Session介紹、API、生命周期、應(yīng)用、與Cookie區(qū)別】

    摘要:于是乎服務(wù)器向用戶瀏覽器發(fā)送了一個名為的,它的值是的值。標(biāo)記著該用戶已經(jīng)登陸了跳轉(zhuǎn)到其他頁面,告訴用戶成功登陸了。注冊多個用戶,不斷發(fā)帖子,擾亂正常發(fā)帖秩序。在處理表單的中刷新。監(jiān)聽用戶提交事件。 什么是Session Session 是另一種記錄瀏覽器狀態(tài)的機(jī)制。不同的是Cookie保存在瀏覽器中,Session保存在服務(wù)器中。用戶使用瀏覽器訪問服務(wù)器的時候,服務(wù)器把用戶的信息以某種...

    fox_soyoung 評論0 收藏0
  • Python入門網(wǎng)絡(luò)爬蟲之精華版

    摘要:學(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)我們在瀏覽器中輸入...

    Bmob 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<