python http模块快速搭建“简单”服务器笔记

news2024/9/21 12:43:56

极简运行

python -m http.sever

# test.py
import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

在这里插入图片描述
在这里插入图片描述

CGI-Bin

  • 做了以上的启动之后就得到了一个文件服务器。

  • 我主要复制教你如何用几行Python代码编写出一个简易Web服务器的代码。在当前目录下创建C:\Users\admin\Desktop\http\cgi-bin文件夹,CGI-bin 是一个用于存放脚本的文件夹,这些脚本将与 Web 浏览器交互以提供网页或网站的功能。通用网关接口 (CGI) 是一种资源,用于在 Web 设计中使用脚本。当脚本从服务器发送到 Web 浏览器时,通常在 url 中引用 CGI-bin。,用于实现类似jsp的功能。

  • 但是大多数的博客都比较推荐使用此模块搭建简单的测试项目。

启动服务

import os
from http.server import HTTPServer, CGIHTTPRequestHandler
webdir="C:\\Users\\admin\\Desktop\\http"
os.chdir(webdir)
HTTPServer(("127.0.0.1", 8080), CGIHTTPRequestHandler).serve_forever()
import pickle
import os

student_keys = ("name", "gender", "age", "score")

if os.path.exists("student.data"):
    with open("student.data", "rb") as file:
        student = pickle.load(file)
    student = student or {}
else:
    student = {}

if not student:
    student = dict.fromkeys(student_keys, "")

header = "Content-Type: text/html\n"
content = """
<html>
  <body>
    <form action="/cgi-bin/update.py" method="POST">
        <table>
            <tr>
                <td>name: </td>
                <td><input name="name" value="{name}"/></td>
            </tr>
            <tr>
                <td>gender:</td>
                <td><input name="gender" value="{gender}"/></td>
            <tr>
            <tr>
                <td>age: </td>
                <td><input name="age" value="{age}"/></td>
            </tr>
            <tr>
                <td>score: </td>
                <td><input name="score" value="{score}"/></td>
            </tr>
            <tr>
                <td style="padding-top: 10px" align="center" colspan="2">
                    <button type="submit">Submit</button>
                </td>
            </tr>
        </table>
    </form>
  </body>
</html>
"""
import os
import cgi
import pickle

student_keys = ("name", "gender", "age", "score")
if os.path.exists("student.data"):
    with open("student.data", "rb") as file:
        student = pickle.load(file)
    student = student or {}
else:
    student = {} 

if not student:
    student = dict.fromkeys(student_keys, "")

form = cgi.FieldStorage()
for key in student_keys:
    if key in form and form[key].value:
        student[key] = form[key].value

with open("student.data", "wb") as file:
    pickle.dump(student, file)

header = "Content-Type: text/html\n"
content = """
<html>
<body>
<h1>update successfully, will skip to display page: <span id="count_down">3</span></h1>
<script>
   var count = 3 
   timer_id = setInterval(function(){
       count = count -1
       if(count == 0) {
           clearInterval(timer_id)
           location.href="/cgi-bin/student.py"
       } else {
           document.getElementById("count_down").innerHTML = "" + count
       }
   },1000)
</script>
</body>
</html>
"""

在这里插入图片描述
你可能应该访问“localhost:81/cgi-bin/index.py”。因为“localhost:81/cgi-bin/”是一个目录,不是一个python script。

使用体验

  • 当在文件服务器的模式下,可以直接访问并渲染html文件,但是当我使用以下代码时,浏览器提示var myChart = echarts.init(document.getElementById('main'));无法找到echarts对象。
import os
import cgi
import pickle

# student_keys = ("name", "gender", "age", "score")
# if os.path.exists("student.data"):
#     with open("student.data", "rb") as file:
#         student = pickle.load(file)
#     student = student or {}
# else:
#     student = {}
#
# if not student:
#     student = dict.fromkeys(student_keys, "")

form = cgi.FieldStorage()
# for key in student_keys:
#     if key in form and form[key].value:
#         student[key] = form[key].value

# with open("student.data", "wb") as file:
#     pickle.dump(student, file)

