基于Flask的通用登錄注冊模塊,并代理跳轉到目標網址

實現了用戶密碼的加密,代理跳轉到目標網址,不會暴露目標路徑,未登錄的情況下訪問proxy則自動跳轉到登錄頁,使用時需要修改配置項config,登錄注冊頁面背景快速修改,可以實現登錄注冊模塊的快速復用。

1.app.py

from flask import Flask, render_template, request, redirect, url_for, session, Response
import sqlite3
import os
import bcrypt
import requestsapp = Flask(__name__)
app.secret_key = os.urandom(24)# 數據庫連接
def get_db():conn = sqlite3.connect('users.db')return conn# 創建用戶表
def create_user_table():conn = get_db()c = conn.cursor()c.execute('''CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY AUTOINCREMENT,username TEXT NOT NULL UNIQUE,password TEXT NOT NULL)''')conn.commit()conn.close()create_user_table()# 配置項
config = {"after_login_url": "http://xxxx",  # 修改為目標網址"after_register_url": "/login","login_background_image": "static/login_background.jpg","register_background_image": "static/register_background.jpg"
}# 檢查用戶是否登錄的裝飾器
def login_required(func):def wrapper(*args, **kwargs):if 'username' not in session:return redirect(url_for('login'))return func(*args, **kwargs)wrapper.__name__ = func.__name__return wrapper# 注冊頁面
@app.route('/register', methods=['GET', 'POST'])
def register():error = Nonesuccess = Noneif request.method == 'POST':username = request.form.get('username')password = request.form.get('password').encode('utf-8')hashed = bcrypt.hashpw(password, bcrypt.gensalt())conn = get_db()c = conn.cursor()try:c.execute("INSERT INTO users (username, password) VALUES (?,?)", (username, hashed))conn.commit()success = "注冊成功!請登錄。"except sqlite3.IntegrityError as e:print(f"IntegrityError: {e}")error = "用戶名已存在,請選擇其他用戶名。"finally:conn.close()return render_template('register.html', error=error, success=success,background_image=config["register_background_image"])# 登錄頁面
@app.route('/login', methods=['GET', 'POST'])
def login():error = Noneif request.method == 'POST':username = request.form.get('username')password = request.form.get('password').encode('utf-8')remember_me = request.form.get('remember_me')conn = get_db()c = conn.cursor()c.execute("SELECT password FROM users WHERE username =?", (username,))user = c.fetchone()conn.close()if user:stored_password = user[0]if bcrypt.checkpw(password, stored_password):session['username'] = usernameif remember_me:session.permanent = Truereturn redirect(url_for('proxy'))error = "用戶名或密碼錯誤。"return render_template('login.html', error=error, background_image=config["login_background_image"])# 注銷
@app.route('/logout')
def logout():session.pop('username', None)return redirect(url_for('login'))# 代理請求
@app.route('/proxy')
@login_required
def proxy():target_url = config["after_login_url"]try:resp = requests.get(target_url, headers=dict(request.headers))excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']headers = [(name, value) for (name, value) in resp.raw.headers.items()if name.lower() not in excluded_headers]return Response(resp.content, resp.status_code, headers)except requests.RequestException as e:return f"請求出錯: {str(e)}", 500# 將根目錄設置為跳轉到代理路由
@app.route('/')
@login_required
def index():return redirect(url_for('proxy'))if __name__ == '__main__':app.run(debug=True)

2.login.html

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>登錄</title><!-- 使用 url_for 生成 CSS 文件的絕對路徑 --><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"><style>body {background-image: url('{{ background_image }}');background-size: cover;background-repeat: no-repeat;background-position: center center;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;}.card {border: none;border-radius: 10px;box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);transition: all 0.3s ease;background-color: rgba(255, 255, 255, 0.9);}.card:hover {box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);}.card-header {background-color: #0d6efd;color: white;border-top-left-radius: 10px;border-top-right-radius: 10px;}.alert {margin-top: 15px;}</style>
</head><body><div class="container d-flex justify-content-center align-items-center vh-100"><div class="card w-50"><div class="card-header text-center"><h2>登錄</h2></div><div class="card-body">{% if error %}<div class="alert alert-danger" role="alert">{{ error }}</div>{% endif %}<form method="post"><div class="mb-3"><label for="username" class="form-label">用戶名:</label><input type="text" id="username" name="username" class="form-control" required></div><div class="mb-3"><label for="password" class="form-label">密碼:</label><input type="password" id="password" name="password" class="form-control" required></div><div class="form-check mb-3"><input class="form-check-input" type="checkbox" value="1" id="remember_me" name="remember_me"><label class="form-check-label" for="remember_me">記住密碼</label></div><button type="submit" class="btn btn-primary w-100">登錄</button></form><p class="mt-3 text-center">還沒有賬號?<a href="{{ url_for('register') }}">注冊</a></p></div></div></div><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body></html>

