1、wsgiref模块1
Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站
的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速
开发web应用了。浏览器和服务器的是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使
用的方法,大大提高了开发的效率。
wsgiref模块
让我们专注于web开发,其他的接受HTTP请求、解析HTTP请求、发送HTTP请求让wsgiref模块处理
----------------------------------------------------------------------------------------------------------------------------------------------------------
data=conn.recv(1024) print(data)
b'GET / HTTP/1.1 Host: 127.0.0.1:8880 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 Cookie: csrftoken=IU9cIEWdRzTx7gm6JIjASm9TZJSve8jUGcfXPbgTXpSW0iHot1NOxpjdroESRB4f ' b'GET /yuan?name=yuan&age=22 HTTP/1.1 Host: 127.0.0.1:8880 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 Cookie: csrftoken=IU9cIEWdRzTx7gm6JIjASm9TZJSve8jUGcfXPbgTXpSW0iHot1NOxpjdroESRB4f ' b'POST / HTTP/1.1 Host: 127.0.0.1:8880 Connection: keep-alive Content-Length: 20 Pragma: no-cache Cache-Control: no-cache Origin: http://127.0.0.1:8880 Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Referer: http://127.0.0.1:8880/ Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 Cookie: csrftoken=IU9cIEWdRzTx7gm6JIjASm9TZJSve8jUGcfXPbgTXpSW0iHot1NOxpjdroESRB4f user=bisheng&pwd=456' ---------------------------------------------

URL: 协议://IP:端口(80)/路径?a=1&b=2 '''
一个简单的wsgiref模块

from wsgiref.simple_server import make_server # make_server 封装了以下内容 # sock_server=socket.socket() # ip_port=('127.0.0.1',8080) # sock_server.bind(ip_port) # sock_server.listen(5) def application(environ,start_response): # 按着http协议解析数据:environ # 按着http协议组装数据:start_response print(environ) print(type(environ)) # 字典 start_response('200 OK') return [b'<h1>hello word</h1>'] #封装了socket httped=make_server('127.0.0.1',8080,application) # 等待用户连接:conn,addr=sock.accept() httped.serve_forever()
-------------------
升华版本:

from wsgiref.simple_server import make_server # make_server 封装了以下内容 # sock_server=socket.socket() # ip_port=('127.0.0.1',8080) # sock_server.bind(ip_port) # sock_server.listen(5) def application(environ,start_response): # 按着http协议解析数据:environ # 按着http协议组装数据:start_response print(environ) print(type(environ)) # 字典 # 当前的请求路径 path=environ.get('PATH_INFO') start_response('200 OK',[]) if path=='/login': with open('login.html','r',encoding='utf-8')as f: data=f.read() elif path=='/index': with open('index.html','r',encoding='utf-8')as f: data=f.read() return [data.encode('utf-8')] #封装了socket httped=make_server('127.0.0.1',8080,application) # 等待用户连接:conn,addr=sock.accept() httped.serve_forever()
start_response('200 OK',[])后面的空括号可以没有内容,但必须有
DIY一个web框架
图标请求
浏览器主动请求服务器,获取图标
---------------------------------------------------------------------------------------------------------------------

from wsgiref.simple_server import make_server def application(environ,start_response): start_response('200 OK',[]) print(environ.get('PATH_INFO')) path = environ.get('PATH_INFO') # 方案一 # if path=='/favicon.ico': # 图表请求 # with open('favicon.ico','rb')as f: # data=f.read() # return [data] # elif path=="/login": # with open("login.html","rb") as f: # data=f.read() # return [data] # # elif path=="/index": # with open("index.html","rb") as f: # data=f.read() # return [data] # 对上面的优化 ------ 路由分化 url_patterns=[ ('/login','login'), ('/index','index'), ('/favicon.ico','favicon') ] func = None for item in url_patterns: if path==item[0]: func=item[1] break if func: return [func1(func,environ)] else: return [b'404!'] # def login(): # with open('login.html','rb')as f: # data=f.read() # return data # def index(): # with open('index.html','rb')as f: # data=f.read() # return data # def favicon(): # with open('favicon.ico','rb')as f: # data=f.read() # return data # 继续优化代码 def func1(func,environ): if func=='favicon': with open(f'{func}.ico', 'rb')as f: data = f.read() return data with open(f'{func}.html', 'rb')as f: data = f.read() return data httpd=make_server('127.0.0.1',8080,application) print('server http on port ') # 开始监听HTTP请求 httpd.serve_forever()
软件开发目录规范
代码解耦
如下就相当于一个简单的web框架
urls.py----路由分配
views.py----
---------------------------------------------------------------------------------------------------------
扩展框架关于数据库的操作(核心)
-----------------------------------------------------------------------------
web框架 总结 main.py: 启动文件,封装了socket 1 urls.py: 路径与视图函数映射关系 ---- url控制器 2 views.py 视图函数,固定有一个形式参数:environ -----视图函数, 3 templates文件夹: html文件 -----模板 4 models: 在项目启动前,在数据库中创建表结构 ----- 与数据库相关