一個簡潔高效的Flask用戶管理示例

Flask-Login?是 Flask 的用戶管理擴展,提供?用戶身份驗證、會話管理、權限控制?等功能。

適用于

??用戶登錄、登出

??記住用戶(“記住我” 功能)

??限制未登錄用戶訪問某些頁面

??用戶會話管理

?1. 安裝 Flask-Login

pip install flask-login flask-sqlalchemy

main.py

from flask import Flask, render_template, redirect, url_for, request, flash
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_userapp = Flask(__name__)# 配置 Flask 和數據庫
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'  # 使用 SQLite 數據庫
app.config['SECRET_KEY'] = 'your_secret_key'  # Flask-Login 需要 secret key
db = SQLAlchemy(app)
login_manager = LoginManager(app)# 定義用戶模型
class User(UserMixin, db.Model):  # UserMixin 提供 Flask-Login 必需的方法id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(100), unique=True, nullable=False)password = db.Column(db.String(200), nullable=False)  # 真實應用需加密密碼# 創建數據庫表(僅需運行一次)
with app.app_context():db.create_all()# Flask-Login 加載用戶的回調函數
@login_manager.user_loader
def load_user(user_id):return User.query.get(int(user_id))  # 通過 ID 獲取用戶@app.route('/register', methods=['GET', 'POST'])
def register():if request.method == 'POST':username = request.form.get('username')password = request.form.get('password')if not username or not password:flash("用戶名和密碼不能為空!")return redirect(url_for('register'))# 檢查用戶是否已存在existing_user = User.query.filter_by(username=username).first()if existing_user:flash("用戶名已存在,請選擇其他用戶名")return redirect(url_for('register'))# 創建新用戶并保存到數據庫new_user = User(username=username, password=password)  # 這里應加密密碼db.session.add(new_user)db.session.commit()flash("注冊成功,請登錄!")return redirect(url_for('login'))return render_template('register.html')@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':username = request.form.get('username')password = request.form.get('password')# 查找用戶user = User.query.filter_by(username=username).first()if user and user.password == password:  # 這里應使用加密密碼驗證login_user(user)  # 登錄用戶flash("登錄成功!")return redirect(url_for('dashboard'))flash("用戶名或密碼錯誤")return redirect(url_for('login'))return render_template('login.html')@app.route('/dashboard')
@login_required  # 保護此路由,未登錄用戶無法訪問
def dashboard():return f"歡迎 {current_user.username}!這是您的儀表盤。 <a href='/logout'>登出</a>"@app.route('/logout')
@login_required
def logout():logout_user()flash("您已成功退出!")return redirect(url_for('login'))if __name__ == "__main__":app.run(debug=True)

templates/login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form method="post"><label>用戶名:</label><input type="text" name="username" required><label>密碼:</label><input type="password" name="password" required><button type="submit">登錄</button>
</form>
</body>
</html>

templates/register.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form method="post"><label>用戶名:</label><input type="text" name="username" required><label>密碼:</label><input type="password" name="password" required><button type="submit">注冊</button></form>
</body>
</html>

運行,然后訪問:

??注冊:http://127.0.0.1:5000/register

??登錄:http://127.0.0.1:5000/login

??儀表盤(必須登錄):http://127.0.0.1:5000/dashboard

??登出:http://127.0.0.1:5000/logout

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895752.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895752.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895752.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HashSet 的底層原理(簡單易懂)

在 Java 集合框架中&#xff0c;HashSet 是一個非常常用的集合類&#xff0c;它提供了快速的元素查找和插入操作。那么&#xff0c;HashSet 的底層是如何實現這些高效操作的呢&#xff1f;本文將深入探討 HashSet 的底層原理。 一、HashSet 的基本概念 HashSet 是基于哈希表的…

【學習資源】時間序列數據分析方法(2)-mWDN和AutoEncoder

