国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Flask Session 登錄認(rèn)證模塊

這篇具有很好參考價值的文章主要介紹了Flask Session 登錄認(rèn)證模塊。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Flask 框架提供了強(qiáng)大的 Session 模塊組件,為 Web 應(yīng)用實現(xiàn)用戶注冊與登錄系統(tǒng)提供了方便的機(jī)制。結(jié)合 Flask-WTF 表單組件,我們能夠輕松地設(shè)計出用戶友好且具備美觀界面的注冊和登錄頁面,使這一功能能夠直接應(yīng)用到我們的項目中。本文將深入探討如何通過 Flask 和 Flask-WTF 構(gòu)建一個完整的用戶注冊與登錄系統(tǒng),以及如何對頁面進(jìn)行優(yōu)化美化,提高用戶體驗。通過這一系統(tǒng),用戶能夠方便注冊賬戶、安全登錄,并且我們能夠有效管理用戶的會話信息,為 Web 應(yīng)用的用戶管理提供一種高效的解決方案。

什么是Session機(jī)制?

Session 是一種在 Web 應(yīng)用中用于存儲用戶特定信息的機(jī)制。它允許在用戶訪問網(wǎng)站時存儲和檢索信息,以便在用戶的不同請求之間保持狀態(tài)。Session 機(jī)制在用戶登錄、購物網(wǎng)站、個性化設(shè)置等場景中得到廣泛應(yīng)用,它為用戶提供了更加連貫和個性化的體驗。在 Flask 中,通過 Flask Session 模塊可以方便地使用 Session ,實現(xiàn)用戶狀態(tài)的維護(hù)和管理。

在 Web 開發(fā)中,HTTP 協(xié)議是無狀態(tài)的,即每個請求都是獨立的,服務(wù)器不會記住之前的請求信息。為了解決這個問題,引入了 Session 機(jī)制?;舅枷胧窃谟脩粼L問網(wǎng)站時,服務(wù)器生成一個唯一的 Session ID,并將這個 ID 存儲在用戶的瀏覽器中(通常通過 Cookie)。同時,服務(wù)器端會保存一個映射,將 Session ID 與用戶的相關(guān)信息關(guān)聯(lián)起來,這樣在用戶的后續(xù)請求中,服務(wù)器就能根據(jù) Session ID 找到相應(yīng)的用戶信息,從而實現(xiàn)狀態(tài)的保持。

Session 的認(rèn)證流程通常包括以下步驟:

  1. 用戶登錄: 用戶通過提供用戶名和密碼進(jìn)行登錄。在登錄驗證成功后,服務(wù)器為該用戶創(chuàng)建一個唯一的 Session ID,并將這個 ID 存儲在用戶瀏覽器的 Cookie 中。
  2. Session 存儲: 服務(wù)器端將用戶的相關(guān)信息(如用戶 ID、權(quán)限等)與 Session ID 關(guān)聯(lián)起來,并將這些信息存儲在服務(wù)器端的 Session 存儲中。Session 存儲可以是內(nèi)存、數(shù)據(jù)庫或其他持久化存儲方式。
  3. Session ID 傳遞: 服務(wù)器將生成的 Session ID 發(fā)送給用戶瀏覽器,通常是通過 Set-Cookie 頭部。這個 Cookie 會在用戶的每次請求中被包含在 HTTP 頭中。
  4. 后續(xù)請求: 用戶在后續(xù)的請求中會攜帶包含 Session ID 的 Cookie。服務(wù)器通過解析請求中的 Session ID,從 Session 存儲中檢索用戶的信息,以恢復(fù)用戶的狀態(tài)。
  5. 認(rèn)證檢查: 服務(wù)器在每次請求中檢查 Session ID 的有效性,并驗證用戶的身份。如果 Session ID 無效或過期,用戶可能需要重新登錄。
  6. 用戶登出: 當(dāng)用戶主動注銷或 Session 過期時,服務(wù)器將刪除與 Session ID 關(guān)聯(lián)的用戶信息,用戶需要重新登錄。

總體而言,Session 的認(rèn)證流程通過在客戶端和服務(wù)器端之間傳遞唯一的 Session ID,實現(xiàn)了用戶狀態(tài)的持久化和管理。這種機(jī)制使得用戶可以在多個請求之間保持登錄狀態(tài),提供了一種有效的用戶認(rèn)證方式。在 Flask 中,開發(fā)者可以方便地使用 Flask 提供的 Session 模塊來實現(xiàn)這一流程。