header = "Content-Type: text/html\n"
content = """
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>bar</title>
    <!-- 引入 echarts.js -->
    <script src="echarts.min.js"></script>
</head>
<body>
<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
<div id="main" style="width: 900px;height:600px;"></div>

<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例

var myChart = echarts.init(document.getElementById('main'));

// 指定图表的配置项和数据
var option = {
    // 标题
    title: {
        text: 'ECharts 入门示例'
    },
    // 工具箱
    toolbox: {
        show: true,
        feature: {
            saveAsImage: {
                show: true
            }
        }
    },
    // 图例
    legend: {
        data: ['销量']
    },
    // x轴
    xAxis: {
        data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
    },
    yAxis: {},
    // 数据
    series: [{
        name: '销量',
        type: 'bar',
        data: [5, 20, 36, 10, 10, 20]
    }]
};

// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
</script>
</body>
</html>
"""
print(header + content)

参考与更多

https://docs.python.org/3/library/http.server.html
用 Python 的 SimpleHTTPServer 模組快速建立一個臨時網頁伺服器(Web Server)
使用Python的http.server实现一个简易的Web Api对外提供HanLP拼音转换服务
simple http server for upload and download

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/58167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

m基于matlab的光通信的信道估计,均衡,抑制papr误码率仿真,对比ZF,RLS,MMSE三种算法

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 可见光通信的信道估计&#xff0c;均衡&#xff0c;抑制papr。 不考虑光信道&#xff0c;用传统的无线通信的OFDM的信道估计&#xff0c;均衡&#xff0c;抑制papr 信道估计&#xff0c;均衡最…

解决Windows RDP远程桌面连接同时多用户连接不互踢不干扰问题及rdp wrapper windows版本不受支持问题.

注意: 如果你当前正在通过RDP方式远程连接到你要更改设置的目标计算机,请在目标计算机上安装其他远程控制软件.防止RDP因在此过程中挂掉无法连接. 下载: 使用GitHub - stascorp/rdpwrap: RDP Wrapper Library开源软件 转到Release 最新版本的是1.6.2,原作者没有更新的了.好…

MySQL中count(*)和information_schema.tables中的table_rows值不相同

前两天我还在高高兴兴地写了一篇文章《一条SQL查询出MySQL数据库中所有表的数据量大小》&#xff0c;心想这也太方便了&#xff0c;只用一条SQL就能统计出所有表的数据量&#xff0c;但没想到&#xff0c;最终还是翻车了。。。 翻车过程如下&#xff1a; 有一张表&#xff0c…

【多目标进化优化】 MOEA 测试函数

声明 本文内容来源于 《多目标进化优化》 郑金华 邹娟著&#xff0c;非常感谢两位老师的知识分享&#xff0c;如有侵权&#xff0c;本人立即删除&#xff0c;同时在此表示&#xff0c;本文内容仅学习使用&#xff0c;禁止侵权&#xff0c;谢谢&#xff01; 注&#xff1a;本文…

HTML+CSS制作简单的家乡网页 ——我的家乡介绍广东 web前端期末大作业

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

基于STM32单片机的温度报警器(数码管)(Proteus仿真+程序)

编号&#xff1a;26 基于STM32单片机的温度报警器&#xff08;数码管) 功能描述&#xff1a; 本设计由STM32F103单片机最小系统DS18B20温度传感器数码管显示模块声光报警模块独立按键组成。 1、主控制器是STM32F103单片机 2、DS18B20温度传感器测量温度 3、数码管显示温度值&…

数字化改革“1612”详解

背景 2021年2月18日&#xff0c;浙江省开始数字化改革建设&#xff0c;通过一年的建设&#xff0c;取得了光辉成绩。2022年2月28日&#xff0c;在省数字化改革推进大会&#xff0c;回顾一年来数字化改革的主要成效&#xff0c;研究部署2022年数字化改革目标任务&#xff0c;在…

Spring框架(六):SpringTransaction事务的底层原理、xml配置和注解配置

SpringTransaction事务的底层原理、xml配置和注解配置引子Spring事务入门搭建Test环境基于XML的方式配置事务Spring事务的隔离级别Spring事务的传播行为通过Annotation方式配置Spring的事务引子 痛定思痛&#xff0c;主要问题出现在自己雀氏不熟悉框架底层、一些面试题&#x…

【源码分析】Springboot启动流程源码分析

