Python 之web动态服务器
webServer.py代码如下:
import socket
import sys
from multiprocessing import Process class WSGIServer(object):
addressFamily = socket.AF_INET
socketType = socket.SOCK_STREAM
requestQueueSize = 100 server_response_header = "" def __init__(self, server_info, application): server_socket = socket.socket(self.addressFamily, self.socketType)
# 允许重复使用上次的套接字绑定的port
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定
server_socket.bind(server_info)
# 变为被动,并制定队列的长度
server_socket.listen(self.requestQueueSize)
self.server_socket = server_socket
self.application = application def wait_client(self):
'循环运行web服务器,等待客户端的链接并为客户端服务'
while True:
# 等待新客户端到来
new_socket, address = self.server_socket.accept()
# 多进程服务器,并发服务器于多个客户端
process = Process(target=self.handle_client, args=(new_socket,))
process.start()
# 因为创建的新进程中,会对这个套接字+1,所以需要在主进程中减去依次,即调用一次close
new_socket.close() def handle_client(self, new_socket):
'用一个新的进程,为一个客户端进行服务'
get_client_data = new_socket.recv(2048)
lines = str(get_client_data).splitlines()
request_data = str(lines[0]).split(" ")
try:
file_name = request_data[1]
method = request_data[0]
except IndexError as e:
print(e)
return False
# 根据接收到的请求头构造环境变量字典
env = {
"PATH_INFO": file_name,
"METHOD": method
}
# 调用应用的相应方法,完成动态数据的获取
response_body = self.application(env, self.start_response)
response = self.server_response_header + response_body
new_socket.send(response.encode("utf-8"))
new_socket.close() def start_response(self, status, header):
headers = "HTTP/1.0 " + status + " \r\n"
for h in header:
headers += "%s : %s\r\n" % h
self.server_response_header = headers + "\r\n" def main():
if len(sys.argv) < 2:
sys.exit('请按照要求,指定模块名称:应用名称,例如 module:callable') # 获取module:callable
appPath = sys.argv[1]
# 根据冒号切割为module和callable
module, application = appPath.split(':')
module_root = "./module"
# 添加路径套sys.path
sys.path.insert(0, module_root)
# 动态导入module变量中指定的模块
module = __import__(module)
# 获取module变量中指定的模块的,application变量指定的属性
application = getattr(module, application)
wsgi_server = WSGIServer(("", 8081), application)
wsgi_server.wait_client() if __name__ == '__main__':
main()
start.py代码如下:
class Application(object):
def __init__(self, urls):
self.urls = urls def __call__(self, env, start_response):
path = env.get("PATH_INFO", "/")
if str(path).startswith("/static"):
file_name = path[7:]
try:
f = open(html_root + file_name, 'r')
except IOError as e:
headers = []
status = "404 Not Found"
start_response(status, headers)
return "not found"
else:
headers = []
status = "200 OK"
start_response(status, headers)
return str(f.read())
for url, handle in self.urls:
if path == url:
return handle(env, start_response)
status = "404 Not Found"
headers = []
start_response(status, headers)
return "not found" def test(env, start_response):
status = "200 OK"
headers = [("Content-type", "text/plain")]
start_response(status, headers)
return "test is ok" html_root = "./html/"
urls = [("/test", test)]
app = Application(urls)
运行效果如下:


