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 ...
随机推荐
- ZOJ 3201
id=15737" target="_blank">Tree of Tree Time Limit: 1000MS Memory Limit: 32768KB ...
- Xsolla带你走进印度移动游戏市场
作为世界上人口第二大国的印度.随着移动时代的到来,越来越多的开发人员将目光瞄准了这个国家.今天Xsolla就带领大家一起来了解这样一个新兴的移动游戏市场. 印度移动市场潜力巨大 作为世界四大宗教和数字 ...
- 大数据技术之Flume研究摘要(一)
Flume是Cloudera提供的一个高可用的,高可靠的.分布式的海量日志採集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同一时候,Flume提供对数据进行简单处理 ...
- border-image 和 border-color 不能同时使用问题
遇到如下问题: UI 给的设计,某部分,上边框为 图片,下边框为灰色横线. 看到这个的第一反应是,上边框用 border-image ,为了只让上边框显示图片,所以只给上边框宽度为所需宽度,我的图是 ...
- ubuntu拨号上网以及路由设置
1.宽带拨号 配置宽带连接信息:pppoeconf 拨号:pon dsl-provider 断开连接:poff dsl-provider 查看拨号日志:plog 2.路由设置 以下为rc.local文 ...
- NoSQL 世界交换数据的事实标准
https://www.elastic.co/guide/cn/elasticsearch/guide/current/data-in-data-out.html An object is a lan ...
- jQuery 自定义动画效果
<!DOCTYPE html> <html> <head> <script src="/jquery/jquery-1.11.1.min.js&qu ...
- How do browser cookie domains work?
https://stackoverflow.com/questions/1062963/how-do-browser-cookie-domains-work 答案一 Although there is ...
- 【Poj2960】S-Nim & 博弈论
Position: http://poj.org/problem?id=2960 List Poj2960 S-Nim List Description Knowledge Solution Noti ...
- JDK8中函数式流编程推荐
强烈推荐使用Java8中函数流API库来处理集合相关的数据,今天又看来一个项目代码里面用到来很多这样的处理,基本上可以解决大部分遍历问题.并且代码简洁清晰. JAVA8与lambda表达式 JDK8 ...