dynamic/my_web.py (更新)

import time
import ostemplate_root = "./templates"def index(file_name): """返回index.py需要的页面内容""" # return "hahha" + os.getcwd() # for test 路径问题 try: file_name = file_name.replace(".py", ".html") f = open(template_root + file_name) except Exception as ret: return "%s" % ret else: content = f.read() f.close() return content def center(file_name): """返回center.py需要的页面内容""" # return "hahha" + os.getcwd() # for test 路径问题 try: file_name = file_name.replace(".py", ".html") f = open(template_root + file_name) except Exception as ret: return "%s" % ret else: content = f.read() f.close() return content def application(environ, start_response): status = '200 OK' response_headers = [('Content-Type', 'text/html')] start_response(status, response_headers) file_name = environ['PATH_INFO'] if file_name == "/index.py": return index(file_name) elif file_name == "/center.py": return center(file_name) else: return str(environ) + '==Hello world from a simple WSGI application!--->%s\n' % time.ctime() 

web_server.py (更新)


import select
import time
import socket
import sys
import re import multiprocessing class WSGIServer(object): """定义一个WSGI服务器的类""" def __init__(self, port, documents_root, app): # 1. 创建套接字 self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 绑定本地信息 self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.server_socket.bind(("", port)) # 3. 变为监听套接字 self.server_socket.listen(128) # 设定资源文件的路径 self.documents_root = documents_root # 设定web框架可以调用的函数(对象) self.app = app def run_forever(self): """运行服务器""" # 等待对方链接 while True: new_socket, new_addr = self.server_socket.accept() # 创建一个新的进程来完成这个客户端的请求任务 new_socket.settimeout(3) # 3s new_process = multiprocessing.Process(target=self.deal_with_request, args=(new_socket,)) new_process.start() new_socket.close() def deal_with_request(self, client_socket): """以长链接的方式,为这个浏览器服务器""" while True: try: request = client_socket.recv(1024).decode("utf-8") except Exception as ret: print("========>", ret) client_socket.close() return # 判断浏览器是否关闭 if not request: client_socket.close() return request_lines = request.splitlines() for i, line in enumerate(request_lines): print(i, line) # 提取请求的文件(index.html) # GET /a/b/c/d/e/index.html HTTP/1.1 ret = re.match(r"([^/]*)([^ ]+)", request_lines[0]) if ret: print("正则提取数据:", ret.group(1)) print("正则提取数据:", ret.group(2)) file_name = ret.group(2) if file_name == "/": file_name = "/index.html" # 如果不是以py结尾的文件,认为是普通的文件 if not file_name.endswith(".py"): # 读取文件数据 try: print(self.documents_root+file_name) f = open(self.documents_root+file_name, "rb") except: response_body = "file not found, 请输入正确的url" response_header = "HTTP/1.1 404 not found\r\n" response_header += "Content-Type: text/html; charset=utf-8\r\n" response_header += "Content-Length: %d\r\n" % (len(response_body)) response_header += "\r\n" response = response_header + response_body # 将header返回给浏览器 client_socket.send(response.encode('utf-8')) else: content = f.read() f.close() response_body = content response_header = "HTTP/1.1 200 OK\r\n" response_header += "Content-Length: %d\r\n" % (len(response_body)) response_header += "\r\n" # 将header返回给浏览器 client_socket.send(response_header.encode('utf-8') + response_body) # 以.py结尾的文件,就认为是浏览需要动态的页面 else: # 准备一个字典,里面存放需要传递给web框架的数据 env = dict() # ----------更新--------- env['PATH_INFO'] = file_name # 例如 index.py # 存web返回的数据 response_body = self.app(env, self.set_response_headers) # 合并header和body response_header = "HTTP/1.1 {status}\r\n".format(status=self.headers[0]) response_header += "Content-Type: text/html; charset=utf-8\r\n" response_header += "Content-Length: %d\r\n" % len(response_body.encode("utf-8")) for temp_head in self.headers[1]: response_header += "{0}:{1}\r\n".format(*temp_head) response = response_header + "\r\n" response += response_body client_socket.send(response.encode('utf-8')) def set_response_headers(self, status, headers): """这个方法,会在 web框架中被默认调用""" response_header_default = [ ("Data", time.time()), ("Server", "ItCast-python mini web server") ] # 将状态码/相应头信息存储起来 # [字符串, [xxxxx, xxx2]] self.headers = [status, response_header_default + headers] # 设置静态资源访问的路径 g_static_document_root = "./static" # 设置动态资源访问的路径 g_dynamic_document_root = "./dynamic" def main(): """控制web服务器整体""" # python3 xxxx.py 7890 if len(sys.argv) == 3: # 获取web服务器的port port = sys.argv[1] if port.isdigit(): port = int(port) # 获取web服务器需要动态资源时,访问的web框架名字 web_frame_module_app_name = sys.argv[2] else: print("运行方式如: python3 xxx.py 7890 my_web_frame_name:app") return print("http服务器使用的port:%s" % port) # 将动态路径即存放py文件的路径,添加到path中,这样python就能够找到这个路径了 sys.path.append(g_dynamic_document_root) ret = re.match(r"([^:]*):(.*)", web_frame_module_app_name) if ret: # 获取模块名 web_frame_module_name = ret.group(1) # 获取可以调用web框架的应用名称 app_name = ret.group(2) # 导入web框架的主模块 web_frame_module = __import__(web_frame_module_name) # 获取那个可以直接调用的函数(对象) app = getattr(web_frame_module, app_name) # print(app) # for test # 启动http服务器 http_server = WSGIServer(port, g_static_document_root, app) # 运行http服务器 http_server.run_forever() if __name__ == "__main__": main() 

