Python入门基础:Python 200行代码实现简单的WebServer,还支持图片加载(WSGI,Socket ,TCP,thread)

Ubuntu 20.04 部署 ERPNext 全栈解析与生产级排错指南 ERPNext 是基于 Frappe 框架的开源企业资源计划系统,其部署本质是构建一个跨层协同的技术栈,而非简单安装软件。理解其底层原理需掌握 Python 运行时、MariaDB/Redis 持久化服务、Nginx 反向代理、Supervisor 进程管理及系统级依赖(如 systemd-resolved、AppArmor)的交互逻辑。该技术栈在 Ubuntu 20.04 上存在诸多发行版特有陷阱,例如 DNS 解析异常、端口抢占和权限策略冲突,直接影响服务稳定性与后台任务执行。典型应用场景包括中小制造/ 阅读详情

下载地址:https://download.youkuaiyun.com/download/nosprings/12108998

1、代码程序结构如下:

static——静态文件目录

templates——html模板文件目录

application.py——TCP连接监听和工作线程处理收发数据

request.py——解析http请求

response.py——封装发送数据模块

runserver.py——服务器启动main模块

2、具体代码实现

application.py

import socket
import threading
from response import HttpResponse
from request  import HttpRequest

# WSGI服务器
class WSGIServer():

    def __init__(self, host='localhost', port=8080, connectSize=100):
        '''
        :param port: 服务器的端口号
        :param connectSize: 默认的并发数量
        '''
        self.__host = host
        self.__port = port
        self.__connectSize = connectSize
        pass

    def startServer(self):
        '''
        服务启动主程序
        :return:
        '''
        server = None
        try:
            server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            server.bind((self.__host, self.__port))
            server.listen(self.__connectSize)
            while True:
                print("======服务器启动成功:http://" + self.__host + ":" + str(self.__port))
                clientConn, clientAddr = server.accept()  # 等待客户端请求
                # 启动独立的线程,处理每一次用户请求
                wt = WorkThread(clientConn, clientAddr)
                wt.start()
                pass
        except socket.gaierror as g:
            print(g)
        finally:
            if server:
                server.close()
        pass

    pass

class WorkThread(threading.Thread):
    def __init__(self, connection, addr, bufferSize=8096):
        threading.Thread.__init__(self)
        self.__connection = connection
        self.__addr = addr
        self.__bufferSize = bufferSize
        pass

    def run(self):
        receiveMsg = self.__connection.recv(self.__bufferSize)
        receiveMsg = receiveMsg.decode("utf-8")
        print(receiveMsg)
        request = HttpRequest()
        params = request.parseRequest(receiveMsg)
        responseText = ""
        response = HttpResponse()
        if params['Accept'].find('text/html') >=0:
            url = 'templates/index.html'
            if params['url'] == "/":
                url = 'templates/index.html'
            else:
                url = 'templates' + params['url']
                if params['url'] == '/main.html':
                    if params.get('dataparams').get('userName') != 'zhangsan':
                        url = 'templates/index.html'
                        responseText = response.responseHeader('text/html', 200) + "\n" + response.responseBodyText(url)
                        pass
                    pass
            responseText = response.responseHeader('text/html', 200) + "\n" + response.responseBodyText(url)
            self.__connection.send(responseText.encode("utf-8"))
            pass
        elif params['Accept'].find('image/') >= 0:
            url = params['url']
            self.__connection.send(response.responseHeader('image/', 200).encode("utf-8"))
            self.__connection.send("\n".encode("utf-8"))
            self.__connection.send(response.responseBodyBinary(url[1:]))
            pass
            print(responseText)

        self.__connection.close()

        pass
    pass

request.py

class HttpRequest():

    def parseRequest(self, requestText):
        params = {}
        lineArray = requestText.split('\r\n')
        row = 1
        isBody = False
        bodyText = ""
        for line in lineArray:
            if row == 1 :
                array = line.split(' ')
                params['method'] = array[0]
                params['url'] = array[1]
                params['httptype'] = array[2]
                row += 1
            elif line.strip() == "":
                isBody = True
            elif not isBody:
                array = line.split(':')
                params[array[0]] = line[len(array[0])+2:]
                pass
            elif isBody:
                bodyText += line
            pass

        params['body'] = bodyText
        dataParams = {}
        bodyText = bodyText.strip()
        if params.get('Content-Type') == 'application/x-www-form-urlencoded' and   params['method'] == 'POST':
            array = bodyText.split('&')
            for data in array:
                keyvalue = data.split("=")
                dataParams[keyvalue[0]] = keyvalue[1]
                pass
            pass
        params['dataparams'] = dataParams
        return params
        pass
    pass

