文件目录:

dynamic中:框架

static:css,jss静态文件

teplates:模板

web_server.conf: 配置文件

web_server.py: 主程序

run.sh:运行脚本

web_server.py:

 import socket
import multiprocessing
import re
import dynamic.mini_frame
import sys class WSGIServer(object):
def __init__(self,port,app,static_path):
# 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(("", port))
# 4.设置监听状态
self.tcp_server_socket.listen(128)
# web服务器模板中的application方法
self.application = app
# config文件
self.static_path = static_path def clinet_server(self,new_client_socket):
# 1.接受消息
request = new_client_socket.recv(1024).decode("utf-8")
lines = request.splitlines()
# print("")
# print(">" * 20)
# print(lines)
# 2.匹配请求网页
request_name = re.match(r"[^/]+(/[^ ]*)",lines[0])
if request_name:
file_name = request_name.group(1)
if file_name == "/":
file_name = "/index.html" # 返回数据给浏览器
if not file_name.endswith(".py"):
# 3.打开文件
try:
f = open(self.static_path + file_name,"rb")
except Exception as ret:
pass
else:
html_content = f.read()
f.close()
# 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) else:
# 如果是.py结尾,则认为是动态页面请求/
env = dict();
env['PATH_INFO'] = file_name
print(env['PATH_INFO'])
# application(字典, 方法名) 固定用法
body = self.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_socket,client_addr = self.tcp_server_socket.accept()
# 6.为新客户端服务
p = multiprocessing.Process(target=self.clinet_server,args=(new_socket,))
p.start()
# 7.关闭新客户端
new_socket.close()
# 7.关闭socket
self.tcp_server_socket.close() def main():
# 给程序传参数, 导入sys库
ret = sys.argv
if len(ret) == 3:
# 接收端口信息
port = int(ret[1])
# 接收web服务器信息
frame_app_name = ret[2]
else:
print("请重新输入参数")
# web服务器包和名
frame_app = re.match(r"([^:]+):([^:]+)",frame_app_name)
frame_name = frame_app.group(1)
app_name = frame_app.group(2) # 导入包的路径
sys.path.append("./dynamic")
# 导入模板
frame = __import__(frame_name)
# 此时app指向了 dynamic/mini_frame模板中的application这个函数
app = getattr(frame,app_name) with open("web_server.conf","r") as f:
# eval() 把{"xx":"xx"} 这种字符串转化为字典
config_path = eval(f.read()) wsgi_server = WSGIServer(port,app,config_path['static_path'])
wsgi_server.run_forever() if __name__ == '__main__':
main()

mini_frame.py:

 def center():
with open("./templates/center.html","r") as f:
return f.read() def index():
with open("./templates/index.html", "r") as f:
return f.read() def application(env, start_respones):
start_respones('200 ok',[("Content-Type","text/html;charset=utf-8")])
file_name = env['PATH_INFO']
# print(file_name)
if file_name == "/index.py":
return index()
elif file_name == "/center.py":
return center()
else:
return "python 中国"

web_server.conf:

{
"static_path":"./static",
"dynamic_path":"./dynamic"
}

  

run.sh:

python3 web_server.py 7788 mini_frame:application

  