Python 之web动态服务器的更多相关文章
- [置顶] java web 动态服务器
写了一个java web 动态服务器,主要通过内部类来实现,动态类使用了外部类,采用了 classforname 实例化,动态类的构造方法不能带参数, 效果都出来了,分享给有需要的 朋友.判断做的不够 ...
- Python建立web静态服务器
原文地址:http://www.bugingcode.com/blog/python_html_web_server.html python作为工具,提供了很多好用的命令,比如有时候突然需要建立一个解 ...
- python之Web服务器案例
HTTP协议简介 1. 使用谷歌/火狐浏览器分析 在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来.而浏览器和服务器之间的传输协议是HTTP,所以: ...
- Python基础Web服务器案例
一.WSGI 1.PythonWeb服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI) 是Python应用程序或框架和Web服务器之间的一种接口, ...
- Django-手撸简易web框架-实现动态网页-wsgiref初识-jinja2初识-python主流web框架对比-00
目录 自己动手实现一个简易版本的web框架 手撸一个web服务端 根据请求 url 做不同的响应处理 基于wsgiref模块实现服务端 用wsgiref 模块的做的两件事 拆分服务端代码 支持新的请求 ...
- Python搭建Web服务器,与Ajax交互,接收处理Get和Post请求的简易结构
用python搭建web服务器,与ajax交互,接收处理Get和Post请求:简单实用,没有用框架,适用于简单需求,更多功能可进行扩展. python有自带模块BaseHTTPServer.CGIHT ...
- python之web框架(1):完成静态页面web服务器
python的web框架(1) 1.首先写一个最简单的web服务器,只能给客户回应一个固定的hello world的页面. from socket import * from multiprocess ...
- Python web 简单服务器的搭建与运行
搭建python的CGI环境: 假设在/var/www/cgi-bin下建立一个hello.py的文件 在ubuntu下打开终端 然后用命令 cd /var/www/ 进入后执行命令 : python ...
- Python之Web框架们
Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. pip i ...
随机推荐
- 移动端,input输入获得焦点被键盘遮住简单解决方案
(function (window,document) { document.querySelector('input[type="text"]').addEventListene ...
- hp 1810-24g switch reset
Specific steps to execute the factory default reset on the switch are: 1. Using a small, thin tool w ...
- 异常:”未处理System.TypeLoadException“
1.问题由来: 在敲系统时原来的已有的类都能正常的执行,可是当加入一个新的实体类CancelCard的时候系统执行时显示错误例如以下: watermark/2/text/aHR0cDovL2J ...
- Eclipse导入外部项目问题总结
此次在项目开发过程中导入从oksvn下载的共享项目时出现几个项目在不同的IDE导入导出时的问题,为免忘记做例如以下笔记: 1 类路径问题 在Java开发中大多数的开发人员使用的IDE是MyEcl ...
- DDM实践:数据库秒级平滑扩容方案
本文部分内容节选自华为云帮助中心的分布式数据库中间件(DDM)服务的产品介绍 背景 随着业务增长,逻辑库存储空间不足,并发压力较大. 解决方案 此时可对DDM实例逻辑库进行平滑扩容,通过增加RDS实例 ...
- java梳理-反射
本文属于面试题梳理系列:问题:java反射类的訪问私有方法与普通方法相比,须要多处理什么? 之前梳理类载入的时候,介绍到初始化的时机之中的一个:用java.lang.reflect包的方法对类进行反 ...
- 如何删除 mac 系统信息下的安装记录
方法:在finder中:Command+Shift+G 打开 /Library/Receipts/InstallHistory.plist 所有的记录都在 InstallHistory.plist 文 ...
- 20170623_oracle_SQL
============SQL分类 数据定义语言(DDL):CREATE ALERT DROP TRUNCATE 数据操纵语言(DML):INSERT UPDATE DELETE SELECT 事务控 ...
- ALSA声卡驱动中的DAPM详解之六:精髓所在,牵一发而动全身
设计dapm的主要目的之一,就是希望声卡上的各种部件的电源按需分配,需要的就上电,不需要的就下电,使得整个音频系统总是处于最小的耗电状态,最主要的就是,这一切对用户空间的应用程序是透明的,也就是说,用 ...
- seq2seq里的数学
seq2seq模型详解 原创 2017年12月25日 09:41:04 标签: seq2seq / 自然语言 / 机器人 在李纪为博士的毕业论文中提到,基于生成的闲聊机器人中,seq2seq是一种 ...