response.py

class HttpResponse():
    def responseHeader(self, contentType, ressponseCode):
        header = "http/1.1 200 OK\r\n"
        if contentType == 'text/html':
                header += "Content-Type: text/html\r\n" + \
                 "X-Ua-Compatible: IE=Edge,chrome=1\r\n"
        elif contentType == "image/":
            header += "Content-Type: image/png\r\n" + \
                      "X-Ua-Compatible: IE=Edge,chrome=1\r\n"
        return header
        pass

    def responseBodyText(self, url):
        body = ""
        with open(url, 'r') as fp:
            body = fp.read()
        return body
        pass

    def responseBodyBinary(self, url):
        body = b""
        with open(url, 'rb') as fp:
            body = fp.read()
        return body
    pass

runserver.py

from application import WSGIServer

if __name__ == '__main__':
    # 创建服务器对象
    wsgiServer = WSGIServer()
    wsgiServer.startServer()
    pass

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
   Hello, my WSGI server!
 <form method="post" action="main.html">
     <input type="text" name="userName">
     <input type="password" name="userPwd">
     <input type="submit"  />
 </form>
</body>
</html>

main.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<img src="static/photo1.png" />
System main page!
</body>
</html>

3、运行效果

PythonWebServer 摆脱又大又重的.net framework。使用Python编写免安装运行时、以Windows后台服务形式运行的WEB服务器 立即下载

相关推荐

小巧的web服务器 PyWebServer v1.0 (只有一个exe文件)

版本V1.0 非常小巧的一个单exe文件web服务器,大小约为6MB,端口号为8081,直接把当前目录指定为web根目录,支持目录浏览,自定义端口/IP/根目录,文件访问。 适合测试,查看html帮助文档。附上了python源代码,方便修改并用‘pyinstaller -F -c pyWebServer.py’打包成单个exe文件。 参考我的博客:https://blog.csdn.net/hansel/article/details/89762715

Python入门自学进阶-Web框架——1、认识WEB服务器及框架

框架,即framework,是解决一个开放性问题而设计的具有一定约束性的支撑结构。 DRP原则:Don't RePeat yourself。 Django

kaoa000的专栏——非淡泊无以明志,非宁静无以致远 4271

Python 200行代码实现简单的WebServer,还支持图片加载源码WSGI

Python 200行代码实现简单的WebServer,还支持图片加载源码WSGI

Python写一个简易的web服务器

这样做的好处是,当我们回到那个本章开始的任务,如果有文件的话,就尝试教我们的服务器来提供index.html页面作为目录,如果没有的话,就提供目录的列表。在另一方面,通过handle_error创建的错误页面,出现在用户犯了一些错误的时候,即,给我们发送了一个不存在的文件的URL。数据可以从磁盘上的文件复制,或由程序动态生成,或两者的结合。这是因为Web服务器只是一个程序,当它获得一个请求时,它可以做任意想做的事:发回在先前的请求里被命名的文件、提供随机选择的一个维基百科页面,或我们编写的任意的东西。

2401_87373417的博客 1941

python 基于TCP协议的套接字编程详解

基于TCP协议的套接字编程 实现电话沟通为例,这里传递的是字符,可以自己尝试去发送一个文件 # 服务端 import socket # 1. 符合TCP协议的手机 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # TCP # 2. 绑定手机号 一个服务器,我们自己的电脑作为服务器的话,用自己的IP地址 server.bind(('127.0.0.1',8000)) # 127.0.0.1 代表本地 # server.bind(('192.168.11.251',8000)) server.listen(5) # 半连接池

【深度学习面试八股文】-- 1-5

1.样本不平衡的处理方法 ①欠采样 - 随机删除观测数量足够多的类,使得两个类别间的相对比例是显著的。虽然这种方法使用起来非常简单,但很有可能被我们删除了的数据包含着预测类的重要信息。 ②过采样 - 对于不平衡的类别,我们使用拷贝现有样本的方法随机增加观测数量。理想情况下这种方法给了我们足够的样本数,但过采样可能导致过拟合训练数据。 ③合成采样( SMOTE )-该技术要求我们用合成方法得到不平衡类别的观测,该技术与现有的使用最近邻分类方法很类似。问题在于当一个类别的观测数量极度稀少时该怎...

m0_37940804的博客 9937

Day10【jQuery进阶】Ajax***

