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 ...
随机推荐
- 去除ckeditor上传图片预览中的英文字母
去除ckeditor上传图片预览中的英文字母 CKEDITOR.replace('text', { filebrowserImageUploadUrl : 'upload_img.do', langu ...
- 在全程Linux環境部署IBM Lotus Domino/Notes 8.5
架設藍色巨人的協同合作訊息平台 在全程Linux環境部署IBM Lotus Domino/Notes 8.5 珊迪小姐 坊間幾乎所有探討IBM Domino/Notes的中文書籍,皆是以部署在Micr ...
- swift UI专项训练39 用Swift实现摇一摇功能
微信的摇一摇功能想必大家都用过,过春节的时候抢红包也没少摇吧,那么用swift语言怎样实现这么酷炫的功能呢.摇动属于IOS内置可识别的一种动作,在你须要实现摇动功能的viewcontroller中.在 ...
- Servlet-SrpingMVC 生成验证码
在SpringMVC中配置生成验证码: import org.springframework.stereotype.Controller; import org.springframework.web ...
- Angular常用标记
(如果没有特别指明,则所有的HTML元素都支持该标记) (如果没有特别指明,则 AngularJS 指令不会覆盖原生js的指令) 1.数据绑定类: 1.插值语法:{{}} 2.标签内容绑定:ng-bi ...
- redhat6 改 centos yum 源
**redhat的yum在线更新是收费的,如果没有注册的话不能使用,如果要使用,需将redhat的yum卸载后,重启安装其他yum源,再配置其他源.** 本文包括配置本地源及第三方源.第三方源包括:网 ...
- codevs1026商务旅行
1036 商务旅行 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 某首都城市的商人要经常到各城镇去做 ...
- Visual Studio Code配置GitHub(Win7环境)
一.软件环境说明(演示环境) 1.操作系统:Windows7旗舰版(64bit) 2.Visual Studio Code版本:1.32.3 3.Git版本:2.21.0.windows.1 二.软件 ...
- MySQL-ProxySQL中间件(一)| ProxySQL基本概念
目录 MySQL-ProxySQL中间件(一)| ProxySQL基本概念: https://www.cnblogs.com/SQLServer2012/p/10972593.html ...
- 小HY的四元组
4.7 比赛T1,然而这题爆零了 其实很简单的...其实哈希都不用 所以首先记录每组的差值,按其sort一下再暴力找即可 #include<cstdio> #include<iost ...