mini_frame(web框架)的更多相关文章

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

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

  2. [Python之路] 使用装饰器给Web框架添加路由功能(静态、动态、伪静态URL)

    一.观察以下代码 以下来自 Python实现简易HTTP服务器与MINI WEB框架(利用WSGI实现服务器与框架解耦) 中的mini_frame最后版本的代码: import time def in ...

  3. [Python之路] 实现简易HTTP服务器与MINI WEB框架(利用WSGI实现服务器与框架解耦)

    本文描述如果简单实现自定义Web服务器与自定义简易框架,并且不断进行版本迭代,从而清晰的展现服务器与Web框架之间是如何结合.如何配合工作的.以及WSGI是什么. 本文帖的代码有点多,但基本每次迭代修 ...

  4. Python(九)Tornado web 框架

    一.简介 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过 ...

  5. 转-基于NodeJS的14款Web框架

    基于NodeJS的14款Web框架 2014-10-16 23:28 作者: NodeJSNet 来源: 本站 浏览: 1,399 次阅读 我要评论暂无评论 字号: 大 中 小 摘要: 在几年的时间里 ...

  6. 初步认识Node 之Web框架

    上一篇我们认识了Node是什么之后,这一篇我们主要了解的就是它的框架了.而它的框架又分为两大类,Web框架和全栈框架,接下来我们一个一个的来了解.    Web框架 Web框架可以细分为Web应用程序 ...

  7. 【原】Go语言及Web框架Beego环境无脑搭建

    本文涉及软件均以截至到2013年10月12日的最新版本为准 1. 相关软件准备: 1) go1.2rc1.windows-386.msi,对应32位windows系统安装使用 下载地址: https: ...

  8. 【译】什么是 web 框架?

    Web 应用框架,或者简单的说是“Web 框架”,其实是建立 web 应用的一种方式.从简单的博客系统到复杂的富 AJAX 应用,web 上每个页面都是通过写代码来生成的.我发现很多人都热衷于学习 w ...

  9. 冰冻三尺非一日之寒--web框架Django

    1.JS 正则    test   - 判断字符串是否符合规定的正则        rep = /\d+/;        rep.test("asdfoiklfasdf89asdfasdf ...

随机推荐

  1. Qt deletelater函数分析(2)

       夫唯不争,故天下莫能与之争  -- 老子 在C++中,delete 和 new 必须 配对使用,Qt作为C++的库,显然是不会违背C++原则.但是,qt有自己的内存管理,有时候虽然使用了new, ...

  2. 【C++札记】拷贝构造函数,浅拷贝和深拷贝

    一:拷贝构造函数 拷贝构造函数是一种特殊的构造函数,遵循如下的规则: 1.函数名和类名一致,没有返回值. 2.必须有一个参数,参数是本类型的一个引用变量. 3.拷贝构造函数可以访问参数对象的任意成员( ...

  3. 流程审批时执行BE插件

    1.启用审批流时,BE插件解决方案目标框架必须采用.Net Framwork3.5: 2.BE插件相关DLL部署位置:Applicationser/libs.MailServer/libs: 3.BE ...

  4. Spring Cloud--服务的发布与调用示例

    [Provider] 引依赖: 启动类上添加注解: 配置文件: [Consumer] 引依赖: 加注解: 配置文件: 调用服务: 方式一(动态获取服务列表): Eureka默认30秒拉取一次服务列表. ...

  5. WPF 的 Application.Current.Dispatcher 中,Dispatcher 属性一定不会为 null

    原文:WPF 的 Application.Current.Dispatcher 中,Dispatcher 属性一定不会为 null 在 WPF 程序中,可能会存在 Application.Curren ...

  6. .NET Window服务启动又马上停止,报错IO.FileNotFoundException

    最近公司需要开发一个Window服务推送系统,读取MongoDB写入消息队列,推送到各终端平台 但是在开发完成,最后的部署阶段,选中服务右击启动 看似正常,服务显示已启动(但实质已经被终止,因为Win ...

  7. 广州CBC2019

    CBC2019-day1 25 August 2019 on 学术前沿huyujia 8月24日上午,CBC2019正式开幕.主持人首先对大会情况以及与会嘉宾做了简要介绍:紧接着,校领导.大会主席以及 ...

  8. Java文件字符流

    1.字符编码(Character encoding)和编码集(Character set) 字符编码(Character encoding)是将字符转为字节或字节数组的过程. 字符集(Characte ...

  9. 机器码-字节码-CLR-JIT-托管代码-非托管代码-unsafe-GC-fixed

    0. 机器码 直接由机器码对应平台的CPU执行的指令集, 因此无法在其他指令集的CPU上运行. 无法跨平台. 由本地代码编译得到. (托管代码通过JIT生成) 1. 字节码 即 bytecode 是一 ...

  10. 移动Web深度剖析

    随着前端技术的急速发展,随着互联网行业的日益发展,HTML5作为一种比较新型的开发技术早已经被很多大的企业所应用,通过HTML5语言可以开发适用于任何设备上的酷炫网站页面,所以HTML5的发展趋势可想 ...