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 ...
随机推荐
- NETCore项目报错 An error occurred while starting the application
在发布到IIS的webApi项目中,运行时报出以上错误, 解决方法: 1.打开发布目录文件夹,找到web.config文件 2.打开web.config找到stdoutLogEnabled=" ...
- Ubuntu-14.04. sh .py腳本双击無法執行问题的解决方法
Ubuntu-14.04中默认文件用gedit文本打开,而不是BT5里面的默认双击打开四个选择,例如以下图(这是配置完毕后的结果,就不换BT5系统了): 直接文本打开,尽管非常安全.实际生产中肯定是不 ...
- ssh连接失败
参考:http://www.cnblogs.com/starof/p/4709805.html https://www.chenyudong.com/archives/ssh-using-privat ...
- php apc缓存以及与redis的对比
apc缓存用户数据这个会用, apc_store() 和apc_fetch()函数. 那apc 缓存php 代码,这个怎么用呢? 原文: http://blog.csdn.net/w187046226 ...
- python编程(基于twisted的client编程)
[ 声明:版权全部,欢迎转载.请勿用于商业用途. 联系信箱:feixiaoxing @163.com] python的twisted比較有意思,既能够做server方面的编程,也能够做client方面 ...
- OpenStack二三事(2)
使用devstack在virtualbox上安装openstack还真是比較麻烦,到处都是坑.近期碰到的坑是在tempest上,在执行verify-tempest-config时,代码中import了 ...
- NoSql基础知识
一.为什么要有NoSql 关系型数据库在三个方面存在不足,或者说,比不上NoSQL: 1.大量数据的写入处理 这里说的关系型数据库不擅长大量数据写入,并不是说关系型数据库在进行大批量数据插入的时候,比 ...
- 关于linux的用户
1 linux支持多个用户 2 每个登陆用户有自己的shell,自己的home目录 3 可以将用户分组 4 用户对文件有各自的权限,从而将用户分割 5 用户对应属于它的一批进程 6 可以执行addus ...
- YTU 2723: 默认参数--求圆的面积
2723: 默认参数--求圆的面积 时间限制: 1 Sec 内存限制: 128 MB 提交: 206 解决: 150 题目描述 根据半径r求圆的面积, 如果不指定小数位数,输出结果默认保留两位小数 ...
- 【POJ 1995】 Raising Modulo Numbers
[题目链接] http://poj.org/problem?id=1995 [算法] 快速幂 [代码] #include <algorithm> #include <bitset&g ...