摘要:現在數據獲取到了,提示也有了,我們需要把注冊的數據寫入到數據庫,這一步很簡單,直接使用之前提到過的方法,但是我們不能直接把明文密碼寫入到數據庫中,那樣做是十分不安全的,我們需要將其加密之后再寫進去,具體是用到中的這個函數,將字符串變成值。
現在數據獲取到了,提示也有了,我們需要把注冊的數據寫入到數據庫,這一步很簡單,直接使用之前提到過的方法,但是我們不能直接把明文密碼寫入到數據庫中,那樣做是十分不安全的,我們需要將其加密之后再寫進去,具體是用到werkzeug.security中的generate_password_hash這個函數,將字符串變成hash值。
我們可以在User模型中重寫__init__函數(或__setattr__),當傳入password自動調用generate_password_hash進行加密,如:
class Users(db.Model): __tablename__ = "users_info" id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(32), nullable=False) password = db.Column(db.String(100), nullable=False) register_time = db.Column(db.DateTime, nullable=False, default=datetime.now()) avatar_path = db.Column(db.String(256), nullable=False, default="images/doraemon.jpg") def __init__(self, *args, **kwargs): self.username = kwargs.get("username") self.password = generate_password_hash(kwargs.get("password"))
這樣每添加一個新用戶,在init的時候就自動把密碼轉為hash值了,但是后續我們還得增加修改密碼的功能,所以就直接簡單點,在收到POST數據的時候就把密碼加密,然后存入數據庫中,此時注冊的視圖函數代碼如下:
from flask import Flask, render_template, request, flash, redirect, url_for from models import db, Users from werkzeug.security import generate_password_hash from exts import validate import config ... @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 "成功" in message: new_user = Users(username=username, password=generate_password_hash(password1)) db.session.add(new_user) db.session.commit() return redirect(url_for("login")) else: return render_template("register.html")
這里獲取登錄或注冊成功的狀態,使用了上一篇文章結尾說的方法,簡化了代碼量。
實際上更簡單的方法是,我們直接對傳入的{{ message }}進行判斷,如果帶有"成功"字符串,就顯示藍色,否則就顯示紅色。上文主要是為了說明@app.context_processor這個裝飾器,以及session和g對象的區別。
那么同樣的,登錄的驗證過程,就不能直接去拿數據庫加密過的哈希和原始的密碼對比了,我們用werkzeug.security的check_password_hash方法,它能驗證哈希值是否與原始的密碼是匹配的,然后修改validate函數如下:
from models import Users from werkzeug.security import check_password_hash 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 check_password_hash(user.password, password1): return "登錄成功" else: return "密碼錯誤" else: return "用戶名不存在"
登錄頁面的視圖函數如下:
@app.route("/login/", methods=["GET", "POST"]) def login(): if request.method == "GET": return render_template("login.html") else: username = request.form.get("username") password = request.form.get("password") message = validate(username, password) if "成功" in message: return redirect(url_for("home")) else: flash(message) return render_template("login.html")
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41268.html
摘要:在用戶注冊的時候是為空的,當用戶忘記密碼在登錄頁面點擊后生成的,用來給用法發送郵件后重置密碼時進行驗證。如有錯誤,不吝賜教。 注冊 在advanced模板中,進入frontend/index.php?r=site%2Fsignup頁面,可以看到框架的注冊頁面showImg(https://segmentfault.com/img/bVDEaZ?w=300&h=235); 填寫完User...
摘要:上面的寫法有個問題點擊按鈕發送請求后,客戶端一直收不到響應,就會報錯其實傳送的時是一個異步的過程,里面還沒執行完,外面就已經執行了,這邊可以用來解決下這個問題內部返回一個對象,成功調用函數,失敗調用函數,這邊就默認它會成功。 今天來研究一個小小的功能。當我們進入一個網站,它怎么判斷我是不是它的用戶?讓用戶登錄唄,如果它能正常登錄,它就是我的用戶唄?你有沒想過它是怎么判斷我是不是它用戶的...
摘要:文件搜索通過關鍵字搜索文件,搜索時采用模糊搜索,可以對整個關鍵字進行模糊搜索,還可以將關鍵字進行中文分詞后再依次模糊搜索。所以需要提供中文分詞的功能。 上一篇博客地址:Tshare校園資源分享平臺(網站開發三之數據庫連接) 功能設計 雖然我們能訪問web站點,能連接數據庫了,但是并不意味著我們馬上就要開始寫代碼,我們得先分析一下我們的網站都需要實現哪些功能,這樣我們才能針對如何實現這些...
閱讀 3095·2021-10-15 09:41
閱讀 3167·2021-09-22 16:05
閱讀 2405·2021-09-22 15:19
閱讀 2873·2021-09-02 15:11
閱讀 2446·2019-08-30 15:52
閱讀 832·2019-08-30 11:06
閱讀 1001·2019-08-29 16:44
閱讀 1240·2019-08-23 18:18