当前位置: 首页 > article >正文

用Python CGI给老旧服务器写个简易后台管理面板(Apache配置+SQLite数据库)

用Python CGI打造轻量级服务器管理面板实战指南在资源受限的老旧服务器环境中部署现代Web框架往往显得大材小用。本文将展示如何利用Python CGI和SQLite数据库为树莓派、老款VPS等设备快速构建一个功能完备的轻量级管理面板。这种方案特别适合需要快速实现基础Web功能但又不愿引入复杂框架的开发者。1. 环境准备与基础配置1.1 Apache服务器配置首先确保Apache已安装并启用CGI模块。在Ubuntu/Debian系统上sudo apt install apache2 sudo a2enmod cgi sudo systemctl restart apache2编辑Apache配置文件通常位于/etc/apache2/sites-available/000-default.conf添加以下配置ScriptAlias /admin/ /var/www/admin/ Directory /var/www/admin Options ExecCGI AddHandler cgi-script .py Require all granted /Directory注意生产环境应将Require all granted替换为适当的访问控制1.2 项目目录结构建议采用以下目录布局/var/www/admin/ ├── cgi-bin/ # Python脚本存放处 │ ├── system.py # 系统管理模块 │ ├── files.py # 文件管理模块 │ └── dbadmin.py # 数据库管理模块 ├── data/ # SQLite数据库存放目录 ├── templates/ # HTML模板 └── uploads/ # 文件上传目录设置目录权限sudo mkdir -p /var/www/admin/{cgi-bin,data,templates,uploads} sudo chown -R www-data:www-data /var/www/admin sudo chmod 755 /var/www/admin/cgi-bin/*.py2. 核心功能实现2.1 系统状态监控模块创建system.py监控服务器基础指标#!/usr/bin/env python3 import cgi import psutil from datetime import datetime def get_system_stats(): return { cpu_usage: psutil.cpu_percent(), memory: psutil.virtual_memory().percent, disk: psutil.disk_usage(/).percent, uptime: str(datetime.now() - datetime.fromtimestamp(psutil.boot_time())), processes: len(psutil.pids()) } print(Content-Type: text/html\n) stats get_system_stats() print(f html headtitle系统监控/title/head body h1服务器状态概览/h1 table border1 trth指标/thth值/th/tr trtdCPU使用率/tdtd{stats[cpu_usage]}%/td/tr trtd内存使用/tdtd{stats[memory]}%/td/tr trtd磁盘空间/tdtd{stats[disk]}%/td/tr trtd运行时间/tdtd{stats[uptime]}/td/tr trtd进程数/tdtd{stats[processes]}/td/tr /table /body /html )2.2 文件管理模块files.py实现基础文件操作功能#!/usr/bin/env python3 import cgi import os import html from pathlib import Path BASE_DIR /var/www/admin/uploads form cgi.FieldStorage() action form.getvalue(action) print(Content-Type: text/html\n) print(htmlheadtitle文件管理/title/headbody) if action upload: fileitem form[file] if fileitem.filename: filename os.path.basename(fileitem.filename) save_path os.path.join(BASE_DIR, filename) with open(save_path, wb) as f: f.write(fileitem.file.read()) print(fp文件 {html.escape(filename)} 上传成功/p) elif action delete: filename form.getvalue(filename) if filename: safe_path os.path.join(BASE_DIR, os.path.basename(filename)) if os.path.exists(safe_path): os.remove(safe_path) print(fp文件 {html.escape(filename)} 已删除/p) # 显示文件列表 print(h2文件列表/h2ul) for f in sorted(Path(BASE_DIR).iterdir()): if f.is_file(): print(fli{html.escape(f.name)} - {f.stat().st_size/1024:.1f} KB f[a href?actiondeletefilename{f.name}删除/a]/li) print(/ul) # 上传表单 print( h2上传文件/h2 form methodpost enctypemultipart/form-data input typehidden nameaction valueupload input typefile namefile input typesubmit value上传 /form /body/html )3. SQLite数据库集成3.1 数据库管理界面创建dbadmin.py实现简易数据库操作#!/usr/bin/env python3 import cgi import sqlite3 from html import escape DB_PATH /var/www/admin/data/admin.db def init_db(): with sqlite3.connect(DB_PATH) as conn: conn.execute( CREATE TABLE IF NOT EXISTS settings ( key TEXT PRIMARY KEY, value TEXT, description TEXT )) conn.commit() form cgi.FieldStorage() action form.getvalue(action) print(Content-Type: text/html\n) print(htmlheadtitle数据库管理/title/headbody) if action add_setting: key form.getvalue(key) value form.getvalue(value) desc form.getvalue(desc) if key and value: with sqlite3.connect(DB_PATH) as conn: conn.execute(INSERT OR REPLACE INTO settings VALUES (?,?,?), (key, value, desc)) conn.commit() print(p设置已保存/p) init_db() # 显示当前设置 print(h2系统设置/h2) print(table border1trth键/thth值/thth描述/thth操作/th/tr) with sqlite3.connect(DB_PATH) as conn: for row in conn.execute(SELECT key, value, description FROM settings): print(ftrtd{escape(row[0])}/tdtd{escape(row[1])}/td ftd{escape(row[2])}/td ftd[a href?actiondeletekey{row[0]}删除/a]/td/tr) print(/table) # 添加新设置表单 print( h2添加/更新设置/h2 form methodpost input typehidden nameaction valueadd_setting p键: input typetext namekey required/p p值: input typetext namevalue required/p p描述: textarea namedesc/textarea/p input typesubmit value保存 /form /body/html )3.2 数据库备份功能扩展dbadmin.py添加备份功能def backup_database(): backup_path f{DB_PATH}.backup.{datetime.now().strftime(%Y%m%d)} with sqlite3.connect(DB_PATH) as src, sqlite3.connect(backup_path) as dst: src.backup(dst) return backup_path if form.getvalue(action) backup: backup_file backup_database() print(fp数据库已备份到 {escape(backup_file)}/p)4. 安全加固与优化4.1 基础安全措施输入验证对所有用户输入进行消毒处理路径安全使用os.path.basename防止目录遍历攻击权限控制确保脚本以最小必要权限运行# 安全获取文件路径示例 def get_safe_path(user_input): base_dir /var/www/admin/uploads filename os.path.basename(user_input) full_path os.path.join(base_dir, filename) if not os.path.abspath(full_path).startswith(base_dir): raise ValueError(非法路径访问) return full_path4.2 性能优化技巧使用SQLite连接池减少数据库连接开销实现简单的缓存机制避免重复计算对静态资源启用浏览器缓存# 简易缓存装饰器 def cache_result(ttl60): def decorator(func): cache {} def wrapper(*args): now time.time() if args in cache and now - cache[args][time] ttl: return cache[args][value] result func(*args) cache[args] {value: result, time: now} return result return wrapper return decorator cache_result(ttl300) def get_system_stats(): # 原有实现...4.3 用户认证方案实现基础HTTP认证import base64 def check_auth(): auth os.environ.get(HTTP_AUTHORIZATION, ) if not auth.startswith(Basic ): return False auth base64.b64decode(auth[6:]).decode(utf-8) username, password auth.split(:, 1) return username admin and password securepassword if not check_auth(): print(Status: 401 Unauthorized) print(WWW-Authenticate: Basic realmAdmin Panel) print(Content-Type: text/html\n) print(h1401 Unauthorized/h1) exit()5. 功能扩展思路5.1 服务管理功能添加启动/停止系统服务的功能def service_action(service, action): if action not in [start, stop, restart]: return False try: subprocess.run([sudo, systemctl, action, service], checkTrue) return True except subprocess.CalledProcessError: return False5.2 日志查看器实现简易日志查看界面def tail_log(filepath, lines50): try: with open(filepath, r) as f: return .join(deque(f, lines)) except Exception as e: return f无法读取日志: {str(e)}5.3 计划任务管理集成crontab管理功能def list_cron_jobs(userwww-data): try: result subprocess.run([crontab, -u, user, -l], capture_outputTrue, textTrue) return result.stdout except subprocess.CalledProcessError: return 无计划任务或读取失败在实际部署中我发现将常用功能模块化后这套系统可以稳定运行在仅有512MB内存的树莓派上日均处理数百次请求毫无压力。对于需要快速搭建简单管理界面的场景这种复古方案反而展现出独特的优势。

