18 12 `12 WSGI 协议
所谓wsig 协议 就是把web框架 和服务器进行分开 然后通过 wisg协议 进行连接 这样子可以随时替换web框架 或者 更换服务器 解耦 (现在学的内容里 静态连接一般是放在服务器里 而动态连接是放在web框架 不知道这句有没有错)
举个例子
下面是一个服务器 通过wsig 与web框架进行连接
import socket
import re
import multiprocessing
import time
import mini_frame class WSGIServer(object):
def __init__(self):
# 1. 创建套接字
self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 2. 绑定
self.tcp_server_socket.bind(("", 7890)) # 3. 变为监听套接字
self.tcp_server_socket.listen(128) def service_client(self, new_socket):
"""为这个客户端返回数据""" # 1. 接收浏览器发送过来的请求 ,即http请求
# GET / HTTP/1.1
# .....
request = new_socket.recv(1024).decode("utf-8")
# print(">>>"*50)
# print(request) request_lines = request.splitlines()
print("")
print(">"*20)
print(request_lines) # GET /index.html HTTP/1.1
# get post put del
file_name = ""
ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
if ret:
file_name = ret.group(1)
# print("*"*50, file_name)
if file_name == "/":
file_name = "/index.html" # 2. 返回http格式的数据,给浏览器
# 2.1 如果请求的资源不是以.py结尾,那么就认为是静态资源(html/css/js/png,jpg等)
if not file_name.endswith(".py"):
try:
f = open("./html" + file_name, "rb")
except:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += "\r\n"
response += "------file not found-----"
new_socket.send(response.encode("utf-8"))
else:
html_content = f.read()
f.close()
# 2.1 准备发送给浏览器的数据---header
response = "HTTP/1.1 200 OK\r\n"
response += "\r\n"
# 2.2 准备发送给浏览器的数据---boy
# response += "hahahhah" # 将response header发送给浏览器
new_socket.send(response.encode("utf-8"))
# 将response body发送给浏览器
new_socket.send(html_content)
else:
# 2.2 如果是以.py结尾,那么就认为是动态资源的请求 env = dict() # 这个字典中存放的是web服务器要传递给 web框架的数据信息
env['PATH_INFO'] = file_name
# {"PATH_INFO": "/index.py"}
body = mini_frame.application(env, self.set_response_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
# 发送response给浏览器
new_socket.send(response.encode("utf-8")) # 关闭套接
new_socket.close() def set_response_header(self, status, headers):
self.status = status
self.headers = [("server", "mini_web v8.8")]
self.headers += headers def run_forever(self):
"""用来完成整体的控制""" while True:
# 4. 等待新客户端的链接
new_socket, client_addr = self.tcp_server_socket.accept() # 5. 为这个客户端服务
p = multiprocessing.Process(target=self.service_client, args=(new_socket,))
p.start() new_socket.close() # 关闭监听套接字
self.tcp_server_socket.close() def main():
"""控制整体,创建一个web 服务器对象,然后调用这个对象的run_forever方法运行"""
wsgi_server = WSGIServer()
wsgi_server.run_forever() if __name__ == "__main__":
main()
下面是通过
def index():
return "这是主页" def login():
return "这是登录页面" def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')]) file_name = env['PATH_INFO']
# file_name = "/index.py" if file_name == "/index.py":
return index()
elif file_name == "/login.py":
return login()
else:
return 'Hello World! 我爱你中国....'
18 12 `12 WSGI 协议的更多相关文章
- ONVIF协议测试工具 ONVIF Device Test Tool 29 12.12 最新版
		ONVIF协议测试工具 ONVIF Device Test Tool 29 12.12 最新版 包含文档和工具,本人亲测,好用! http://download.csdn.net/detail/li_ ... 
- 第12讲 | TCP协议(下):西行必定多妖孽,恒心智慧消磨难
		第12讲 | TCP协议(下):西行必定多妖孽,恒心智慧消磨难 如何做个靠谱的人? 有问有答,任务发送和接收有记录,完成有反馈. 如何实现一个靠谱的协议? TCP 协议使用的也是同样的模式.为了保证顺 ... 
