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