web_server:

 import socket
import time
import multiprocessing
import re
import mini_frame class WSGIServer(object):
def __init__(self):
# 1.创建socket对象
self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.设置重复使用地址
self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 3.绑定端口
self.tcp_server_socket.bind(("", 7890))
# 4.设置监听状态
self.tcp_server_socket.listen(128) def clinet_server(self,new_client_socket):
# 1.接受消息
request = new_client_socket.recv(1024).decode("utf-8")
lines = request.splitlines()
# 2.匹配请求网页
request_name = re.match(r"[^/]+(/[^ ]*)",lines[0])
file_name = request_name.group(1)
if file_name == "/":
file_name = "/index.html" # 返回数据给浏览器
if not file_name.endswith(".py"):
# 3.打开文件
try:
f = open("./html" + file_name,"rb")
except Exception as ret:
pass
else:
html_content = f.read() # 4.创建header和body
response_body = html_content
response_header = "HTTP/1.1 200 ok\r\n"
response_header += "Content-Length:%d\r\n" % len(response_body)
response_header += "\r\n"
response = response_header.encode("utf-8") + response_body
# 5.发送
new_client_socket.send(response)
finally:
f.close()
else:
# 如果是.py结尾,则认为是动态页面请求/
env = dict();
env['PATH_INFO'] = file_name
# application(字典, 方法名) 固定用法
body = mini_frame.application(env, self.start_respones_header)
# 拼装header头
header = "HTTP/1.1 %s\r\n" % self.status
for temp in self.headers:
header += "%s:%s\r\n" % (temp[0], temp[1])
header += "\r\n"
# 拼装返回数据
response = header + body
# 发送数据
new_client_socket.send(response.encode("utf-8")) # 6.关闭socket
# new_client_socket.close() def start_respones_header(self, status, headers):
"""接受并保存application传过来的值"""
self.status = status
self.headers = [("server","mini_web v1.0")]
self.headers += headers def run_forever(self):
"""运行"""
while True:
# 5.接收客户地址,创建新socket
new_client_socket,client_addr = self.tcp_server_socket.accept()
# 6.为新客户端服务
p = multiprocessing.Process(target=self.clinet_server,args=(new_client_socket,))
p.start()
# 7.关闭新客户端
new_client_socket.close()
# 7.关闭socket
self.tcp_server_socket.close() def main():
wsgi_server = WSGIServer()
wsgi_server.run_forever() if __name__ == '__main__':
main()

mini_frame.py:

 def login():
"""模拟登陆页面"""
return "---login---welcome to python--->time:%s" % time.ctime() def index():
"""模拟主页"""
return "----index----" def application(env, start_respones):
# 调用传过来的方法,传值
start_respones('200 ok',[("Content-Type","text/html;charset=utf-8")])
# 接受字典传过来的数据
file_name = env['PATH_INFO']
# 判断客户请求
if file_name == "/index.py":
return index()
elif file_name == "/login.py":
return login()
else:
return "python 中国"

最新文章

  1. UVA 11235Frequent values(RMQ)
  2. CKEditor使用配置方法
  3. 使用ASP.NET MVC操作过滤器记录日志(转)
  4. 通过GP加载卫星云图-雷达图-降雨预报图
  5. bash脚本编程之一 变量、变量类型等
  6. 【转】iOS 10 UserNotifications 使用说明
  7. 下一代大数据系统和4S标准
  8. ACM—Number Sequence(HDOJ1005)
  9. 搭建腾讯云Linux服务器(Centos6)入门教程
  10. 聊聊keep-alive组件的使用及其实现原理
  11. Javascript高级编程学习笔记(37)—— DOM(3)Element
  12. VSCode 首次打开提示“Git installation not found.”解决方案
  13. Linux下简单的缓冲区溢出
  14. BZOJ.1312.[Neerc2006]Hard Life(分数规划 最大权闭合子图)
  15. [转帖]新的Linux后门开始肆虐 主要攻击中国服务器
  16. CH 3401 - 石头游戏 - [矩阵快速幂加速递推]
  17. 如何在windows下安装Python(Python入门教程)
  18. F - Cookies Piles
  19. 侧边导航栏css示例
  20. FFT(快速傅里叶变换)摘要

热门文章

  1. C++ 读写 Excel 文件
  2. handy网络库源码阅读
  3. 函数的学习3——传递任意数量的实参&将函数存储在模块——参考Python编程从入门到实践
  4. Magic Line(思维+计算几何问题)(2019牛客暑期多校训练营(第三场))
  5. 怎么理解js的原型链继承?
  6. NEST 根据id查询
  7. 返璞归真——OO第四单元总结暨学期总结
  8. java容易混淆的概念
  9. iOS - swift 后使用打包动态库
  10. js --装饰者模式