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动态服务器的更多相关文章

  1. [置顶] java web 动态服务器

    写了一个java web 动态服务器,主要通过内部类来实现,动态类使用了外部类,采用了 classforname 实例化,动态类的构造方法不能带参数, 效果都出来了,分享给有需要的 朋友.判断做的不够 ...

  2. Python建立web静态服务器

    原文地址:http://www.bugingcode.com/blog/python_html_web_server.html python作为工具,提供了很多好用的命令,比如有时候突然需要建立一个解 ...

  3. python之Web服务器案例

    HTTP协议简介 1. 使用谷歌/火狐浏览器分析 在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来.而浏览器和服务器之间的传输协议是HTTP,所以: ...

  4. Python基础Web服务器案例

    一.WSGI 1.PythonWeb服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI) 是Python应用程序或框架和Web服务器之间的一种接口, ...

  5. Django-手撸简易web框架-实现动态网页-wsgiref初识-jinja2初识-python主流web框架对比-00

    目录 自己动手实现一个简易版本的web框架 手撸一个web服务端 根据请求 url 做不同的响应处理 基于wsgiref模块实现服务端 用wsgiref 模块的做的两件事 拆分服务端代码 支持新的请求 ...

  6. Python搭建Web服务器,与Ajax交互,接收处理Get和Post请求的简易结构

    用python搭建web服务器,与ajax交互,接收处理Get和Post请求:简单实用,没有用框架,适用于简单需求,更多功能可进行扩展. python有自带模块BaseHTTPServer.CGIHT ...

  7. python之web框架(1):完成静态页面web服务器

    python的web框架(1) 1.首先写一个最简单的web服务器,只能给客户回应一个固定的hello world的页面. from socket import * from multiprocess ...

  8. Python web 简单服务器的搭建与运行

    搭建python的CGI环境: 假设在/var/www/cgi-bin下建立一个hello.py的文件 在ubuntu下打开终端 然后用命令 cd /var/www/ 进入后执行命令 : python ...

  9. Python之Web框架们

    Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. pip i ...

随机推荐

  1. Scala入门到精通——第十五节 Case Class与模式匹配(二)

    本节主要内容 模式匹配的类型 for控制结构中的模式匹配 option类型模式匹配 1. 模式的类型 1 常量模式 object ConstantPattern{ def main(args: Arr ...

  2. org.apache.solr.handler.dataimport.DataImportHandlerException: Data Config problem: 对实体 &quot;characterEn

    解决的方法:在配置数据库连接是讲url里的特殊符号要做转义 jdbc:mysql://IP:3306/数据库名?useUnicode=true&characterEncoding=utf8 改 ...

  3. 并行运维工具pssh的安装及实战应用

    并行运维工具pssh的安装及实战应用 - CSDN博客 https://blog.csdn.net/field_yang/article/details/68066468

  4. eclipse高亮选中属性以及更改颜色

    1.显示:      1.1.工具栏里有个黄色小笔的图标,点一下就好了      1.2.打开对话框windows->preference,在左上角输入mark Occurrencs 把右边都选 ...

  5. luogu 3415 祭坛

    题目大意: 在平面上,有 n 个水晶柱,每个水晶柱可以用一个点表示 如果 4 个水晶柱依次相连可以构成一个四边形,满足其两条对角线分别平行于 x 轴和 y 轴,并且对角线的交点位于四边形内部(不包括边 ...

  6. 【HDU 1007】 Quoit Design

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=1007 [算法] 答案为平面最近点对距离除以2 [代码] #include <algorith ...

  7. oracle更新大量数据太慢,可以通过游标实现的例子

    declare cursor city_cur isselect t.new_customer_id,t.old_customer_id from citsonline.crm_customer_tm ...

  8. codevs1230元素查找(hash)

    1230 元素查找  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 给出n个正整数,然后有m个询问,每个询问一个 ...

  9. ubuntu 更显列表 [Connecting to archive.ubuntu.com (2001:67c:1360:8001::21)] 超时的解决方法

    问题描述: 在使用apt-get update 时更行列表,显示[Connecting to archive.ubuntu.com (2001:67c:1360:8001::21)]超时 分析: 我已 ...

  10. HDU 5306 吉司机线段树

    思路: 后面nlogn的部分是伪证... 大家可以构造数据证明是这是nlog^2n的啊~ 吉老司机翻车了 //By SiriusRen #include <cstdio> #include ...