相关文章:

用Python CGI给老旧服务器写个简易后台管理面板(Apache配置+SQLite数据库)

用Python CGI打造轻量级服务器管理面板实战指南 在资源受限的老旧服务器环境中,部署现代Web框架往往显得大材小用。本文将展示如何利用Python CGI和SQLite数据库,为树莓派、老款VPS等设备快速构建一个功能完备的轻量级管理面板。这种方案特别适合需要快速…...

影墨·今颜GPU算力成本分析:A10单卡月均¥800 vs API调用年省¥12万

影墨今颜GPU算力成本分析:A10单卡月均¥800 vs API调用年省¥12万 在AI影像创作领域,追求极致画质与真实感已成为核心趋势。然而,对于个人创作者、小型工作室乃至企业而言,部署和运行一个像「影墨今颜」这样…...

华硕笔记本性能优化:3步快速掌握G-Helper系统调优工具

华硕笔记本性能优化:3步快速掌握G-Helper系统调优工具 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址…...

Spring_couplet_generation 作为教学工具:计算机专业课程设计案例

Spring_couplet_generation 作为教学工具:计算机专业课程设计案例 最近在准备《人工智能导论》的课程设计,想找一个既能体现AI应用全流程,又不会让学生望而却步的实践项目。找来找去,发现用AI写对联这个事儿,其实是个…...