3.register.html

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>注冊</title><!-- 使用 url_for 生成 CSS 文件的絕對路徑 --><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"><style>body {background-image: url('{{ background_image }}');background-size: cover;background-repeat: no-repeat;background-position: center center;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;}.card {border: none;border-radius: 10px;box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);transition: all 0.3s ease;background-color: rgba(255, 255, 255, 0.9);}.card:hover {box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);}.card-header {background-color: #0d6efd;color: white;border-top-left-radius: 10px;border-top-right-radius: 10px;}.alert {margin-top: 15px;}</style>
</head><body><div class="container d-flex justify-content-center align-items-center vh-100"><div class="card w-50"><div class="card-header text-center"><h2>注冊</h2></div><div class="card-body">{% if error %}<div class="alert alert-danger" role="alert">{{ error }}</div>{% endif %}{% if success %}<div class="alert alert-success" role="alert">{{ success }}</div>{% endif %}<form method="post"><div class="mb-3"><label for="username" class="form-label">用戶名:</label><input type="text" id="username" name="username" class="form-control" required></div><div class="mb-3"><label for="password" class="form-label">密碼:</label><input type="password" id="password" name="password" class="form-control" required></div><button type="submit" class="btn btn-primary w-100">注冊</button></form><p class="mt-3 text-center">已有賬號?<a href="{{ url_for('login') }}">登錄</a></p></div></div></div><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body></html>

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

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

相關文章

Java課程設計(雙人對戰游戲)持續更新......

少廢話&#xff0c;當然借助了ai&#xff0c;就這么個實力&#xff0c;后續會逐漸完善...... 考慮添加以下功能&#xff1a; 選將&#xff0c;選圖&#xff0c;技能&#xff0c;天賦&#xff0c;道具&#xff0c;防反&#xff0c;反重力&#xff0c;物理反彈&#xff0c;擊落…

Ai工作流工具有那些如Dify、coze扣子等以及他們是否開源

Dify &#xff08;https://difycloud.com/&#xff09; 核心定位&#xff1a;專業級 LLM 應用開發平臺&#xff0c;支持復雜 AI 工作流構建與企業級管理。典型場景&#xff1a;企業智能客服、數據分析系統、復雜自動化流程構建等。適合需要深度定制、企業級管理和復雜 AI 邏輯…

Debezium系列之:使用Debezium和Apache Iceberg構建數據湖

Debezium系列之:使用Debezium和Apache Iceberg構建數據湖 Debezium Server Iceberg“Debezium Server Iceberg” 消費者設置數據復制Upsert 模式保留已刪除的記錄使用Upsert模式追加模式優化批處理大小在數據分析的世界中,數據湖是存儲和管理大量數據以滿足數據分析、報告或機…

docker run -p 5000:5000 my-flask-app

docker run -p 5000:5000 my-flask-app代碼的意思是&#xff1a; 運行 my-flask-app 容器&#xff0c;并把 Flask 服務器的 5000 端口映射到本機的 5000 端口。 拆解解釋 docker run -p 5000:5000 my-flask-app? docker run → 運行一個 Docker 容器 ? -p 5000:5000 → 端口…

高光譜工業相機+LED光源系統助力材料分類和異物檢測、實現高速在線檢測

檢測光源包括可見光&#xff0c;如紅光、藍光和綠光以及其他波長的光&#xff0c;如紫外和紅外波長&#xff0c;可以選擇與檢測對象物相應的波長。但由于能夠照射的波長較窄&#xff0c;例如受到同色異物混入或多個素材的材質分類等&#xff0c;可能需要使用可照射多種波長的光…

Spring 攔截器(Interceptor)與過濾器(Filter)對比

Spring 攔截器&#xff08;Interceptor&#xff09;與過濾器&#xff08;Filter&#xff09;對比 核心對比表格 對比維度攔截器&#xff08;Interceptor&#xff09;過濾器&#xff08;Filter&#xff09;定義Spring MVC 提供的組件&#xff0c;集成于 Spring 處理器鏈。Servl…

VulnHub-FALL通關攻略

第一步&#xff1a;確定靶機IP為192.168.40.129 第二步&#xff1a;掃描后臺及開放端口 #開放端口 22 --- ssh 25 --- SMTP簡單郵件傳輸協議 80 --- HTTP萬維網傳輸信息協議 110 --- POP3郵件協議3 139 --- NetBIOS服務 443 --- https服務 445 --- SMB協議 3306 --- Mysql 808…

Qt 線程和 QObjects

線程和 QObjects QThread 繼承于 QObject。 它發出信號來指示線程開始或結束執行&#xff0c;并提供一些插槽。 更有趣的是&#xff0c;QObjects 可以在多個線程中使用&#xff0c;發出信號以調用其他線程中的插槽&#xff0c;并向 "生活 "在其他線程中的對象發布事件…

華為、浪潮、華三鏈路聚合概述

