一、Web框架本质
所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端
二、Web框架功能
socket收发消息——wsgiref(测试)、uwsgi(线上)
根据不同的路径返回不同的字符串
返回动态页面(字符串的替换)——jinja2
三、Web框架种类
django
根据不同的路径返回不同的字符串
返回动态页面(字符串的替换)
flask
根据不同的路径返回不同的字符串
tornado
socket收发消息
根据不同的路径返回不同的字符串
返回动态页面(字符串的替换)
四、自定义web框架
简单示例:socket服务端
importsocket
#创建一个socket对象
sk=socket.socket()
#绑定IP和端口
sk.bind(('127.0.0.1',8000))
#监听
sk.listen(5)
#等待连接
whileTrue:
conn,addr=sk.accept()
#接收数据
data=conn.recv(1024)
print(data)
#返回数据
conn.send(b'HTTP/1.1200OK\r\n\r\n<h1>ok!</h1>')
#断开连接
conn.close()
根据不同路径返回不同的内容(普通版)
importsocket
#创建一个socket对象
sk=socket.socket()
#绑定IP和端口
sk.bind(('127.0.0.1',8000))
#监听
sk.listen(5)
#等待连接
whileTrue:
conn,addr=sk.accept()
#接收数据
data=conn.recv(1024)
data=data.decode('utf-8')
url=data.split()[1]
conn.send(b'HTTP/1.1200OK\r\n\r\n')
ifurl=='/index/':
#返回数据
conn.send(b'<h1>index!</h1>')
elifurl=='/home/':
conn.send(b'<h1>home!</h1>')
else:
conn.send(b'<h1>404notfound!</h1>')
#断开连接
conn.close()
普通版
importsocket
#创建一个socket对象
sk=socket.socket()
#绑定IP和端口
sk.bind(('127.0.0.1',8000))
#监听
sk.listen(5)
#函数
defindex(url):
ret='<h1>index!</h1>({})'.format(url)
returnret.encode('utf-8')
defhome(url):
ret='<h1>home!</h1>({})'.format(url)
returnret.encode('utf-8')
#等待连接
whileTrue:
conn,addr=sk.accept()
#接收数据
data=conn.recv(1024)
data=data.decode('utf-8')
url=data.split()[1]
conn.send(b'HTTP/1.1200OK\r\n\r\n')
ifurl=='/index/':
#返回数据
ret=index(url)
elifurl=='/home/':
ret=home(url)
else:
ret=b'<h1>404notfound!</h1>'
conn.send(ret)
#断开连接
conn.close()
函数版
importsocket
#创建一个socket对象
sk=socket.socket()
#绑定IP和端口
sk.bind(('127.0.0.1',8000))
#监听
sk.listen(5)
#函数
defindex(url):
ret='<h1>index!</h1>({})'.format(url)
returnret.encode('utf-8')
defhome(url):
ret='<h1>home!</h1>({})'.format(url)
returnret.encode('utf-8')
#定义一个list1和实际要执行的函数的对应关系
list1=[
('/index/',index),
('/home/',home),
]
#等待连接
whileTrue:
conn,addr=sk.accept()
#接收数据
data=conn.recv(1024)
data=data.decode('utf-8')
url=data.split()[1]
conn.send(b'HTTP/1.1200OK\r\n\r\n')
func=None
foriinlist1:
ifurl==i[0]:
func=i[1]
break
iffunc:
ret=func(url)
else:
ret=b'<h1>404notfound!</h1>'
conn.send(ret)
#断开连接
conn.close()
函数进阶版
importsocket
#创建一个socket对象
sk=socket.socket()
#绑定IP和端口
sk.bind(('127.0.0.1',8000))
#监听
sk.listen(5)
#函数
defindex(url):
withopen('index.html','rb')asf:
ret=f.read()
returnret
defhome(url):
ret='<h1>home!</h1>({})'.format(url)
returnret.encode('utf-8')
#定义一个list1和实际要执行的函数的对应关系
list1=[
('/index/',index),
('/home/',home),
]
#等待连接
whileTrue:
conn,addr=sk.accept()
#接收数据
data=conn.recv(1024)
data=data.decode('utf-8')
url=data.split()[1]
conn.send(b'HTTP/1.1200OK\r\n\r\n')
func=None
foriinlist1:
ifurl==i[0]:
func=i[1]
break
iffunc:
ret=func(url)
else:
ret=b'<h1>404notfound!</h1>'
conn.send(ret)
#断开连接
conn.close()
返回html页面
importsocket
importtime
#创建一个socket对象
sk=socket.socket()
#绑定IP和端口
sk.bind(('127.0.0.1',8000))
#监听
sk.listen(5)
#函数
defindex(url):
withopen('index.html','rb')asf:
ret=f.read()
returnret
defhome(url):
ret='<h1>home!</h1>({})'.format(url)
returnret.encode('utf-8')
deftimer(url):
now=time.strftime('%H:%M:%S')
withopen('time.html','r',encoding='utf-8')asf:
data=f.read()
data=data.replace('xxtimexx',now)
?
returndata.encode('utf-8')
#定义一个list1和实际要执行的函数的对应关系
list1=[
('/index/',index),
('/home/',home),
('/time/',timer),
]
#等待连接
whileTrue:
conn,addr=sk.accept()
#接收数据
data=conn.recv(1024)
data=data.decode('utf-8')
url=data.split()[1]
conn.send(b'HTTP/1.1200OK\r\n\r\n')
func=None
foriinlist1:
ifurl==i[0]:
func=i[1]
break
iffunc:
ret=func(url)
else:
ret=b'<h1>404notfound!</h1>'
conn.send(ret)
#断开连接
conn.close()
补充:time.html
<!DOCTYPEhtml>
<htmllang="en">
<head>
<metacharset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>当前时间是:@@time@@</h1>
</body>
</html>
返回动态页面
五、wsgiref
常用的WSGI服务器有uWSGI、Gunicorn
Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器
简单示例:
"""
根据URL中不同的路径返回不同的内容--函数进阶版
返回HTML页面
让网页动态起来
wsgiref模块版
"""
fromwsgiref.simple_serverimportmake_server
#将返回不同的内容部分封装成函数
defindex(url):
#读取index.html页面的内容
withopen("index.html","r",encoding="utf8")asf:
s=f.read()
#返回字节数据
returnbytes(s,encoding="utf8")
defhome(url):
withopen("home.html","r",encoding="utf8")asf:
s=f.read()
returnbytes(s,encoding="utf8")
deftimer(url):
importtime
withopen("time.html","r",encoding="utf8")asf:
s=f.read()
s=s.replace('@@time@@',time.strftime("%Y-%m-%d%H:%M:%S"))
returnbytes(s,encoding="utf8")
#定义一个url和实际要执行的函数的对应关系
list1=[
("/index/",index),
("/home/",home),
("/time/",timer),
]
defrun_server(environ,start_response):
start_response('200OK',[('Content-Type','text/html;charset=utf8'),])#设置HTTP响应的状态码和头信息
url=environ['PATH_INFO']#取到用户输入的url
func=None
foriinlist1:
ifi[0]==url:
func=i[1]
break
iffunc:
response=func(url)
else:
response=b"404notfound!"
return[response,]
if__name__=='__main__':
httpd=make_server('127.0.0.1',8090,run_server)
print("我在8090等你哦...")
httpd.serve_forever()
示例
六、jinja2
模板渲染现成的工具:jinja2
下载jinja2:pipinstalljinja2
示例:
fromwsgiref.simple_serverimportmake_server
fromjinja2importTemplate
defindex(url):
#读取HTML文件内容
withopen("index2.html","r",encoding="utf8")asf:
data=f.read()
template=Template(data)#生成模板文件
ret=template.render({'name':'alex','hobby_list':['抽烟','喝酒','烫头']})#把数据填充到模板中
returnbytes(ret,encoding="utf8")
defhome(url):
withopen("home.html","r",encoding="utf8")asf:
s=f.read()
returnbytes(s,encoding="utf8")
#定义一个url和实际要执行的函数的对应关系
list1=[
("/index/",index),
("/home/",home),
]
defrun_server(environ,start_response):
start_response('200OK',[('Content-Type','text/html;charset=utf8'),])#设置HTTP响应的状态码和头信息
url=environ['PATH_INFO']#取到用户输入的url
func=None
foriinlist1:
ifi[0]==url:
func=i[1]
break
iffunc:
response=func(url)
else:
response=b"404notfound!"
return[response,]
if__name__=='__main__':
httpd=make_server('127.0.0.1',8090,run_server)
print("我在8090等你哦...")
httpd.serve_forever()
<!DOCTYPEhtml>
<htmllang="zh-CN">
<head>
<metacharset="UTF-8">
<metahttp-equiv="x-ua-compatible"content="IE=edge">
<metaname="viewport"content="width=device-width,initial-scale=1">
<title>Title</title>
</head>
<body>
<h1>姓名:{{name}}</h1>
<h1>爱好:</h1>
<ul>
{%forhobbyinhobby_list%}
<li>{{hobby}}</li>
{%endfor%}
</ul>
</body>
</html>
index2.html
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h54900.shtml