Qwen3-Reranker-0.6B效果展示:多语言混合文档(中英法)重排准确率对比

Qwen3-Reranker-0.6B效果展示:多语言混合文档(中英法)重排准确率对比 1. 引言 想象一下,你正在一个庞大的多语言知识库中搜索信息。这个知识库里混杂着中文、英文、法文等各种语言的文档。你输入一个中文问题,系统返…...

手把手解析:如何用CVD生长晶圆级二维半导体(附避坑指南)

手把手解析:如何用CVD生长晶圆级二维半导体(附避坑指南) 走进任何一家先进半导体实验室,你都会看到研究人员围在CVD设备前眉头紧锁——有人刚得到完美的单层MoS2薄膜,也有人正对着布满裂纹的样品发愁。这种场景每天都在…...

# 发散创新:基于Go语言的链路追踪实战——从零构建分布式系统可观测性核心组件 在微服务架构日益普及的今天,**链路追踪(D

发散创新:基于Go语言的链路追踪实战——从零构建分布式系统可观测性核心组件 在微服务架构日益普及的今天,链路追踪(Distributed Tracing) 已成为保障系统稳定性和性能调优的关键手段。本文将带你使用 Go语言 深度实践一个轻量级但…...

开源贡献指南:为OpenClaw编写Qwen3-32B适配器插件

