摘要:在注冊和登錄功能實現(xiàn)中,我們已經(jīng)獲取到了頁面過來的登錄或者注冊數(shù)據(jù),接下來我們需要與數(shù)據(jù)庫中的數(shù)據(jù)做驗證,驗證通過才能登錄或者注冊。
在注冊和登錄功能實現(xiàn)(1)中,我們已經(jīng)獲取到了頁面POST過來的登錄或者注冊數(shù)據(jù),接下來我們需要與數(shù)據(jù)庫中的數(shù)據(jù)做驗證,驗證通過才能登錄或者注冊。我們平時在登錄網(wǎng)站時,如果輸入的用戶名或者密碼錯誤,有的網(wǎng)站是在登錄框附近提示錯誤,也有的是跳轉(zhuǎn)到一個頁面提示出錯,并經(jīng)過幾秒倒計時再返回原來的頁面。
我們在后續(xù)做搜索功能的時候,用頁面跳轉(zhuǎn)來處理未找到結(jié)果的情形,這里就通過使用Flask的flash功能,直接在當(dāng)前頁面顯示錯誤提示。簡單來說,步驟就是在視圖函數(shù)中flash一個字符串,在html模板中使用get_flashed_messages()去獲取這個字符串,并顯示在網(wǎng)頁中。
首先,我們先新建一個exts.py,用于存放一些功能性的函數(shù),在其中寫一個去驗證登錄和注冊信息的函數(shù),如下:
from models import Users def validate(username, password1, password2=None): user = Users.query.filter(Users.username == username).first() if password2: if user: return "用戶名已經(jīng)存在" else: if len(username) < 4: return "用戶名長度至少4個字符" elif password1 != password2: return "兩次密碼不一致" elif len(password1) < 6: return "密碼長度至少6個字符" else: return "注冊成功" else: if user: if user.password == password1: return "登錄成功" else: return "密碼錯誤" else: return "用戶名不存在"
要使用flash功能,還得設(shè)置一個名為SECRET_KEY的參數(shù),用于加密數(shù)據(jù),我們在config.py中寫進(jìn)去,隨便取個值SECRET_KEY = "THIS-A-SECRET-KEY"。然后在HarpQA.py中,從flask中導(dǎo)入flash,從exts.py中導(dǎo)入validate,修改register視圖函數(shù),如下:
from flask import Flask, render_template, request, flash from models import db from exts import validate import config app = Flask(__name__) app.config.from_object(config) db.init_app(app) ... @app.route("/register/", methods=["GET", "POST"]) def register(): if request.method == "GET": return render_template("register.html") else: username = request.form.get("username") password1 = request.form.get("password1") password2 = request.form.get("password2") message = validate(username, password1, password2) flash(message) return render_template("register.html")
在視圖函數(shù)中flash了message,接下來我們需要在html中顯示它,我們再去修改base.html(這樣對register.html和login.html都能起作用),在body區(qū)域尾部增加如下代碼(直接從Flask官方文檔復(fù)制修改的):
...{% block body_part %} {% endblock %}
然后運行程序,訪問注冊頁,隨便輸入幾個試試,發(fā)現(xiàn)已經(jīng)能用了:
只是不太美觀,我們再用css調(diào)整一下,借助Boostrap中的警告框樣式,最終結(jié)果如下:
登錄也是同理,就不演示啦。
2017年1月17日補充內(nèi)容:
當(dāng)我們登錄或注冊出現(xiàn)問題,出現(xiàn)的警告框是如上圖紅色的,顯然我們不希望登錄或者注冊成功的時候也是紅色的,我們將提示成功的顏色設(shè)置為藍(lán)色,然后傳入一個參數(shù)給模板,告訴模板現(xiàn)在是成功還是失敗的情況,然后在html中增加if,現(xiàn)在的html代碼如下:
那么status這個參數(shù)是怎么傳遞給模板呢,我們之前提到在render_templates函數(shù)中傳入,現(xiàn)在我們使用@app.context_processor這個裝飾器,它其實是上下文管理器,其裝飾的函數(shù)返回的內(nèi)容對所有html模板都起作用,用法如下:
@app.context_processor def my_context_processor(): status = session.get("status", "") return {"status": status}
將其放在HarpQA.py中,它返回一個字典,在任意html中使用{{ key }},就能得到這個字典key對應(yīng)的value。那么session是什么?在現(xiàn)在這個case中,我們簡單理解其為一個保存數(shù)據(jù)的容器,在登錄和注冊的視圖函數(shù)中,驗證完賬號密碼之后,將驗證結(jié)果的信息存入session,例如注冊函數(shù)修改如下:
@app.route("/register/", methods=["GET", "POST"]) def register(): if request.method == "GET": return render_template("register.html") else: username = request.form.get("username") password1 = request.form.get("password1") password2 = request.form.get("password2") message = validate(username, password1, password2) flash(message) if message == "注冊成功": session["status"] = "OK" return redirect(url_for("login")) else: session["status"] = "BAD" return render_template("register.html")
如果注冊成功,就向session中寫入status,值為"OK",反之則為"BAD"。這樣html模板就能根據(jù)status顯示不同的顏色了。flask中還有個g對象也可用于保存和共享數(shù)據(jù),但g對象是基于每一個請求的,不能跨請求使用。我們注冊成功之后,要跳轉(zhuǎn)到登錄頁,此時g就無法使用了,而session是基于這一次http連接的,不同請求都能使用。
實際上更簡單的方法是,我們直接對傳入的{{ message }}進(jìn)行判斷,如果帶有"成功"字符串,就顯示藍(lán)色,否則就顯示紅色。上文主要是為了說明@app.context_processor這個裝飾器,以及session和g對象的區(qū)別。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/41271.html
摘要:目前我們的已經(jīng)完成了注冊和登錄功能,當(dāng)?shù)卿洺晒χ螅撁嫣D(zhuǎn)到首頁,此時我們需要保存用戶的登錄狀態(tài),不管頁面如何跳轉(zhuǎn),除非用戶自己注銷登錄。 目前我們的demo已經(jīng)完成了注冊和登錄功能,當(dāng)?shù)卿洺晒χ螅撁嫣D(zhuǎn)到首頁,此時我們需要保存用戶的登錄狀態(tài),不管頁面如何跳轉(zhuǎn),除非用戶自己注銷登錄。 如之前所說,我們可以用session來保存用戶登錄的這個狀態(tài),當(dāng)?shù)卿涷炞C成功的時候,將當(dāng)前登錄...
摘要:本篇博客講解如何實現(xiàn)前后端的簡單登錄注冊界面,后端代碼由實現(xiàn),主要闡述登錄注冊時網(wǎng)頁工作原理。四登錄后跳轉(zhuǎn)首頁登錄界面獲取到瀏覽器設(shè)置的,再次向服務(wù)器請求跳轉(zhuǎn)到首頁時需要附上這段,服務(wù)器讀取后同意跳轉(zhuǎn)到首頁。 本篇博客講解如何實現(xiàn)前后端的簡單登錄注冊界面,后端代碼由node.js實現(xiàn),主要闡述登錄注冊時網(wǎng)頁工作原理。感興趣的同學(xué)可以參考一下。 注冊界面 功能: 判斷用戶是否輸入郵箱,...
摘要:本篇博客講解如何實現(xiàn)前后端的簡單登錄注冊界面,后端代碼由實現(xiàn),主要闡述登錄注冊時網(wǎng)頁工作原理。四登錄后跳轉(zhuǎn)首頁登錄界面獲取到瀏覽器設(shè)置的,再次向服務(wù)器請求跳轉(zhuǎn)到首頁時需要附上這段,服務(wù)器讀取后同意跳轉(zhuǎn)到首頁。 本篇博客講解如何實現(xiàn)前后端的簡單登錄注冊界面,后端代碼由node.js實現(xiàn),主要闡述登錄注冊時網(wǎng)頁工作原理。感興趣的同學(xué)可以參考一下。 注冊界面 功能: 判斷用戶是否輸入郵箱,...
摘要:在文件的標(biāo)簽中加上以下代碼新手上路注冊登陸上面只是引用了一些簡單的的,也沒什么難的,不用傷心。 Laravel身為最優(yōu)雅的PHP框架,很多學(xué)習(xí)PHP的小伙伴造就對Laravel垂涎欲滴。今天就來實現(xiàn)你的愿望,讓我們一起從零開始,利用Laravel實現(xiàn)Web應(yīng)用最常見的注冊和登錄功能!所有的課程源碼已放在Github上:laravel-start. Race Start ! 首先我們來...
閱讀 4122·2022-09-16 13:49
閱讀 1398·2021-11-22 15:12
閱讀 1519·2021-09-09 09:33
閱讀 1039·2019-08-30 13:15
閱讀 1720·2019-08-29 15:30
閱讀 654·2019-08-27 10:52
閱讀 2643·2019-08-26 17:41
閱讀 1896·2019-08-26 12:11