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