接著上次的【學習資源】時間序列數據分析方法&#xff08;1&#xff09;-CSDN博客&#xff0c;本次介紹mWDN和AutoEncoder 解決時序數據分類的方法。介紹模型原理、應用場景和參考代碼。也從模型性能、訓練效率、模型復雜度、計算復雜度、可解釋性、適應性和泛化能力、健壯性、…

[LeetCode力扣hot100]-鏈表

相交鏈表 160. 相交鏈表 - 力扣&#xff08;LeetCode&#xff09; 思路就是遍歷兩個鏈表&#xff0c;有相同的部分就可以視為相交。 但是長度不一樣&#xff0c;比如兩個會相交的鏈表&#xff0c;headA 的長度為 a c&#xff0c;headB 的長度為 b c&#xff0c;其中 c 是公…

JAVA EE初階 - 預備知識(四)

一、API API 即應用程序編程接口&#xff08;Application Programming Interface&#xff09;&#xff0c;是一組定義、協議和工具&#xff0c;用于不同軟件組件、應用程序或系統之間進行交互和通信。以下從多個方面詳細介紹 API&#xff1a; 基本概念 接口規范&#xff1a;A…

【TI C2000】F28002x的系統延時、GPIO配置及SCI(UART)串口發送、接收

【TI C2000】F28002x的系統延時、GPIO配置及SCI&#xff08;UART&#xff09;串口發送、接收 文章目錄 系統延時GPIO配置GPIO輸出SCI配置SCI發送、接收測試附錄&#xff1a;F28002x開發板上手、環境配置、燒錄及TMS320F280025C模板工程建立F28002x敘述燒錄SDK庫文件說明工程建…

親測有效!使用Ollama本地部署DeepSeekR1模型,指定目錄安裝并實現可視化聊天與接口調用

文章目錄 一、引言二、準備工作&#xff08;Ollama 工具介紹與下載&#xff09;2.1 Ollama介紹2.2 Ollama安裝 三、指定目錄安裝 DeepSeek R1四、Chatbox 可視化聊天搭建4.1 Chatbox下載安裝4.2 關聯 DeepSeek R1 與 Chatbox 的步驟 五、使用 Ollama 調用 DeepSeek 接口5.1 請求…

期權隱含波動率是什么意思?

財順小編本文主要介紹期權隱含波動率是什么意思&#xff1f;期權隱含波動率&#xff08;Implied Volatility&#xff09;是根據當前期權市場價格&#xff0c;利用期權定價模型&#xff08;如Black-Scholes模型&#xff09;推導出的關于合約標的理論上的價格波動率。它反映了市場…

Python 面向對象的三大特征

前言&#xff1a;本篇講解面向對象的三大特征&#xff08;封裝&#xff0c;繼承&#xff0c;多態&#xff09;&#xff0c;還有比較細致的&#xff08;類屬性類方法&#xff0c;靜態方法&#xff09;&#xff0c;分步驟講解&#xff0c;比較適合理清楚三大特征的思路 面向對象的…

Jmeter如何計算TPS

1.在jmeter中計算出接口請求的個數 1175 1172 1172 174 200 416 384 1174 5867 2.計算接口平均響應時間 計算每個接口的請求次數乘以平均響應時間&#xff0c;所有接口相加&#xff0c;然后除以所有接口的數量總和&#xff0c;得到接口的平均響應時間 (1175*18191172*…

github上文件過大無法推送問題

GitHub 對文件大小有限制&#xff0c;超過 100 MB 的文件無法直接推送到倉庫中。 解決思路&#xff1a; 使用 Git Large File Storage (Git LFS) 來管理大文件不上傳對應的大文件 使用Git LFS&#xff1a; 1. 安裝 Git LFS 首先&#xff0c;你需要安裝 Git LFS。可以按照以…

Httprint 指紋識別技術:網絡安全的關鍵洞察

引言 Http指紋識別現在已經成為應用程序安全中一個新興的話題&#xff0c;Http服務器和Http應用程序安全也已經成為網絡安全中的重要一部分。從網絡管理的立場來看&#xff0c;保持對各種web服務器的監視和追蹤使得Http指紋識別變的唾手可得&#xff0c;Http指紋識別可以使得信…