开源贡献指南:为OpenClaw编写Qwen3-32B适配器插件 1. 为什么需要Qwen3-32B适配器? 去年夏天我第一次尝试将Qwen3-32B接入OpenClaw时,发现直接调用原始API会遇到三个典型问题:模型特有的停止标记(stop tokens&#xf…...

Spring_couplet_generation保姆级部署:Ubuntu 20.04系统环境详解

Spring_couplet_generation保姆级部署:Ubuntu 20.04系统环境详解 春节写春联,想用AI来点新意?或者你正在寻找一个有趣的中文文本生成项目来练手?今天,我们就来聊聊如何在Ubuntu 20.04系统上,从零开始部署一…...

GetQzonehistory:一键备份QQ空间历史说说的Python神器

GetQzonehistory:一键备份QQ空间历史说说的Python神器 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字记忆日益珍贵的今天,QQ空间承载着无数人的青春印记。…...

Qwen3-14B-Int4-AWQ集成SpringBoot实战:构建企业级智能问答微服务

Qwen3-14B-Int4-AWQ集成SpringBoot实战:构建企业级智能问答微服务 1. 引言:当大模型遇见微服务 最近在帮一家电商平台升级客服系统时,遇到了一个典型问题:传统规则引擎已经无法应对用户五花八门的提问。比如有用户问"我上周…...

Nunchaku-flux-1-dev用于教育科技:自动生成习题插图与知识图谱

Nunchaku-flux-1-dev用于教育科技:自动生成习题插图与知识图谱 作为一名在技术领域摸爬滚打了十来年的“老码农”,我见过太多号称能“改变教育”的技术,但真正能让一线老师、学生和内容创作者感到“真香”的,其实不多。最近深度体…...

OneAPI精彩案例:科研论文助手调用Gemini+Claude+GLM进行文献摘要与引用生成

OneAPI精彩案例:科研论文助手调用GeminiClaudeGLM进行文献摘要与引用生成 你是不是也遇到过这样的场景?面对几十篇待读的文献,光是整理摘要和引用格式就耗去大半天时间。或者,在写论文时,需要快速理解一篇复杂文献的核…...

春联生成模型中文版在Node.js环境中的高效调用方法

春联生成模型中文版在Node.js环境中的高效调用方法 1. 环境准备与快速开始 在开始之前,我们先来快速搭建一个能跑起来的春联生成环境。不用担心,就算你是刚接触Node.js的新手,跟着步骤走也能轻松搞定。 首先确保你的电脑上已经安装了Node.…...

量化数据获取新思路:如何用掘金量化API构建本地股票数据库(Python实战)

量化数据获取新思路:如何用掘金量化API构建本地股票数据库(Python实战) 金融数据是量化研究的基石,但临时调用在线API往往面临延迟高、稳定性差的问题。对于需要长期跟踪多维度数据的独立研究者而言,构建本地数据库不仅…...

AGV小车PID调参实战:从入门到精通的5个关键步骤(附调参口诀)

AGV小车PID调参实战:从入门到精通的5个关键步骤(附调参口诀) 在工业自动化领域,AGV(自动导引车)的精准运动控制一直是工程师们面临的挑战。想象一下,当你设计的AGV在仓库中突然偏离预定轨迹&…...

Vue站点安全指南:如何利用Vue Devtools插件快速发现路由漏洞

Vue站点安全自查实战:用Devtools深度挖掘路由隐患 在当今快速迭代的前端开发中,Vue.js因其灵活性和高效性成为众多开发者的首选框架。然而,随着应用复杂度提升,路由安全问题往往成为容易被忽视的"沉默杀手"。一次偶然的…...

KLite轻量级RTOS内核:千行代码的嵌入式实时操作系统

1. 项目概述KLite 是一款面向嵌入式初学者与轻量级应用场景设计的抢占式实时操作系统内核。其核心定位并非替代成熟商用RTOS,而是以“最小可行内核”为工程目标,通过极简的代码结构、直观的API语义和低侵入式移植路径,降低嵌入式多任务编程的…...

从入门到精通:Redis实战指南,解锁高性能缓存核心能力

在高并发、分布式系统当道的今天,Redis早已不是单纯的“缓存工具”,而是后端架构中不可或缺的核心组件——它既是缓解数据库压力的“性能担当”,也是实现分布式锁、实时排行榜等复杂功能的“瑞士军刀”。无论是中小项目的缓存优化&#xff0c…...

Qwen3-32B-Chat效果展示:RTX4090D上多轮中文对话、代码生成、逻辑推理真实案例

Qwen3-32B-Chat效果展示:RTX4090D上多轮中文对话、代码生成、逻辑推理真实案例 1. 开箱即用的高性能大模型体验 Qwen3-32B-Chat 私有部署镜像专为RTX4090D 24G显存环境深度优化,基于CUDA12.4和驱动550.90.07打造,提供开箱即用的大模型推理体…...

零基础玩转Cogito-V1-Preview-Llama-3B:Anaconda环境搭建与模型调用指南

零基础玩转Cogito-V1-Preview-Llama-3B:Anaconda环境搭建与模型调用指南 你是不是也对最近火热的AI大模型充满好奇,想亲手试试调用一个真正的模型,但又担心环境配置太复杂,被各种依赖和版本问题劝退?别担心&#xff0…...

西门子1200控制台达A2伺服485通讯控制程序开发之旅(博图V15.1)

西门子1200控制台达A2伺服485通讯控制程序,博图V15.1在自动化控制领域,西门子1200 PLC与台达A2伺服通过485通讯协同工作,能实现高效精准的运动控制。今天就来分享下基于博图V15.1的相关控制程序编写。 一、硬件连接与通讯设置 首先&#xff0…...

Qwen3.5-9B多任务效果展示:数学推理+编程调试+视觉问答三重验证

Qwen3.5-9B多任务效果展示:数学推理编程调试视觉问答三重验证 1. 模型概述与核心能力 Qwen3.5-9B作为新一代多模态大模型,在数学推理、编程辅助和视觉问答三大领域展现出卓越性能。该模型基于unsolth框架开发,通过Gradio Web UI提供服务&am…...

Qwen3-32B-Chat镜像部署教程:transformers pipeline batch_size参数调优

Qwen3-32B-Chat镜像部署教程:transformers pipeline batch_size参数调优 1. 环境准备与快速部署 本教程将指导您在RTX 4090D 24GB显存环境下部署Qwen3-32B-Chat镜像,并重点讲解如何优化transformers pipeline的batch_size参数以获得最佳推理性能。 1.…...

DAMO-YOLO参数详解:如何导出ONNX模型并用OpenVINO在CPU端部署

DAMO-YOLO参数详解:如何导出ONNX模型并用OpenVINO在CPU端部署 1. 引言:为什么需要CPU端部署 在实际的工业应用中,我们经常遇到这样的场景:项目现场没有高端GPU设备,但需要实时运行目标检测算法。这时候,将…...

LangSmith实战:如何高效监控与优化LLM应用开发流程

1. 为什么需要LangSmith来监控LLM应用开发 如果你正在用LangChain开发大语言模型应用,大概率会遇到这样的场景:代码跑起来了但效果不理想,却不知道问题出在哪个环节。我去年开发客服机器人时就深有体会——明明单个prompt测试时表现很好&…...

RMBG-2.0惊艳效果展示:婚纱裙摆/婴儿胎发/宠物胡须等极限案例集

RMBG-2.0惊艳效果展示:婚纱裙摆/婴儿胎发/宠物胡须等极限案例集 1. 引言:当抠图遇到极限挑战 你有没有遇到过这样的烦恼?想给心爱的宠物换张背景,结果发现它的胡须和毛发边缘总是处理不干净,要么被切掉一半&#xff…...

Vxe-Table表头Tooltip踩坑实录:从样式错位到性能优化,我总结了这5点

Vxe-Table表头Tooltip实战指南:从样式适配到性能调优的完整解决方案 最近在项目中深度使用Vxe-Table时,发现表头Tooltip功能看似简单,实际落地却暗藏玄机。特别是在企业级应用中,面对动态列宽、大数据量、多端适配等复杂场景时&am…...

Realistic Vision V5.1 虚拟摄影棚:Matlab联合仿真——生成训练数据用于算法验证

Realistic Vision V5.1 虚拟摄影棚:Matlab联合仿真——生成训练数据用于算法验证 搞算法研发,尤其是计算机视觉和自动驾驶这类方向的朋友,估计都遇到过同一个头疼的问题:数据不够用,或者数据不够“真”。 你想训练一…...

SSD用久了会变慢?手把手教你理解‘写放大’和‘磨损均衡’,以及选购NVMe硬盘时的避坑要点

SSD性能衰减真相:从写放大到磨损均衡的消费级解决方案 当你的高端NVMe SSD用了一年多后突然开始"卡顿",拷贝大文件时速度从3500MB/s暴跌到500MB/s,这很可能不是心理作用。我去年为视频工作站配备的某品牌PCIe 4.0 SSD就遭遇过这种尴…...