对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。
WSGI(Web Server Gateway Interface)是一种规范,它定义了使用python编写的web app与web server之间接口格式,实现web app与web server间的解耦。
一、python标准库提供的独立WSGI服务器称为wsgiref
from wsgiref.simple_server import make_server def RunServer(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ] if __name__ == '__main__':
httpd = make_server('10.88.5.131', 8000, RunServer)
print("Serving HTTP on port 8000...")
httpd.serve_forever()
运行后结果为:
二、自定义web框架
通过python标准库提供的wsgiref模块开发一个自己的Web框架
#!/usr/bin/env python
#-*- coding:utf-8 -*- from wsgiref.simple_server import make_server def f1():
f = open("index.html")
data = f.read()
f.close()
#让返回的信息跟数据库的信息替换(动态 )
import time
db_str = str(time.time())
data = data.replace("((x))",db_str)
#jinja2模板给你提供更复杂的替换
return data def f2():
f = open("login.html")
data = f.read()
f.close()
from jinja2 import Template
template = Template(data)
#接受值,进行特殊的替换
ret = template.render(name="koka",user_list=["asd","qwe"])
return ret.encode("utf-8") #1 定义一个字典,上面定义函数
routers = {
'/index/':f1,
'/login/':f2,
} def RunServer(environ, start_response):
#environ封装用户相关的所有信息
#environ["PATH_INFO"] 读取用户请求的url
start_response('200 OK', [('Content-Type', 'text/html')])
#根据url的不同,执行不同的函数,返回不同的字符串
request_url = environ['PATH_INFO']
#print environ #这里可以通过断点来查看它都封装了什么数据 #如果用户请求的url和咱们定义的url匹配
if request_url in routers.keys():
func_name = routers[request_url]()
ret = func_name()
return ret
else:
return '' if __name__ == '__main__':
httpd = make_server('', 8000, RunServer)
print "Serving HTTP on port 8000..."
httpd.serve_forever()
模板引擎:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>Hello</h1>
<div style="style="color:red;font-size:50px;">
World --- ((x))
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/css/commons.css">
</head>
<body>
<h1>Home</h1>
<h2>{{ name }}</h2>
<h2>{{ age }}</h2>
<ul>
{% for item in user_list %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>