浏览器打开看效果

转载于:https://www.cnblogs.com/jyue/p/10504813.html

mini web框架-2-显示页面相关推荐

  1. Python【算法中心 02】Web框架Django管理页面使用(管理员账号创建+API使用+应用添加)GreenPlum数据库引擎及API测试

    1.SQLite管理员账号创建 SQLite 是 Django 默认的数据库体量上类似与 Apache Derby,配置信息如下: DATABASES = {'default': {'ENGINE': ...

  2. 使用Python开发轻量级的Web框架以及基于WSGI的服务器来实现一个网站页面

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 目录 一丶项目说明 二丶数据准备 三丶使用网络TCP开发一个基于WSGI协议的Web服务器 四丶使用python3开发一个轻量级的 ...

  3. Springmvc框架下 jsp显示页面出现源码

    最近在开发时有一个很奇怪的问题,使用springmvc框架时 jsp页面这么写 访问页面正常 而我加头部<%%>这些,就显示源码 我觉得非常奇怪,思考几天了,最后还是询问大佬才知道为什么 ...

  4. python开发h5页面_使用Python的Tornado框架实现一个Web端图书展示页面

    首先,为什么选择Tornado:1.高性能的网络库,这可以和gevent,twisted,libevent等做对. 提供了异步io支持,超时事件处理,在此基础上提供了tcpserver,httpcli ...

  5. html可以用搜狗浏览器打开网页,win8使用搜狗浏览器打开网页“显示WEB浏览器已对此页面进行了修改以帮助跨站脚本”怎么办...

    windows8系统自带IE浏览器,但是一些用户还是喜欢下载第三方浏览器,比如搜狗浏览器,使用搜狗浏览器过程中总会遇到一些故障问题,比如win8使用搜狗浏览器打开网页"显示WEB浏览器已对此 ...

  6. 鸿蒙harmonyOS方舟框架ARK etsUI 页面跳转动画translate不显示的问题

    鸿蒙harmonyOS方舟框架ARK etsUI 页面跳转动画translate不显示的问题 文章目录 鸿蒙harmonyOS方舟框架ARK etsUI 页面跳转动画translate不显示的问题 前 ...

  7. luci框架-LUA的一个web框架使用

    转自:http://blog.csdn.net/initphp/article/details/17527639 LUCI 这个在百度上搜索除了一篇我的百度文库 luci 的介绍文章之外,前三页都是些 ...

  8. web框架总结(django、flask)

    1.MVC解读 M:Model,模型,和数据库进行交互 V:View,视图,负责产生Html页面 C:Controller,控制器,接收请求,进行处理,与M和V进行交互,返回应答. 1.用户点击注 2 ...

  9. 关于node.js的web框架的应用及并发性能测试

    "Node.js 是服务器端的 JavaScript 运行环境,它具有无阻塞(non-blocking)和事件驱动(event-driven)等的特色,Node.js 采用 V8 引擎,同样 ...

最新文章

  1. 吴恩达教你如何使用“锤子”?机器学习新书免费领
  2. 小波的秘密6_小波包的理解
  3. 漫画:什么是归并排序?
  4. VMware vSphere 7的主要新功能
  5. 【Oracle】ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
  6. 使用JUnit-4.11报java.lang.NoClassDefFoundError:
  7. 系统架构变迁——个人成长路线
  8. matlab 矩阵规定化,Matlab实现直方图规定化
  9. Android 利用Canvas实现双指拖动和双指缩放图片
  10. 一些特殊区域的全纯自同构群
  11. 杏子语录(2019年07月)
  12. python_while 循环_珠穆朗玛峰
  13. No3 jQuery
  14. 球球大作战显示短信服务器出错,球球大作战常见问题汇总及解决方法
  15. 学校计算机统一编号,华中科技大学人员编号编码管理办法
  16. mye连接mysql_利用MyEclipse连接数据库并自动生成基于注解或者XML的实体类
  17. 图解排序算法及实现——快速排序 (Quick Sort)
  18. 记一次requestAnimationFrame之后页面崩溃、内存泄漏问题
  19. 利用EFAST方法分析DHSVM参数的敏感性
  20. TMS320F28374S之CMPSS

热门文章

  1. python将文字转换为语音_python实现将文本转换成语音
  2. 跟老板参加饭局,席间老板叫我去加菜,我该怎么做?
  3. 骁龙870对比天玑1200,到底谁更优秀?
  4. 买房后每月还贷是什么感觉?
  5. 如何改变炒股频繁交易的毛病?
  6. 在React中测试和调试
  7. spring cloud中gateway存在的意义是什么?
  8. 微信占用空间太大,删除又担心工作相关聊天记录,有啥好办法没?
  9. 为什么至今为止有些人的电脑系统还在使用XP?
  10. bison、lex版本不同造成的问题