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