一、同步请求与异步请求 如果提交表单给服务器,当服务器处理完成之后,响应给浏览器,你发现浏览器显示页面时,闪烁了一下。 这种方式不是异步提交,而是同步提交,闪烁是页面整体刷新了。 1、什么是同步,什么是异步 普通B/S模式(同步)AJAX技术(异步) 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待卡死状态。 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都可以随意做其他事情,不会被卡死。 2、两种方式有什么不同? 同步请求,服务器响应时,页面整体刷新(

qq_43639081的博客 858

《IC验证必看|IC验证的全流程概览(从DUT到回归交付)》

本文系统介绍了IC验证的全流程,从理解设计需求到最终交付验证结果。主要内容包括:1)深入理解DUT的功能和接口;2)制定详细的测试计划(Testplan);3)搭建UVM验证平台;4)执行定向和随机测试并进行回归;5)分析功能、代码和断言覆盖率;6)交付完整的验证报告。文章强调验证是一个闭环过程,特别指出新手容易忽视测试计划和覆盖率分析这两个关键环节,导致验证不充分。文末还提出思考题,引导读者反思验证计划的制定方法。

m0_46663240的博客 1261

用Python实现简单的Web Server

Refer: https://www.afternerd.com/blog/python-http-server/ Web Server的概念 用Python实现Web Server Python 2中SimpleHTTPServer模块被合并到Python 3的http.server模块。它支持目录浏览,指定端口,指定绑定地址等。 方法一:直接在命令行调用http.server模...

Hansel的专栏 1万+

K-means算法代码实现(python)

K-means算法代码实现以及解决质心选择问题 计算距离 距离通常使用欧几里得距离来衡量 def euclDistance(vector1, vector2): return np.sqrt(sum((vector2 - vector1) ** 2)) 初始化质心 def initCentroids(data, k): numSamples, dim = data.shape ...

江南小帅瓜的博客 1万+

OpenClaw Docker 安装与部署教程,环境隔离不冲突技术指南

本文介绍了使用Docker容器化部署OpenClaw的完整教程。首先通过流程图详细说明了Docker环境检测流程,包括系统支持性检查、Docker安装状态验证、版本检测和服务配置等步骤。然后提供了Windows、macOS和Linux(Ubuntu/CentOS)系统下的Docker安装指南,涵盖从下载、安装到权限配置的全过程。最后介绍了OpenClaw官方镜像的拉取方法以及自定义镜像构建的Dockerfile示例。该教程适用于开发和生产环境,利用Docker实现环境隔离和快速部署。

一键难忘的博客 987

python3.6中使用web.py创建简单webservice并使用pyinstaller打包成可执行程序

python3.6中使用web.py创建简单webservice并使用pyinstaller打包成可执行程序 1.windows 环境搭建 python版本3.6 安装:下载地址,安装过程中选择完全安装,并且勾选“将python添加到path中”。 安装web.py:因为我使用pip 安装web.py时,报好多依赖相关的错,所以建议:使用easy_install web.py命...

leiweip的博客 1907

基于Simulink的雷达跟踪系统仿真(附源码)

此示例包含对雷达系统的基本特征进行建模的子系统。该模型是用于目标位置和速度检测的雷达系统的典型模型。该示例包括雷达脉冲发生器、射频发射器子系统、移动目标的 Simulink 表示、射频接收器和接收模块(Rx 模块)。

珞瑜的博客 3515

基于Python+socket(TCP)编程实现的简单的WebServer(WSGI)(支持图片加载)

文件程序结构: static(静态文件目录) photo1 .png templates(HTML文件目录) index.html main.html application.py(TCP监听、工作线程收发数据) request.py(解析HTTP请求) response.py(数据封装发送) runserver.py(服务器启动) 实现效果: 实现代码: index.htm...

weixin_45451726的博客 424

71、机器人与机器人控制器技术解析

本文深入解析了机器人控制器的通信接口、传感器数据采集与处理以及抓手技术三大核心技术。详细介绍了数字I/O、串行接口、总线系统和以太网等通信方式,探讨了各类传感器在焊接、装配、质量检测等场景中的应用,并阐述了手眼校准与路径校正的关键方法。同时,文章还分析了不同类型抓手的特点及选型设计原则,展示了机器人在现代工业自动化中的高效性与灵活性。通过实际编程示例与流程图,全面呈现了机器人系统的集成与控制逻辑。

gin88的博客 275

【信息科学与工程学】信息科学领域——第一百三十三篇 半导体器件物理与电子封装01