- Python Web开发最难懂的WSGI协议,到底包含哪些内容?
		原文出处: PythonScientists 我想大部分Python开发者最先接触到的方向是WEB方向(因为总是有开发者希望马上给自己做个博客出来,例如我),既然是WEB,免不了接触到一些WEB框架, ... 
- 关于2016.12.12——T1的反思:凸包的意义与应用
		2016.12.12 T1 给n个圆,保证圆圆相离,求将圆围起来的最小周长.n<=100 就像上图.考场上,我就想用切线的角度来做凸包.以圆心x,y排序,像点凸包一样,不过用两圆之间的下切线角度 ... 
- wsgi协议
		用来为server程序和app/framework程序做连接桥梁的,使server和app/framework各自发展,任意组合 上图是python3.4标准库里面,关于wsgiserver的实现.从 ... 
- python - wsgi协议
		wsgi - python web server gateway interface 出现的目的是,为了在 python框架开发的时候,更具有通用性.只要符合 wsgi标准,就可以自由选择服务器(ng ... 
- java 时间格式化(2016.04.12 12:32:55)
		输入的时间格式如:2016.04.12 12:32:55所示: 想要获取一定格式的日期,时间的方法 String startString = "2016.04.25 12:25:44&quo ... 
- WSGI协议以及对服务器的影响
		下面的内容纯属个人学习心得,如果对于我的观点有疑问,敬请留言,我将虚心向大牛学习. WSGI的全称是WEB SERVICE GATEWAY INTERFACE.WSGI 不是服务器,不是API,也不是 ... 
- wsgi 协议
		wsgi 协议 前言 本来没打算这么早就学习 wsgi 的,因为想要学习python 是如何处理网络请求的绕不开 wsgi,所以只好先学习一下 wsgi.先对 wsgi 有个印象,到了学习 Djang ... 
- Python Web开发中,WSGI协议的作用和实现原理详解
		首先理解下面三个概念: WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server ... 
随机推荐
- C++连接sqlite数据库的坑
			新的第一次用vs2013搞 C++连接sqlite数据库,遇到了很多问题,我也不搞不懂~~~下面写点小体会 首先: 你要先配置好sqlite的环境 参考链接: https://blog.csdn.ne ... 
- 吴裕雄--天生自然java开发常用类库学习笔记:属性类Properties
			import java.util.Properties; public class PropertiesDemo01{ public static void main(String args[]){ ... 
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):带有字体图标的导航栏
			<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ... 
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-pause
			<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ... 
- c# quartz
			quartz调度核心元素: Scheduler:任务调度器,是实际执行任务调度的控制器.在spring中通过SchedulerFactoryBean封装起来. Trigger:触发器,用于定义任务调度 ... 
- Day4-T2
			原题目 某大厦共有 N 层,现在知道共有 K 个请求要上下电梯:下面告诉你每个请求乘电梯的出发层次和结 束层次.请你求出整个电梯的运行过程.假设电梯一开始停在第一层,运行 K 个请求最后回到第一层. ... 
- Loadrunner11的关联问题 《转载》
			Loadrunner11的关联问题 链接:http://www.51testing.com/html/15/523415-821644.html 
- 142-PHP trait的定义和使用
			<?php trait info{ //定义trait static function getinfo(){ return '这是一个'.__CLASS__.'类.<br />'; ... 
- 【转】美团 MySQL 数据实时同步到 Hive 的架构与实践
			文章转载自公众号 美团技术团队 , 作者 萌萌 背景 在数据仓库建模中,未经任何加工处理的原始业务层数据,我们称之为ODS(Operational Data Store)数据.在互联网企业中,常见的 ... 
- 腾讯云Windows2016数据中文版环境搭建
			最近忙活了好几天,在腾讯云上买了台服务器,系统是Windows2016数据中文版,用于个人的学习,下面说一下整个流程吧. 遇到的问题: 一开始是按照腾讯云的指南文档去搞环境配置的,但它上面都是以Win ... 
