Python学习——web框架
对于所有的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>