③ 载流子浓度:n=∫Ec​∞​gc​(E)f(E)dE,f(E)=1+exp((E−EF​)/kB​T)1​,非简并时 n=Nc​exp(−kB​TEc​−EF​​),Nc​=2(ℏ22πme∗​kB​T​)3/2。简并时需用Fermi-Dirac积分 F1/2​(η)=π​2​∫0∞​1+ex−ηx​​dx,n=Nc​π​2​F1/2​(η),η=(EF​−Ec​)/kB​T。对于低维系统:2D g2D​(E)=πℏ2m∗​Θ(E−Ec​),1D g1D​(E)=πℏ1​E2m∗​​。

weixin_49199313的博客 552

Faust 内嵌 Web 服务器与 aiohttp 驱动:架构解析、配置指南与视图开发实战

Faust 在流处理 Worker 内部内嵌了一套基于 aiohttp 的 Web 服务器,用于提供 HTTP 接口(如 Table 路由查询、服务图渲染、自定义视图 API),这套能力由 `faust.web.drivers.aiohttp` 驱动模块完整承载。本文将以该模块为核心,深入讲解其从应用装配到请求分发、从 CORS 到 Unix Socket 传输的完整实现,并给出可直接落地的配置示

gitblog_00553的博客 473

【人工智能】从零开始玩转龙虾(Openclaw):本地与云端(火山Arkcloud)部署全指南

龙虾(Openclaw)是一款海外智能体操作系统(agent operating system),可通过飞书机器人实现自动化办公、信息抓取、任务协作等功能。它支持本地部署和云端部署两种方式,适配MacOS和Windows系统(,建议优先使用MacOS)。sudo。

奶爸的编程之路,也就一周冷个三天 947

python web server_Python实现简易版的Web服务器(推荐)

下面给大家介绍python实现简易版的web服务器,具体内容详情大家通过本文学习吧!1、请自行了解HTTP协议2、创建Socket服务,监听指定IP和端口3、以阻塞方式等待客户端连接4、读取客户端请求数据并进行解析5、准备服务器运行上下文6、处理客户端请求数据7、根据用户请求路径读取文件8、返回响应结果给客户端9、程序入口10、目录结构11、运行python wsgiserver.py app:r...

weixin_39959569的博客 453

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Python(21):用web.py搭一个服务端(python3)

Python3的web.py框架。

qcyfred的博客 8364

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Python之构建一个简单的web.py框架的服务器

http://www.myexception.cn/perl-python/900014.html                      对于web服务器参数的说明

I AM BACK 3909

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

python写webservice_使用python开发WebService

一个基本的 python web service 开发环境由以下这些工具组成:Python2.4,Eclipse WTP,PyDev plug-in,Python ZSI包ZSI 还依赖与一些其它的 python 开源包:SOAPy,pyXML建议在*nix环境下使用,原因是pyXML的windows安装包只认python2.4。步骤:1.创建wsdl文件1.1 在Eclipse中,创建一个pyt...

weixin_39644614的博客 2856

使用python3內建http.server搭建Webserver

1. 下载安装python 下载地址:https://www.python.org/downloads/release/python-372/ 2. server.py #-*- coding:utf-8 -*- import io import os import sys import urllib import json from http.server import HT...

SuperYang_的博客 8671

使用web.py 搭建服务器

有很多python的web框架,web.py是一个轻量级Python web框架。她并不是使用很多的一个。 但并不妨碍她的简单实用。搭建一个嵌入式web服务器最好不过。 下面把笔者搭建过程做一个介绍: 1. 下载python 2.7.8 ,做交叉编译,需要依据自己的平台做修改: ./configure make python Parser/pgen mv python python_for

butyesbutno的专栏 2676

进一步详解WSGI

还是老样子,需要知道什么是WSGI? 一、什么是WSGI (1)、WSGI(Web 服务器网关接口)是python中所定义的Web服务器和Web应用程序之间或框架之间的接口标准规范 (2)、WSGI接口规范的目的就是规范Web服务器与Web应用之间的交互,在协议之间进行转换 (3)、WSGI将Web组件分成三类:Web服务器(Server)、Web中间件与Web应用程序。

每天进步一点点。。。的博客 8741

python websocket-server websocket_client

websocket-server # pip install websocket-server from websocket_server import WebsocketServer # 当新的客户端连接时会提示 def new_client(client, server): print("当新的客户端连接时会提示:%s" % client['id']) server.s...

hllyzms的博客 7176
上一篇: Python Flask框架+jquery+实现异步文件上传
下一篇: Python手写实现梯度下降算法(核心是求极值,必须是凸函数),使用matplotlib绘制过程图
猿说猿道
博客等级 码龄8年 120粉丝 55原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值