本篇文章是为了后面的Django做准备的,这是学习web框架的底层知识,没有直接用到socket,而是用Python自带的库wsgiref。
1、wsgiref模块
它就相当于是一个服务器,会帮我们做解析,内部已经封装好了socket等多项功能。
2、框架主要分为五部分
1)导入模块
from wsgiref.simple_server import make_server
2)自定义处理函数
def foo1(req):
f=open("index1.html","rb")
data=f.read()
return data
3)路由分发函数
即分发其他函数的一个函数,所有的要实现的功能都可以放在这里面传输到服务器,这样每一个路径都可以对应一个函数。
def router():
url_patterns=[
("/login",login),
("/register",register),
("/Viewin", foo1),
("/Zoro", foo2),
("/show_time",show_time),
]
return url_patterns
4)应用函数
框架本体,可以直接套用。一但有端口连接进入后,就会运行application函数,environ是wsgiref服务器处理传入的请求信息,是一个大字典,取值用键值对来取。
def application(environ, start_response):
print("path",environ["PATH_INFO"])
path= environ["PATH_INFO"]
start_response('200 OK', [('Content-Type', 'text/html')])
return [b"<h1>Hello, web!</h1>"]
5)创建链接并监听HTTP请求
参数:IP地址,端口,应用函数
注意:这里的IP地址会默认获取本机的IP地址
httpd = make_server('', 8080, application)
httpd.serve_forever()
3、前端代码body部分
1)show_time
<body>
<h1>时间:{{time}}</h1>
<!--自定义语法{{}}-->
</body>
2)login
<form action="http://192.168.43.247:8080/login" method="get">
<p>用户:<input type="text" name="user"> </p>
<p>密码:<input type="password" name="pwd"> </p>
<p><input type="submit">提交</p>
</form>
3)index1
<h1>Hello ViewIn!</h1>
4)index2
<h1>Hello Zoro!</h1>
4、参考效果
5、完整web框架
from wsgiref.simple_server import make_server
import time
def foo1(req):
f=open("index1.html","rb")
data=f.read()
return data
def foo2(req):
f = open("index2.html", "rb")
data = f.read()
return data
def login(req):
print(req["QUERY_STRING"])
return b"Welcome to my web!"
def register(req):
pass
def show_time(req):
times=time.ctime()
f= open("show_time.html","rb")
data= f.read().decode("utf8")
data= data.replace("{{time}}",str(times))
return data.encode("utf8")
def router():
url_patterns=[
("/login",login),
("/register",register),
("/Viewin", foo1),
("/Zoro", foo2),
("/show_time",show_time),
]
return url_patterns
def application(environ, start_response):
print("path",environ["PATH_INFO"])
path= environ["PATH_INFO"]
start_response('200 OK', [('Content-Type', 'text/html')])
'''
if path=="/Viewin":
return[foo1()]
# return[b"<h1>Hello ViewIn!</h1>"] # 传入网页的应该是字节类型(二进制),并且最终应该包含在一个大字典里
elif path=="/Zoro":
return[foo2()]
# return[b"<h1>Hello Zoro!</h1>"]
'''
url_patterns=router()
func=None
for item in url_patterns:
if item[0]==path:
func=item[1]
break
if func:
return[func(environ)]
else:
return [b"<h1>404</h1>"]
return [b"<h1>Hello, web!</h1>"]
httpd = make_server('', 8080, application)
print('Serving HTTP on port 8080...')
httpd.serve_forever()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)