亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

10.注冊(cè)和登錄功能實(shí)現(xiàn)(3)—— 注冊(cè)數(shù)據(jù)寫入數(shù)據(jù)庫

zhangqh / 1571人閱讀

摘要:現(xiàn)在數(shù)據(jù)獲取到了,提示也有了,我們需要把注冊(cè)的數(shù)據(jù)寫入到數(shù)據(jù)庫,這一步很簡單,直接使用之前提到過的方法,但是我們不能直接把明文密碼寫入到數(shù)據(jù)庫中,那樣做是十分不安全的,我們需要將其加密之后再寫進(jìn)去,具體是用到中的這個(gè)函數(shù),將字符串變成值。

現(xiàn)在數(shù)據(jù)獲取到了,提示也有了,我們需要把注冊(cè)的數(shù)據(jù)寫入到數(shù)據(jù)庫,這一步很簡單,直接使用之前提到過的方法,但是我們不能直接把明文密碼寫入到數(shù)據(jù)庫中,那樣做是十分不安全的,我們需要將其加密之后再寫進(jìn)去,具體是用到werkzeug.security中的generate_password_hash這個(gè)函數(shù),將字符串變成hash值。
我們可以在User模型中重寫__init__函數(shù)(或__setattr__),當(dāng)傳入password自動(dòng)調(diào)用generate_password_hash進(jìn)行加密,如:

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"))

這樣每添加一個(gè)新用戶,在init的時(shí)候就自動(dòng)把密碼轉(zhuǎn)為hash值了,但是后續(xù)我們還得增加修改密碼的功能,所以就直接簡單點(diǎn),在收到POST數(shù)據(jù)的時(shí)候就把密碼加密,然后存入數(shù)據(jù)庫中,此時(shí)注冊(cè)的視圖函數(shù)代碼如下:

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")

這里獲取登錄或注冊(cè)成功的狀態(tài),使用了上一篇文章結(jié)尾說的方法,簡化了代碼量。

實(shí)際上更簡單的方法是,我們直接對(duì)傳入的{{ message }}進(jìn)行判斷,如果帶有"成功"字符串,就顯示藍(lán)色,否則就顯示紅色。上文主要是為了說明@app.context_processor這個(gè)裝飾器,以及sessiong對(duì)象的區(qū)別。

那么同樣的,登錄的驗(yàn)證過程,就不能直接去拿數(shù)據(jù)庫加密過的哈希和原始的密碼對(duì)比了,我們用werkzeug.securitycheck_password_hash方法,它能驗(yàn)證哈希值是否與原始的密碼是匹配的,然后修改validate函數(shù)如下:

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 "用戶名已經(jīng)存在"
        else:
            if len(username) < 4:
                return "用戶名長度至少4個(gè)字符"
            elif password1 != password2:
                return "兩次密碼不一致"
            elif len(password1) < 6:
                return "密碼長度至少6個(gè)字符"
            else:
                return "注冊(cè)成功,請(qǐng)登錄"
    else:
        if user:
            if check_password_hash(user.password, password1):
                return "登錄成功"
            else:
                return "密碼錯(cuò)誤"
        else:
            return "用戶名不存在"

登錄頁面的視圖函數(shù)如下:

@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")

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/41268.html

相關(guān)文章

  • Yii2框架源碼分析之如何實(shí)現(xiàn)注冊(cè)登錄

    摘要:在用戶注冊(cè)的時(shí)候是為空的,當(dāng)用戶忘記密碼在登錄頁面點(diǎn)擊后生成的,用來給用法發(fā)送郵件后重置密碼時(shí)進(jìn)行驗(yàn)證。如有錯(cuò)誤,不吝賜教。 注冊(cè) 在advanced模板中,進(jìn)入frontend/index.php?r=site%2Fsignup頁面,可以看到框架的注冊(cè)頁面showImg(https://segmentfault.com/img/bVDEaZ?w=300&h=235); 填寫完User...

    chemzqm 評(píng)論0 收藏0
  • 從前后端分別學(xué)習(xí)——注冊(cè)/登錄流程1

    摘要:上面的寫法有個(gè)問題點(diǎn)擊按鈕發(fā)送請(qǐng)求后,客戶端一直收不到響應(yīng),就會(huì)報(bào)錯(cuò)其實(shí)傳送的時(shí)是一個(gè)異步的過程,里面還沒執(zhí)行完,外面就已經(jīng)執(zhí)行了,這邊可以用來解決下這個(gè)問題內(nèi)部返回一個(gè)對(duì)象,成功調(diào)用函數(shù),失敗調(diào)用函數(shù),這邊就默認(rèn)它會(huì)成功。 今天來研究一個(gè)小小的功能。當(dāng)我們進(jìn)入一個(gè)網(wǎng)站,它怎么判斷我是不是它的用戶?讓用戶登錄唄,如果它能正常登錄,它就是我的用戶唄?你有沒想過它是怎么判斷我是不是它用戶的...

    Gemini 評(píng)論0 收藏0
  • Tshare校園資源分享平臺(tái)(網(wǎng)站開發(fā)四之功能模塊設(shè)計(jì))

    摘要:文件搜索通過關(guān)鍵字搜索文件,搜索時(shí)采用模糊搜索,可以對(duì)整個(gè)關(guān)鍵字進(jìn)行模糊搜索,還可以將關(guān)鍵字進(jìn)行中文分詞后再依次模糊搜索。所以需要提供中文分詞的功能。 上一篇博客地址:Tshare校園資源分享平臺(tái)(網(wǎng)站開發(fā)三之?dāng)?shù)據(jù)庫連接) 功能設(shè)計(jì) 雖然我們能訪問web站點(diǎn),能連接數(shù)據(jù)庫了,但是并不意味著我們馬上就要開始寫代碼,我們得先分析一下我們的網(wǎng)站都需要實(shí)現(xiàn)哪些功能,這樣我們才能針對(duì)如何實(shí)現(xiàn)這些...

    張金寶 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<