Python练习 | WebServer
#-*- coding:utf-8 -*-
import sys, os
from http.server import BaseHTTPRequestHandler, HTTPServer
#----------------------------------------------------------------------------------
class ServerException(Exception):
'''服务器内部错误'''
pass
#----------------------------------------------------------------------------------
class base_case(object):
"""条件处理基类"""
#从地址中读取文件送给send_content()返回请求
def handle_file(self,hander,full_path):
try:
with open(full_path, 'rb') as reader:
content = reader.read()
hander.send_content(content)
except IOError as msg:
msg = "'{0}' cannot be read: {1}".format(full_path, msg)
hander.handle_error(msg)
#将两个路径组合后返回为首页路径
def index_path(self, handler):
return os.path.join(handler.full_path, 'index.html')
#
def test(self, handler):
assert False,'Not implemented'
#
def act(self, handler):
assert False,'Not implemented'
#----------------------------------------------------------------------------------
class case_no_file(base_case):
'''文件或目录不存在'''
def test(self, handler):
return not os.path.exists(handler.full_path)
#如果path存在,返回True;如果path不存在,返回False
def act(self, handler):
raise ServerException("'{0}' not found".format(handler.path))
#----------------------------------------------------------------------------------
class case_cgi_file(base_case):
'''可执行脚本'''
def run_cgi(self, handler):
data = subprocess.check_output(["python3", handler.full_path],shell=False)
handler.send_content(data)
def test(self, handler):
return os.path.isfile(handler.full_path) and \
handler.full_path.endswith('.py')
def act(self, handler):
self.run_cgi(handler)
#----------------------------------------------------------------------------------
class case_existing_file(base_case):
'''该路径是文件'''
def test(self, handler):
return os.path.isfile(handler.full_path)
#如果path是一个存在的文件,返回True。否则返回False
def act(self, handler):
self.handle_file(handler,handler.full_path)
#----------------------------------------------------------------------------------
class case_directory_index_file(base_case):
'''在跟路径下返回主页文件'''
#判断目标路径是否是目录&&目录下是否有index.html
def test(self, handler):
return os.path.isdir(handler.full_path) and \
os.path.isfile(self.index_path(handler))
#isdir函数判断某一路径是否为目录
#响应index.html的内容
def act(self, handler):
self.handle_file(handler,self.index_path(handler))
#----------------------------------------------------------------------------------
class case_always_fail(object):
'''所有情况都不符合时的默认处理类'''
def test(self, handler):
return True
def act(self, handler):
raise ServerException("Unknown object '{0}'".format(handler.path))
#一、创建一个请求处理类
#1.模块的 BaseHTTPRequestHandler类 会帮我们处理对请求的解析
#2.并通过确定请求的方法来调用其对应的函数(方法Get对应do_get方法)
#----------------------------------------------------------------------------------
#RequestHandler 继承了 BaseHTTPRequestHandler 并重写了 do_GET 方法
class RequestHandler(BaseHTTPRequestHandler):
'''
请求路径合法则返回相应处理
否则返回错误页面
'''
Cases = [case_no_file(),
case_cgi_file(),
case_existing_file(),
case_directory_index_file(),
case_always_fail()]
# 错误页面模板
Error_Page = """\
<html>
<body>
<h1>Error accessing {path}</h1>
<p>{msg}</p>
</body>
</html>
"""
def do_GET(self):
try:
#得到完整的请求路径
#os.getcwd()返回当前进程的工作目录
#BaseHTTPRequestHandler类使请求的相对路径保存在self.path
self.full_path = os.getcwd() + self.path
# 遍历所有的情况并处理
for case in self.Cases:
if case.test(self):
case.act(self)
break
# 处理异常
except Exception as msg:
self.handle_error(msg)
#错误处理函数
def handle_error(self, msg):
content = self.Error_Page.format(path=self.path, msg=msg)
self.send_content(content.encode("utf-8"),404) #content内容被编码为二进制
# 发送数据到客户端
def send_content(self,content, status=200):
self.send_response(status)
self.send_header("Content-Type", "text/html") #Content-Type 告诉客户端要以处理html文件的方式处理返回的内容
self.send_header("Content-Length", str(len(content)))
self.end_headers() #end_headers 方法会插入一个空白行
self.wfile.write(content)
#主函数
if __name__ == '__main__':
serverAddress = ('', 8080)
#二、实例化一个服务器类,传入服务器的地址和请求处理程序类
server = HTTPServer(serverAddress, RequestHandler)
#三、调用handle_request()(一般是调用其他事件循环或者使用select())或serve_forever()
server.serve_forever()
Python练习 | WebServer的更多相关文章
- 【webserver】使用python实现webserver,支持上传下载文件
#!/usr/bin/env python """Simple HTTP Server With Upload. This module builds on BaseHT ...
- python 打印Linux中文编码字符
2018-10-12 12:02:15 星期五 python -c "print '\346\234\215\345\212\241\345\231\250\346\217\220\344\ ...
- python uwsgi 部署以及优化
这篇文章其实两个月之前就应该面世了,但是最近琐事.烦心事太多就一直懒得动笔,拖到现在才写 一.uwsgi.wsgi.fastcgi区别和联系 参见之前的文章 http://www.cnblogs.co ...
- python实现网页登录时的rsa加密流程
对某些网站的登录包进行抓包时发现,客户端对用户名进行了加密,然后传给服务器进行校验. 使用chrome调试功能断点调试,发现网站用javascript对用户名做了rsa加密. 为了实现网站的自动登录, ...
- 20145319 《网络渗透》web基础
20145319 <网络渗透>web基础 实验要求 掌握网页编程的基本知识 html语法 javascript php 前端,后台,数据库之间如何建立连接 掌握数据库的使用 mysql的启 ...
- WSGI、flup、fastcgi、web.py、uwsgi
================== 网上别人的理解 =================== http://www.douban.com/note/13508388/ 1.Apache/ ...
- python开启简单webserver
python开启简单webserver linux下面使用 python -m SimpleHTTPServer 8000 windows下面使用上面的命令会报错,Python.Exe: No Mod ...
- python中一个简单的webserver
python中一个简单的webserver 2013-02-24 15:37:49 分类: Python/Ruby 支持多线程的webserver 1 2 3 4 5 6 7 8 9 10 11 ...
- [Top-Down Approach] Assignment 1: WebServer [Python]
Today I complete Socket Programming Assignment 1 Web Server Here is the code: #!/usr/bin/python2.7 # ...
随机推荐
- thinkphp+memcache缓存例子
public function dailyRelays() { $history = I('post.history'); $da = new \Home\Model\DailyrelayModel( ...
- SpringMVC错误集中营
1.eclipse里的错误提示为The import javax.servlet.http.HttpServletRequest cannot be resolved 1.这是因为工程里面web-in ...
- eclipse使用配置
eclipse设置工作空间为UTF-8(适应中文,避免乱码) windows---preference---general---workspace,修改textfile encoding eclips ...
- spring源码研究之IoC容器在web容器中初始化过程
转载自 http://ljbal.iteye.com/blog/497314 前段时间在公司做了一个项目,项目用了spring框架实现,WEB容器是Tomct 5,虽然说把项目做完了,但是一直对spr ...
- Android-主题
主题分为两种: 第一种:使用Android系统提供的主题 第二种:自己定义主题 样式 与 主题 区分理解 样式是控制(View的子类风格)控件风格 或者 是(ViewGroup的子类风格)布局风 ...
- 利用Senparc.Weixin SDK 实现微信用户的授权,并获取信息
前一段时间在学校做过一个项目,就是利用的Senparc.Weixin SDK 做的,于是翻看以前代码,虽然有注释,但是还是看的迷迷糊糊的,干脆就单步执行一遍看看是怎么实现的,然后就重新写了个简易的授权 ...
- SSL证书 .pem转.pfx
使用OpenSSL来进行转换 OpenSSL官网没有提供windows版本的安装包,可以选择其他开源平台提供的工具.例如 http://slproweb.com/products/Win32OpenS ...
- .Net Core配置与自动更新
.Net Core 将之前Web.Config中的配置迁移到了appsettings.json文件中,并使用ConfigurationBuilder来读取这个配置文件.并可设置在配置文件变化以后,自动 ...
- 纸壳CMS 2.3,正式加入商城功能
纸壳CMS发布了2.3版本,主要是添加了商城功能,强化产品功能.让您的网站轻松实现电子商务. 有关2.3版本的更多信息,请查看以下链接: https://github.com/SeriaWei/ZKE ...
- Jquery 【on事件】
一.on事件的定义和用法 on() 方法在被选元素及子元素上添加一个或多个事件处理程序. 自 jQuery 版本 1.7 起,on() 方法是 bind().live() 和 delegate() 方 ...