1.简介 springboot版本&#xff1a;2.7.2 SpringApplication类是用来执行Spring框架启动的引导类。 有两种方式可以进行启动引导&#xff1a; 通过静态方法SpringApplication.run启动。先创建SpringApplication实例&#xff0c;在调用的实例方法run进行启动。 无论是以上哪种…

资源管理管理

资源管理目录概述需求&#xff1a;设计思路实现思路分析1.PMI hr的理念2.双因素的理论3.马斯洛的需求层析理论4.延伸5.X&#xff0c;Y理论Z 理论期望理论&#xff1a;亚当斯公共理论边际福利&#xff0c;光环效应&#xff0c;额外待遇&#xff0c;皮的原理&#xff0c;KISS原理…

阿里P9大牛带你在简历上写精通Spring与Boot高级功能

前言 蓦然回首自己做开发已经十年了&#xff0c;这十年中我获得了很多&#xff0c;技术能力、培训、出国、大公司的经历&#xff0c;还有很多很好的朋友。但再仔细一想&#xff0c;这十年中我至少浪费了五年时间&#xff0c;这五年可以足够让自己成长为一个优秀的程序员&#…

QT - 模型与视图

经典MVC模式中&#xff0c;M是指业务模型&#xff0c;V是指用户界面&#xff0c;C则是控制器&#xff0c;使用MVC的目的是将M和V的实现代码分离&#xff0c;从而使同一个程序可以使用不同的表现形式。其中&#xff0c;View的定义比较清晰&#xff0c;就是用户界面。 MVC 不是一…

银行 测试|测试开发 面试真题|面经 汇总

招银测开面经 一面 1.面向对象3大特征 2.java是否能多继承&#xff0c;怎么实现多继承 3.抽象类 4.数据库特性&#xff0c;隔离级别 5.sql语句查找 6.static关键字的使用 7.手撕&#xff1a;寻找字符串出现频率最高的字符 8.代码改进和测试 二面 1.先闲聊了几句&…

Python面向对象编程

本篇内容: 1、反射  2、面向对象编程  3、面向对象三大特性  4、类成员  5、类成员修饰符  6、类的特殊成员  7、单例模式 反射 python中的反射功能是由以下四个内置函数提供&#xff1a;hasattr、getattr、setattr、delattr&#xff0c;改四个函数分别用于对对象…

m基于GA遗传算法的高载能负荷响应优化控制模型matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 高载能企业执行子站接收负荷调整指令后&#xff0c;需将有功功率、无功功率调整总量合理分配给各用能设备/系统。研究高载能负荷响应优化控制模型&#xff0c;建立以高载能企业响应效益最优为目标…

ccf序列查询新解python满分_纯数学规律(学霸怎么想到的啊......)

题目 思路和代码 这题我也就看了好几个小时吧。终于&#xff01;有点懂了&#xff01; 上午看懂了用双指针写《下一个排序》后就在看这题。70分的代码很好写也很好想&#xff0c;就是模拟fx和gx&#xff0c;然后遍历一趟&#xff0c;得到最终的结果。 看了学霸的代码&#x…

使用桥梁振动自动识别车辆(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Qt在线安装教程(详细图文)

Qt在线安装教程&#xff08;详细图文一、前言二、QT账号的注册三、QT的安装的镜像四、安装的过程一、前言 个人主页: ζ小菜鸡大家好我是ζ小菜鸡&#xff0c;小伙伴们&#xff0c;让我们一起来学习Qt在线安装。如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连) 二、QT账号…

js-mark新时代的网页标记容器

js-mark &#x1f58d;️️ ✨ 它提供了一组可交互操作的工具来注释网页内容 ✨&#x1f58d;️ js-mark是一个JavaScript库&#xff0c;用于在浏览器。他是一个可以在任何网页做标记的前端库, 它提供了一组可交互操作的工具来注释网页内容。 支持标记文本和 持久化存储与还原…

LSTM和双向LSTM讲解及实践

目录&#xff1a; RNN的长期依赖问题LSTM原理讲解双向LSTM原理讲解keras实现LSTM和双向LSTM RNN 的长期依赖问题 在上篇文章中介绍的循环神经网络RNN在训练的过程中会有长期依赖的问题&#xff0c;这是由于RNN模型在训练时会遇到梯度消失(大部分情况)或者梯度爆炸(很少&…