web框架
Web框架(Web framework) 是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了。浏览器和服务器的是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率。
wsgireg模块
最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。
如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。
正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口协议来实现这样的服务器软件,让我们专心用Python编写Web业务。这个接口就是WSGI:Web Server Gateway Interface。而wsgiref模块就是python基于wsgi协议开发的服务模块。
1 from wsgiref.simple_server import make_server 2 3 4 def application(environ, strat_response): 5 print(environ) 6 print(type(environ)) 7 8 # 当前的路径请求 9 path = environ.get('PATH_INFO') 10 print(path) 11 strat_response('200 OK', []) 12 if path == '/login': 13 with open('login.html', 'r') as f: 14 data = f.read() 15 elif path == '/index': 16 with open('index.html', 'r') as f: 17 data = f.read() 18 19 return [data.encode('utf8')] 20 21 22 # 封装socket 23 httped = make_server("127.0.0.1", 8899, application) 24 25 # 等待用户链接: conn, addr = socket.accept() 26 httped.serve_forever() # application(environ, strat_response)
DIY一个web框架
- models.py
1 import pymysql 2 #连接数据库 3 conn = pymysql.connect(host='127.0.0.1',port= 3306,user = 'root',passwd='2965152',db='web') #db:库名 4 #创建游标 5 cur = conn.cursor() 6 7 sql=''' 8 create table userinfo( 9 id INT PRIMARY KEY , 10 name VARCHAR(32) , 11 password VARCHAR(32) 12 ) 13 14 ''' 15 16 cur.execute(sql) 17 18 #提交 19 conn.commit() 20 #关闭指针对象 21 cur.close() 22 #关闭连接对象 23 conn.close()
- 启动文件main.py
1 from wsgiref.simple_server import make_server 2 from urls import url_patterns 3 4 ''' 5 web框架 功能总结 6 7 main.py: 启动文件 封装了socket 8 urls.py: 路径与视图的映射关系 ------url控制器 9 views.py: 视图函数,固定有一个形参:environ --------视图函数 10 models.py: 项目启动前 在数据库中创建表结构 -------数据库相关 11 templates文件夹: html文件 -----------模版 12 13 14 15 16 17 18 ''' 19 20 21 def application(environ, strat_response): 22 print(environ) 23 print(type(environ)) 24 25 # 当前的路径请求 26 path = environ.get('PATH_INFO') 27 print(path) 28 strat_response('200 OK', []) 29 30 # 方案一: 31 # if path == '/login': 32 # with open('login.html', 'rb') as f: 33 # data = f.read() 34 # elif path == '/index': 35 # with open('index.html', 'rb') as f: 36 # data = f.read() 37 # elif path == '/favicon.ico': 38 # with open('favicon.ico', 'rb') as f: 39 # data = f.read() 40 # 41 # return [data] 42 43 # 方案二 44 45 func = None 46 for item in url_patterns: 47 if path == item[0]: 48 func = item[1] 49 break 50 51 if func: 52 return [func(environ)] 53 else: 54 return [b"404"] 55 56 57 # 封装socket 58 httped = make_server("127.0.0.1", 8899, application) 59 60 # 等待用户链接: conn, addr = socket.accept() 61 httped.serve_forever() # application(environ, strat_response)
- urls.py
1 from views import * 2 url_patterns = [ 3 ('/login', login), 4 ('/index', index), 5 ('/favicon.ico',fav), 6 ('/auth', auth) 7 ]
- views.py
1 import pymysql 2 3 from urllib.parse import parse_qs 4 5 6 def login(environ): 7 with open('templates/login.html', 'rb') as f: 8 data = f.read() 9 return data 10 11 def index(environ): 12 with open('templates/index.html', 'rb') as f: 13 data = f.read() 14 return data 15 16 def fav(environ): 17 with open('templates/favicon.ico', 'rb') as f: 18 data = f.read() 19 return data 20 21 def auth(request): 22 try: 23 request_body_size = int(request.get('CONTENT_LENGTH', 0)) 24 except (ValueError): 25 request_body_size = 0 26 27 request_body = request['wsgi.input'].read(request_body_size) 28 data = parse_qs(request_body) 29 print(data) 30 user = data.get(b"user")[0].decode("utf8") 31 pwd = data.get(b"pwd")[0].decode("utf8") 32 33 # 连接数据库 34 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='2965152', db='web') # db:库名 35 # 创建游标 36 cur = conn.cursor() 37 SQL = "select * from userinfo WHERE NAME ='%s' AND PASSWORD ='%s'" % (user, pwd) 38 cur.execute(SQL) 39 40 if cur.fetchone(): 41 42 f = open("templates/backend.html", "rb") 43 data = f.read() 44 data = data.decode("utf8") 45 return data.encode("utf8") 46 47 else: 48 return b"user or pwd is wrong"
- login.html
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <form action="http://127.0.0.1:8899/auth" method="post"> 9 用户名: <input type="text" name="user"><br> 10 密码: <input type="password" name="pwd"><br> 11 <input type="submit"> 12 13 </form> 14 </body> 15 </html>
- backend.html
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>index</h1> 9 </body> 10 </html>
DIY一个web框架 这个package就是一个web框架,下载这个web框架就可以快速实现一些简单的web功能,比如查看时间。