1、華為 鏈路聚合可以提高鏈路帶寬和鏈路冗余性。有三種類型&#xff0c;分別是手工鏈路聚合&#xff0c;靜態lacp鏈路聚合&#xff0c;動態lacp鏈路聚合。 手工鏈路模式&#xff1a;也稱負載分擔模式&#xff0c;需手動指定鏈路&#xff0c;各鏈路之間平均分擔流量。靜態LAC…

HarmonyOS NEXT 鴻蒙中關系型數據庫@ohos.data.relationalStore API 9+

核心API ohos.data.relationalStore API 9 數據庫 數據庫是存儲和管理數據的系統 數據庫&#xff08;Database&#xff09;是一個以特定方式組織、存儲和管理數據的集合&#xff0c;通常用于支持各種應用程序和系統的運行。它不僅是存放數據的倉庫&#xff0c;還通過一定的…

步進電機 cia402協議 報文自己的理解 (筆記)

1. cai402 協議是什么 CiA 402 協議&#xff08;CAN in Automation 402&#xff09;&#xff0c;它是工業自動化領域中的一種通信協議&#xff0c;主要用于運動控制&#xff08;如伺服驅動器、步進電機等&#xff09;&#xff08; &#xff09;所屬標準 CiA 402 是 CANopen 應用…

鴻蒙攝像機,一場智能安防的“平權革命”

2025的春天&#xff0c;全國各行各業都感受到了普惠AI的魅力。大模型帶來的技術平權&#xff0c;讓每一個人都能輕松用上AI。 這時候&#xff0c;企業想知道&#xff0c;每時每刻離不開的攝像機&#xff0c;究竟什么時候才能迎來智能技術的平權與普惠。 博思數據研究中心的一份…

解決HuggingFaceEmbeddings模型加載報錯:缺少sentence-transformers依賴包

遇到報錯 報錯信息: Error loading model: Could not import sentence_transformers python package. Please install it with pip install sentence-transformers. 裝包信息&#xff1a; pip install modelscope langchain sentence_transformers langchain-huggingface on…

從泛讀到精讀:合合信息文檔解析如何讓大模型更懂復雜文檔

從泛讀到精讀&#xff1a;合合信息文檔解析如何讓大模型更懂復雜文檔 一、引言&#xff1a;破解文檔“理解力”瓶頸二、核心功能&#xff1a;合合信息的“破局”亮點功能亮點1&#xff1a;復雜圖表的高精度解析圖表解析&#xff1a;為大模型裝上精準“標尺”表格數據精準還原 功…

Python+requests實現接口自動化測試框架

為什么要做接口自動化框架 1、業務與配置的分離 2、數據與程序的分離&#xff1b;數據的變更不影響程序 3、有日志功能&#xff0c;實現無人值守 4、自動發送測試報告 5、不懂編程的測試人員也可以進行測試 正常接口測試的流程是什么&#xff1f; 確定接口測試使用的工具…

信息學奧賽一本通 1514:【例 2】最大半連通子圖 | 洛谷 P2272 [ZJOI2007] 最大半連通子圖

【題目鏈接】 ybt 1514&#xff1a;【例 2】最大半連通子圖 洛谷 P2272 [ZJOI2007] 最大半連通子圖 【題目考點】 1. 圖論&#xff1a;強連通分量 縮點 2. 圖論&#xff1a;拓撲排序 有向無環圖動規 【解題思路】 對于圖中任意兩頂點u、v&#xff0c;滿足u到v或v到u有路徑…

Android打aar包問題總結

1、moduleA 依賴 moduleB&#xff0c;將moduleA打包成aar時&#xff0c;未包含 moduleB的resources資源&#xff1b; 方法一&#xff1a;將moduleB的資源&#xff0c;手動拷貝一份到moduleA中&#xff1b; 方法二&#xff1a;使用 fat-aar 插件&#xff1b; 2、fat-aar插件使…

【網絡協議】【http】http 簡單介紹

【網絡協議】【http】http 簡單介紹 1 HTTP 頭部 HTTP 是一種請求-響應協議&#xff0c;客戶端向服務器發送請求&#xff0c;服務器返回響應。 1.1 HTTP 狀態碼 狀態碼是服務器返回給客戶端的 三位數字代碼&#xff0c;用于表示請求的執行結果。 狀態碼按照首位數字分類&am…

談談空間復雜度考量,特別是遞歸調用棧空間消耗?

空間復雜度考量是算法設計的核心要素之一&#xff0c;遞歸調用棧的消耗問題在前端領域尤為突出。 以下結合真實開發場景進行深度解析&#xff1a; 一、遞歸調用棧的典型問題 1. 深層次DOM遍歷的陷阱 // 危險操作&#xff1a;遞歸遍歷未知層級的DOM樹 function countDOMNode…

LeetCode算法題(Go語言實現)_16

題目 給定一個二進制數組 nums 和一個整數 k&#xff0c;假設最多可以翻轉 k 個 0 &#xff0c;則返回執行操作后 數組中連續 1 的最大個數 。 一、代碼實現 func longestOnes(nums []int, k int) int {left, zeroCnt, maxLen : 0, 0, 0for right : 0; right < len(nums); …