docker push鏡像到阿里云

阿里云賬號 阿里云-計算&#xff0c;為了無法計算的價值 開通個人鏡像容器 進入控制臺&#xff0c;試用容器 實例列表界面 點擊上圖中的個人&#xff0c;個人版特性 創建個人版&#xff1a; 個人版實例界面&#xff1a; 設置密碼 個人版實例&#xff1a; 創建鏡像倉庫 如上…

【C#零基礎從入門到精通】(二十六)——C#三大特征-多態詳解

【C#零基礎從入門到精通】(二十六)——C#三大特征-多態詳解 在 C# 中,多態是面向對象編程的重要特性之一,它允許不同的對象對同一消息做出不同的響應。多態可以分為靜態多態和動態多態,下面將詳細介紹它們以及各自包含的知識點。 多態概述 多態性使得代碼更加靈活、可擴展…

大模型與智能體:螺旋共生,繪就智能新藍圖

大模型與智能體&#xff1a;螺旋共生&#xff0c;繪就智能新藍圖 在人工智能的前沿領域&#xff0c;大模型與智能體宛如兩顆璀璨的星辰&#xff0c;以一種精妙的螺旋共生關系&#xff0c;重塑著智能世界的格局&#xff0c;深刻影響著我們生活與工作的方方面面。 大模型&#x…

第2章 信息技術發展(一)

2.1 信息技術及其發展 2.1.1 計算機軟硬件 計算機硬件(Computer Hardware)是指計算機系統中由電子、機械和光電元件等組成的各種物理裝置的總稱。 計算機軟件 (Computer Software)是指計算機系統中的程序及其文檔&#xff0c;程序是計算任務的處理對象和處理規則的描述; 文檔…

藍橋杯篇---超聲波距離測量頻率測量

文章目錄 簡介第一部分&#xff1a;超聲波的簡介工作原理1.發射超聲波2.接收反射波3.計算時間差4.計算距離 硬件連接1.Trig2.Echo 示例代碼代碼說明注意事項1.聲速2.延時精度3.硬件連接 第二部分&#xff1a;頻率測量簡介頻率測量原理1.信號輸入2.計數3.計算頻率 硬件連接示例代…

CentOS系統docker配置鏡像加速registry-mirrors,配置阿里云和道客

1.可用倉庫 1.1.阿里云 2022年之后的鏡像缺失&#xff08;因為被墻了&#xff09;&#xff0c;但是網速極快 https://g4f7bois.mirror.aliyuncs.com1.2.上海道客 持續更新&#xff0c;但是網速極慢 https://docker.m.daocloud.io2.CentOS配置腳本 注意順序。阿里云的放前…

DeepSeek24小時寫作機器人,持續創作高質量文案

內容創作已成為企業、自媒體和創作者的核心競爭力。面對海量的內容需求&#xff0c;人工創作效率低、成本高、質量參差不齊等問題日益凸顯。如何在有限時間內產出高質量內容&#xff1f;DeepSeek寫作機器人&#xff0c;一款24小時持續創作的智能工具&#xff0c;為企業和個人提…

【Elasticsearch】simple_query_string

Elasticsearch 的simple_query_string查詢是一種靈活且容錯性較強的查詢方式&#xff0c;它允許用戶通過簡單的語法構造查詢字符串&#xff0c;以實現對文檔的搜索。以下是關于simple_query_string查詢的詳細說明&#xff1a; 1.基本概念 simple_query_string查詢是一種基于字…

CPP集群聊天服務器開發實踐(五):nginx負載均衡配置

1 負載均衡器的原理與功能 單臺Chatserver可以容納大約兩萬臺客戶端同時在線聊天&#xff0c;為了提升并發量最直觀的辦法需要水平擴展服務器的數量&#xff0c;三臺服務器可以容納六萬左右的客戶端。 負載均衡器的作用&#xff1a; 把client的請求按照負載均衡算法分發到具體…