Session 認(rèn)證基礎(chǔ)

默認(rèn)情況下,直接使用Session模塊即可實現(xiàn)Session登錄會話保持,該方式是將Session存儲到內(nèi)存中,程序重啟后即釋放,Session的設(shè)置一般可以通過使用session["username"]賦值的方式進(jìn)行,如需驗證該Session的可靠性,則只需要調(diào)用session.get方法即可一得到特定字段,通過對字段的判斷即可實現(xiàn)認(rèn)證機(jī)制。

如下是一個Flask后端代碼,運行后通過訪問http://127.0.0.1:5000進(jìn)入到登錄這頁面。

from flask import Flask,session,render_template,request,Response,redirect,url_for
from functools import wraps
import os

app = Flask(__name__, static_folder="./template",template_folder="./template")
app.config['SECRET_KEY'] = os.urandom(24)

# 登錄認(rèn)證裝飾器
def login_required(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        if session.get("username") != None and session.get("is_login") ==True:
            print("登陸過則繼續(xù)執(zhí)行原函數(shù)")
            return func(*args, **kwargs)
        else:
            print("沒有登錄則跳轉(zhuǎn)到登錄頁面")
            resp = Response()
            resp.status_code=200
            resp.data = "<script>window.location.href='/login';</script>"
            return resp
    return wrapper

@app.route("/login",methods=["GET","POST"])
def login():
    if request.method == "GET":
        html = """
                <form action="/login" method="post">
                    <p>賬號: <input type="text" name="username"></p>
                    <p>密碼: <input type="password" name="password"></p>
                    <input type="submit" value="登錄">
                </form>
                """
        return html

    if request.method == "POST":
        get_dict = request.form.to_dict()

        get_username = get_dict['username']
        get_password = get_dict['password']

        if (get_username == "lyshark" or get_username == "admin") and get_password == "123123":
            session["username"] = get_username
            session["is_login"] = True

            print("登錄完成直接跳到主頁")
            resp = Response()
            resp.status_code=200
            resp.data = "<script>window.location.href='/index';</script>"
            return resp
        else:
            return "登陸失敗"
    return "未知錯誤"

# 主頁菜單
@app.route("/index",methods = ["GET","POST"])
@login_required
def index():
    username = session.get("username")
    return "用戶 {} 您好,這是主頁面".format(username)

# 第二個菜單
@app.route("/get",methods = ["GET","POST"])
@login_required
def get():
    username = session.get("username")
    return "用戶 {} 您好,這是子頁面".format(username)

@app.route("/logout",methods = ["GET","POST"])
@login_required
def logout():
    username = session.get("username")

    # 登出操作
    session.pop("username")
    session.pop("is_login")
    session.clear()
    return "用戶 {} 已注銷".format(username)

if __name__ == '__main__':
    app.run()

程序運行后,當(dāng)用戶訪問http://127.0.0.1:5000地址則會跳轉(zhuǎn)到login登陸頁面,此時如果用戶第一次訪問則會輸出如下所示的登陸信息;

Flask Session 登錄認(rèn)證模塊

通過輸入正確的用戶名lyshark和密碼123123則可以登錄成功,此處登錄的用戶是lyshark如下圖。

Flask Session 登錄認(rèn)證模塊

通過輸入不同的用戶登錄會出現(xiàn)不同的頁面提示信息,如下圖則是admin的主頁信息。

Flask Session 登錄認(rèn)證模塊

當(dāng)我們手動輸入logout時則此時會退出登錄用戶,后臺也會清除該用戶的Session,在開發(fā)中可以自動跳轉(zhuǎn)到登出頁面;

Flask Session 登錄認(rèn)證模塊

Session 使用數(shù)據(jù)庫

通過結(jié)合 Session 與 SQLite 數(shù)據(jù)庫,我們可以實現(xiàn)一個更完善的用戶注冊、登錄以及密碼修改功能。在這個案例中,首先,用戶可以通過注冊表單輸入用戶名、密碼等信息,這些信息經(jīng)過驗證后將被存儲到 SQLite 數(shù)據(jù)庫中。注冊成功后,用戶可以使用相同的用戶名和密碼進(jìn)行登錄。登錄成功后,我們使用 Flask 的 Session 機(jī)制將用戶信息保存在服務(wù)器端,確保用戶在訪問其他頁面時仍然處于登錄狀態(tài)。

為了增加更多功能,我們還可以實現(xiàn)密碼修改的功能。用戶在登錄狀態(tài)下,通過密碼修改表單輸入新的密碼,我們將新密碼更新到數(shù)據(jù)庫中,確保用戶可以安全地更改密碼。這個案例綜合運用了 Flask、SQLite 和 Session 等功能,為 Web 應(yīng)用提供了一套完整的用戶管理系統(tǒng)。

from flask import Flask,request,render_template,session,Response
import sqlite3,os
from functools import wraps

app = Flask(__name__)

app.config['SECRET_KEY'] = os.urandom(24)

# 創(chuàng)建數(shù)據(jù)庫
def UserDB():
    conn = sqlite3.connect("./database.db")
    cursor = conn.cursor()
    create = "create table UserDB(" \
             "uid INTEGER primary key AUTOINCREMENT not null unique," \
             "username char(64) not null unique," \
             "password char(64) not null," \
             "email char(64) not null" \
             ")"
    cursor.execute(create)
    conn.commit()
    cursor.close()
    conn.close()

# 增刪改查簡單封裝
def RunSqlite(db,table,action,field,value):
    connect = sqlite3.connect(db)
    cursor = connect.cursor()

    # 執(zhí)行插入動作
    if action == "insert":
        insert = f"insert into {table}({field}) values({value});"
        if insert == None or len(insert) == 0:
            return False
        try:
            cursor.execute(insert)
        except Exception:
            return False

    # 執(zhí)行更新操作
    elif action == "update":
        update = f"update {table} set {value} where {field};"
        if update == None or len(update) == 0:
            return False
        try:
            cursor.execute(update)
        except Exception:
            return False

    # 執(zhí)行查詢操作
    elif action == "select":

        # 查詢條件是否為空
        if value == "none":
            select = f"select {field} from {table};"
        else:
            select = f"select {field} from {table} where {value};"

        try:
            ref = cursor.execute(select)
            ref_data = ref.fetchall()
            connect.commit()
            connect.close()
            return ref_data
        except Exception:
            return False

    # 執(zhí)行刪除操作
    elif action == "delete":
        delete = f"delete from {table} where {field};"
        if delete == None or len(delete) == 0:
            return False
        try:
            cursor.execute(delete)
        except Exception:
            return False
    try:
        connect.commit()
        connect.close()
        return True
    except Exception:
        return False

# 創(chuàng)建數(shù)據(jù)庫
@app.route("/create")
def create():
    UserDB()
    return "create success"

# 登錄認(rèn)證裝飾器
def login_required(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        if session.get("username") != None and session.get("is_login") ==True:
            print("登陸過則繼續(xù)執(zhí)行原函數(shù)")
            return func(*args, **kwargs)
        else:
            print("沒有登錄則跳轉(zhuǎn)到登錄頁面")
            resp = Response()
            resp.status_code=200
            resp.data = "<script>window.location.href='/login';</script>"
            return resp
    return wrapper

# 用戶注冊頁面
@app.route("/register",methods=["GET","POST"])
def register():
    if request.method == "GET":
        html = """
                <form action="/register" method="post">
                    <p>賬號: <input type="text" name="username"></p>
                    <p>密碼: <input type="password" name="password"></p>
                    <p>郵箱: <input type="text", name="email"></p>
                    <input type="submit" value="用戶注冊">
                </form>
                """
        return html

    if request.method == "POST":
        username = request.form.get("username")
        password = request.form.get("password")
        email = request.form.get("email")

        if RunSqlite("database.db","UserDB","select","username",f"username='{username}'") == []:
            insert = RunSqlite("database.db","UserDB","insert","username,password,email",f"'{username}','{password}','{email}'")
            if insert == True:
                return "創(chuàng)建完成"
            else:
                return "創(chuàng)建失敗"
        else:
            return "用戶存在"
        return "未知錯誤"

# 用戶登錄模塊
@app.route("/login",methods=["GET","POST"])
def login():
    if request.method == "GET":
        html = """
                <form action="/login" method="post">
                    <p>賬號: <input type="text" name="username"></p>
                    <p>密碼: <input type="password" name="password"></p>
                    <input type="submit" value="登錄">
                </form>
                """
        return html

    if request.method == "POST":
        username = request.form.get("username")
        password = request.form.get("password")

        select = RunSqlite("database.db","UserDB","select","username,password",f"username='{username}'")
        if select != []:
            # 繼續(xù)驗證密碼
            if select[0][1] == password:
                session["username"] = username
                session["is_login"] = True

                print("登錄完成直接跳到主頁")
                resp = Response()
                resp.status_code = 200
                resp.data = "<script>window.location.href='/index';</script>"
                return resp
            else:
                return "密碼不正確"
        else:
            return "用戶不存在"
    return "未知錯誤"

# 修改密碼
@app.route("/modify",methods=["GET","POST"])
@login_required
def modify():
    if request.method == "GET":
        html = """
                <form action="/modify" method="post">
                    <p>新密碼: <input type="password" name="new_password"></p>
                    <input type="submit" value="修改密碼">
                </form>
                """
        return html

    if request.method == "POST":
        username = session.get("username")
        new_password = request.form.get("new_password")
        update = RunSqlite("database.db","UserDB","update",f"username='{username}'",f"password='{new_password}'")
        if update == True:
            # 登出操作
            session.pop("username")
            session.pop("is_login")
            session.clear()

            print("密碼已更新,請重新登錄")
            resp = Response()
            resp.status_code = 200
            resp.data = "<script>window.location.href='/login';</script>"
            return resp
        else:
            return "密碼更新失敗"
    return "未知錯誤"

# 主頁菜單
@app.route("/index",methods = ["GET","POST"])
@login_required
def index():
    username = session.get("username")
    return "用戶 {} 您好,這是主頁面".format(username)

# 第二個菜單
@app.route("/get",methods = ["GET","POST"])
@login_required
def get():
    username = session.get("username")
    return "用戶 {} 您好,這是子頁面".format(username)

@app.route("/logout",methods = ["GET","POST"])
@login_required
def logout():
    username = session.get("username")

    # 登出操作
    session.pop("username")
    session.pop("is_login")
    session.clear()
    return "用戶 {} 已注銷".format(username)

if __name__ == '__main__':
    app.run(debug=True)

案例被運行后首先通過調(diào)用http://127.0.0.1:5000/create創(chuàng)建database.db數(shù)據(jù)庫,接著我們可以通過訪問/register路徑實現(xiàn)賬號注冊功能,如下我們注冊lyshark密碼是123123,輸出效果如下所示;

Flask Session 登錄認(rèn)證模塊

通過訪問/modify可實現(xiàn)對用戶密碼的修改,但在修改之前需要先通過/login頁面登錄后進(jìn)行,否則會默認(rèn)跳轉(zhuǎn)到用戶登錄頁面中;

使用WTForms登錄模板

在如上代碼基礎(chǔ)上,我們著重增加一個美化登錄模板,以提升用戶在注冊登錄流程中的整體體驗。通過引入WTF表單組件和Flask-WTF擴(kuò)展,在前端實現(xiàn)了一個更友好的登錄頁面。

此登錄模板的設(shè)計考慮了頁面布局、顏色搭配、表單樣式等因素,以確保用戶在輸入用戶名和密碼時感到輕松自然。同時,我們利用Flask-WTF的驗證器功能,對用戶輸入的數(shù)據(jù)進(jìn)行有效性檢查,保障了用戶信息的安全性。

首先,我們需要在template目錄下,創(chuàng)建register.html前端文件,用于用戶注冊,并寫入以下代碼。

<html>
<head>
    <link rel="stylesheet" >
    <link  rel="stylesheet" type="text/css" />
    <link  rel="stylesheet" type="text/css" />
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-md-offset-3 col-md-6">
                <form action="/register" method="post" class="form-horizontal">
                    {{ form.csrf_token }}

                    <span class="heading">用 戶 注 冊</span>
                    <div class="form-group">
                        {{ form.username }}
                        <i class="fa fa-user"></i>
                        <a href="/login" class="fa fa-question-circle"></a>
                    </div>
                    <div class="form-group">
                        {{ form.email }}
                        <i class="fa fa-envelope"></i>
                    </div>
                    <div class="form-group">
                        {{ form.password }}
                        <i class="fa fa-lock"></i>
                    </div>
                    <div class="form-group">
                        {{ form.RepeatPassword }}
                        <i class="fa fa-unlock-alt"></i>
                    </div>
                    {{ form.submit }}
                </form>
            </div>
        </div>
    </div>
</body>
</html>

接著,繼續(xù)創(chuàng)建login.html前端文件,用于登錄賬號時使用,并寫入以下代碼。

<html>
<head>
    <link rel="stylesheet" >
    <link  rel="stylesheet" type="text/css" />
    <link  rel="stylesheet" type="text/css" />
</head>
    <body>
        <div class="container">
            <div class="row">
                <div class="col-md-offset-3 col-md-6">
                    <form action="/login" method="post" class="form-horizontal">
                        {{ form.csrf_token }}

                        <span class="heading">用 戶 登 錄</span>
                        <div class="form-group">
                            {{ form.username }}
                            <i class="fa fa-user"></i>
                        </div>
                        <div class="form-group help">
                            {{ form.password }}
                            <i class="fa fa-lock"></i>
                            <a href="#" class="fa fa-question-circle"></a>
                        </div>
                        <div class="form-group">
                            <button type="submit" class="btn btn-success">登 錄 后 臺</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </body>
</html>

后臺代碼部分,我們需要在原代碼的基礎(chǔ)之上,增加對前端注冊和登錄頁面的渲染類,此處使用flask_wtf組件實現(xiàn)渲染生成,具體代碼如下。

from flask import Flask,request,render_template,session,Response
from functools import wraps
import sqlite3,os

from flask_wtf import FlaskForm
from wtforms import widgets,validators
from wtforms.validators import DataRequired,Regexp,DataRequired, Length, Email, EqualTo, NumberRange
from wtforms.fields import (StringField, PasswordField, DateField, BooleanField,DateTimeField,TimeField,
                            SelectField, SelectMultipleField, TextAreaField,FloatField,HiddenField,
                            RadioField, IntegerField, DecimalField, SubmitField, IntegerRangeField)

# app = Flask(__name__, static_folder="./template",template_folder="./template")
app = Flask(__name__)

app.config["SECRET_KEY"] = "d3d3Lmx5c2hhcmsuY29t"

# -----------------------------------------------------------------------------
# 創(chuàng)建數(shù)據(jù)庫
def UserDB():
    conn = sqlite3.connect("database.db")
    cursor = conn.cursor()
    create = "create table UserDB(" \
             "uid INTEGER primary key AUTOINCREMENT not null unique," \
             "username char(64) not null unique," \
             "password char(64) not null," \
             "email char(64) not null" \
             ")"
    cursor.execute(create)
    conn.commit()
    cursor.close()
    conn.close()

# 增刪改查簡單封裝
def RunSqlite(db,table,action,field,value):
    connect = sqlite3.connect(db)
    cursor = connect.cursor()

    # 執(zhí)行插入動作
    if action == "insert":
        insert = f"insert into {table}({field}) values({value});"
        if insert == None or len(insert) == 0:
            return False
        try:
            cursor.execute(insert)
        except Exception:
            return False

    # 執(zhí)行更新操作
    elif action == "update":
        update = f"update {table} set {value} where {field};"
        if update == None or len(update) == 0:
            return False
        try:
            cursor.execute(update)
        except Exception:
            return False

    # 執(zhí)行查詢操作
    elif action == "select":

        # 查詢條件是否為空
        if value == "none":
            select = f"select {field} from {table};"
        else:
            select = f"select {field} from {table} where {value};"

        try:
            ref = cursor.execute(select)
            ref_data = ref.fetchall()
            connect.commit()
            connect.close()
            return ref_data
        except Exception:
            return False

    # 執(zhí)行刪除操作
    elif action == "delete":
        delete = f"delete from {table} where {field};"
        if delete == None or len(delete) == 0:
            return False
        try:
            cursor.execute(delete)
        except Exception:
            return False
    try:
        connect.commit()
        connect.close()
        return True
    except Exception:
        return False

# -----------------------------------------------------------------------------
# 生成用戶注冊表單
class RegisterForm(FlaskForm):
    username = StringField(
        validators=[
            DataRequired(message='用戶名不能為空'),
            Length(min=1, max=15, message='用戶名長度必須大于%(min)d且小于%(max)d')
        ],
        widget=widgets.TextInput(),
        render_kw={'class': 'form-control', "placeholder":"輸入注冊用戶名"}
    )
    email = StringField(
        validators=[validators.DataRequired(message='郵箱不能為空'),validators.Email(message="郵箱格式輸入有誤")],
        render_kw={'class':'form-control', "placeholder":"輸入Email郵箱"}
    )
    password = PasswordField(
        validators=[
            validators.DataRequired(message='密碼不能為空'),
            validators.Length(min=5, message='用戶名長度必須大于%(min)d'),
            validators.Regexp(regex="[0-9a-zA-Z]{5,}",message='密碼不允許使用特殊字符')
        ],
        widget=widgets.PasswordInput(),
        render_kw={'class': 'form-control', "placeholder":"輸入用戶密碼"}
    )
    RepeatPassword = PasswordField(
        validators=[
            validators.DataRequired(message='密碼不能為空'),
            validators.Length(min=5, message='密碼長度必須大于%(min)d'),
            validators.Regexp(regex="[0-9a-zA-Z]{5,}",message='密碼不允許使用特殊字符'),
            validators.EqualTo("password",message="兩次密碼輸入必須一致")
        ],
        widget=widgets.PasswordInput(),
        render_kw={'class': 'form-control', "placeholder":"再次輸入密碼"}
    )
    submit = SubmitField(
        label="用 戶 注 冊", render_kw={ "class":"btn btn-success" }
    )

# 生成用戶登錄表單
class LoginForm(FlaskForm):
    username = StringField(
        validators=[
            validators.DataRequired(message=''),
            validators.Length(min=4, max=15, message=''),
            validators.Regexp(regex="[0-9a-zA-Z]{4,15}", message='')
        ],
        widget=widgets.TextInput(),
        render_kw={"class":"form-control", "placeholder":"請輸入用戶名或電子郵件"}
    )
    password = PasswordField(
        validators=[
            validators.DataRequired(message=''),
            validators.Length(min=5, max=15,message=''),
            validators.Regexp(regex="[0-9a-zA-Z]{5,15}",message='')
        ],
        widget=widgets.PasswordInput(),
        render_kw={"class":"form-control", "placeholder":"請輸入密碼"}
    )

# -----------------------------------------------------------------------------
# 創(chuàng)建數(shù)據(jù)庫
@app.route("/create")
def create():
    UserDB()
    return "create success"

# 登錄認(rèn)證裝飾器
def login_required(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        if session.get("username") != None and session.get("is_login") ==True:
            print("登陸過則繼續(xù)執(zhí)行原函數(shù)")
            return func(*args, **kwargs)
        else:
            print("沒有登錄則跳轉(zhuǎn)到登錄頁面")
            resp = Response()
            resp.status_code=200
            resp.data = "<script>window.location.href='/login';</script>"
            return resp
    return wrapper

# 用戶注冊頁面
@app.route("/register",methods=["GET","POST"])
def register():
    form = RegisterForm(csrf_enabled = True)

    if request.method == "POST":
        if form.validate_on_submit():
            username = form.username.data
            password = form.RepeatPassword.data
            email = form.email.data
            print("用戶: {} 郵箱: {}".format(username,email))

            if RunSqlite("database.db", "UserDB", "select", "username", f"username='{username}'") == []:
                insert = RunSqlite("database.db", "UserDB", "insert", "username,password,email",
                                   f"'{username}','{password}','{email}'")
                if insert == True:
                    return "創(chuàng)建完成"
                else:
                    return "創(chuàng)建失敗"
            else:
                return "用戶存在"

    return render_template("register.html", form=form)

# 用戶登錄頁面
@app.route("/login",methods=["GET","POST"])
def login():
    form = LoginForm(csrf_enabled = True)

    if request.method == "POST":
        username = form.username.data
        password = form.password.data

        select = RunSqlite("database.db","UserDB","select","username,password",f"username='{username}'")
        if select != []:
            # 繼續(xù)驗證密碼
            if select[0][1] == password:
                session["username"] = username
                session["is_login"] = True

                print("登錄完成直接跳到主頁")
                resp = Response()
                resp.status_code = 200
                resp.data = "<script>window.location.href='/index';</script>"
                return resp
            else:
                return "密碼不正確"
        else:
            return "用戶不存在"

    return render_template("login.html", form=form)

# 修改密碼
@app.route("/modify",methods=["GET","POST"])
@login_required
def modify():
    if request.method == "GET":
        html = """
                <form action="/modify" method="post">
                    <p>新密碼: <input type="password" name="new_password"></p>
                    <input type="submit" value="修改密碼">
                </form>
                """
        return html

    if request.method == "POST":
        username = session.get("username")
        new_password = request.form.get("new_password")
        update = RunSqlite("database.db","UserDB","update",f"username='{username}'",f"password='{new_password}'")
        if update == True:
            # 登出操作
            session.pop("username")
            session.pop("is_login")
            session.clear()

            print("密碼已更新,請重新登錄")
            resp = Response()
            resp.status_code = 200
            resp.data = "<script>window.location.href='/login';</script>"
            return resp
        else:
            return "密碼更新失敗"
    return "未知錯誤"

# 主頁菜單
@app.route("/index",methods = ["GET","POST"])
@login_required
def index():
    username = session.get("username")
    return "用戶 {} 您好,這是主頁面".format(username)

# 第二個菜單
@app.route("/get",methods = ["GET","POST"])
@login_required
def get():
    username = session.get("username")
    return "用戶 {} 您好,這是子頁面".format(username)

@app.route("/logout",methods = ["GET","POST"])
@login_required
def logout():
    username = session.get("username")

    # 登出操作
    session.pop("username")
    session.pop("is_login")
    session.clear()
    return "用戶 {} 已注銷".format(username)

if __name__ == '__main__':
    app.run(debug=True)

目錄結(jié)果如下圖所示;

Flask Session 登錄認(rèn)證模塊

當(dāng)用戶訪問/register時,則可以看到通過flask_wtf渲染后的用戶注冊頁面,如下圖所示;

Flask Session 登錄認(rèn)證模塊

用戶訪問/login時,則是用戶登錄頁面,如下圖所示;

Flask Session 登錄認(rèn)證模塊文章來源地址http://www.zghlxwxcb.cn/news/detail-747703.html

到了這里,關(guān)于Flask Session 登錄認(rèn)證模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • SpringBootWeb 登錄認(rèn)證[Cookie + Session + Token + Filter + Interceptor]

    SpringBootWeb 登錄認(rèn)證[Cookie + Session + Token + Filter + Interceptor]

    目錄 1. 登錄功能 1.1 需求 1.2 接口文檔 1.3 登錄 - 思路分析 1.4 功能開發(fā) 1.5 測試 2. 登錄校驗 2.1 問題分析 什么是登錄校驗? 我們要完成以上登錄校驗的操作,會涉及到Web開發(fā)中的兩個技術(shù): 2.2 會話技術(shù) 2.2.1 會話技術(shù)介紹 會話跟蹤? 2.2.2 會話跟蹤方案 2.2.2.1 方案一 - Cookie

    2024年02月20日
    瀏覽(12)
  • Python 框架學(xué)習(xí) Django篇 (五) Session與Token認(rèn)證

    Python 框架學(xué)習(xí) Django篇 (五) Session與Token認(rèn)證

    我們前面經(jīng)過數(shù)據(jù)庫的學(xué)習(xí)已經(jīng)基本了解了怎么接受前端發(fā)過來的請求,并處理后返回數(shù)據(jù)實現(xiàn)了一個基本的登錄登出效果,但是存在一個問題,我們是將所有的請求都直接處理了,并沒有去檢查是否為已經(jīng)登錄的管理員發(fā)送的,如果是這樣的話客戶端可以不選擇登錄直接去

    2024年02月07日
    瀏覽(14)
  • web學(xué)習(xí)--登錄認(rèn)證--會話技術(shù)--cookie--session--令牌--java-jwt使用--jjwt使用

    web學(xué)習(xí)--登錄認(rèn)證--會話技術(shù)--cookie--session--令牌--java-jwt使用--jjwt使用

    前置學(xué)習(xí): http springmvc 會話:用戶打開瀏覽器,訪問web服務(wù)器資源,會話建立,直到有一方斷開連接會話結(jié)束,一次會話可以多次請求和連接 會話跟蹤:一種維護(hù)瀏覽器狀態(tài)的方式,服務(wù)器需要識別多次請求是否來自同一瀏覽器,以便同一次會話多次請求間共享數(shù)據(jù)。 cooki

    2024年02月15日
    瀏覽(50)
  • Flask-Sockets和Flask-Login聯(lián)合實現(xiàn)websocket的登錄認(rèn)證功能

    flask_login 提供了一個方便的方式來管理用戶會話。當(dāng)你在 Flask 的 HTTP 視圖中使用它時,你可以簡單地使用 @login_required 裝飾器來確保用戶已登錄。 但是, flask_sockets 并沒有直接與 flask_login 集成。如果你想在建立 WebSocket 連接時檢查用戶是否已登錄,你需要采取一些額外的步驟

    2024年02月11日
    瀏覽(23)
  • Flask 高級應(yīng)用:使用藍(lán)圖模塊化應(yīng)用和 JWT 實現(xiàn)安全認(rèn)證

    本文將探討 Flask 的兩個高級特性:藍(lán)圖(Blueprints)和 JSON Web Token(JWT)認(rèn)證。藍(lán)圖讓我們可以將應(yīng)用模塊化,以便更好地組織代碼;而 JWT 認(rèn)證是現(xiàn)代 Web 應(yīng)用中常見的一種安全機(jī)制。 在大型應(yīng)用中,一個單獨的 Python 文件可能無法容納所有的路由和視圖函數(shù)。這時,F(xiàn)lask 的

    2024年02月13日
    瀏覽(30)
  • 【業(yè)務(wù)功能篇96】微服務(wù)-springcloud-springboot-認(rèn)證服務(wù)-登錄注冊功能-Auth2.0-分布式session

    【業(yè)務(wù)功能篇96】微服務(wù)-springcloud-springboot-認(rèn)證服務(wù)-登錄注冊功能-Auth2.0-分布式session

    ??通過最基礎(chǔ)的登錄操作來完成登錄處理 登錄頁面處理 認(rèn)證服務(wù)的處理 會員中心的認(rèn)證邏輯 service中的具體認(rèn)證處理 ??OAuth2.0是OAuth協(xié)議的延續(xù)版本,但不向前兼容OAuth 1.0(即完全廢止了OAuth1.0)。 OAuth 2.0關(guān)注客戶端開發(fā)者的簡易性。要么通過組織在資源擁有者和HTTP服務(wù)商

    2024年02月09日
    瀏覽(25)
  • 創(chuàng)建一個簡單的區(qū)塊鏈,并使用 Flask 框架提供一個簡單的 Web 接口來與區(qū)塊鏈交互。

    創(chuàng)建一個簡單的區(qū)塊鏈,并使用 Flask 框架提供一個簡單的 Web 接口來與區(qū)塊鏈交互。

    目錄 前言 一、代碼展示 二、代碼注釋 1.簡單的區(qū)塊鏈模擬實現(xiàn),這段代碼定義了一個簡單的區(qū)塊鏈類,可以創(chuàng)建一個新的區(qū)塊鏈,并能夠添加新的區(qū)塊到鏈上,同時獲取最新的區(qū)塊信息。這個模擬的區(qū)塊鏈可以用于教學(xué)或演示區(qū)塊鏈的基本概念。 2.這段代碼是一個簡單的工

    2024年04月14日
    瀏覽(23)
  • Django用戶認(rèn)證: 利用Django Auth模塊實現(xiàn)用戶注冊、登錄與登出

    用戶登錄注冊屬于用戶認(rèn)證的一部分,Django內(nèi)置了一套用戶認(rèn)證體系,使用起來比較方便,而且支持用戶定制和拓展,足以滿足任何復(fù)雜的業(yè)務(wù)需求。 Django框架中,用戶權(quán)限管理被劃分為三個層次: 用戶 :系統(tǒng)使用者,擁有自己的權(quán)限??杀灰粋€或多個用戶組包含。 用戶組

    2023年04月20日
    瀏覽(25)
  • Casbin開源社區(qū)推出開源身份認(rèn)證、單點登錄框架Casdoor

    Casbin開源社區(qū)推出開源身份認(rèn)證、單點登錄框架Casdoor! 開源地址:https://github.com/casbin/casdoor 在線演示:https://door.casbin.com/ 技術(shù)文檔:https://casdoor.org/docs/overview 目前支持以下特性: 前后端分離架構(gòu),Go語言開發(fā),支持高并發(fā),具有Web可視化管理界面,支持多語言(中文、英

    2023年04月08日
    瀏覽(31)
  • (二十六)Flask之原生session切為flask-session

    ????作者介紹:【孤寒者】—CSDN全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、HDZ核心組成員、華為云享專家Python全棧領(lǐng)域博主、CSDN原力計劃作者 ???? 本文已收錄于Flask框架從入門到實戰(zhàn)專欄 :

    2024年04月11日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包