1、Web框架
Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了。浏览器和服务器的是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率。
wsgiref模块
最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。
如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。
正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口协议来实现这样的服务器软件,让我们专心用Python编写Web业务。这个接口就是WSGI:Web Server Gateway Interface。而wsgiref模块就是python基于wsgi协议开发的服务模块。


from wsgiref.simple_server import make_serverdef mya(environ, start_response):print(environ)start_response('200 OK', [('Content-Type', 'text/html')])if environ.get('PATH_INFO') == '/index':with open('index.html','rb') as f:data=f.read()elif environ.get('PATH_INFO') == '/login':with open('login.html', 'rb') as f:data = f.read()else:data=b'<h1>Hello, web!</h1>'return [data]if __name__ == '__main__':myserver = make_server('', 8011, mya)print('监听8010')myserver.serve_forever()wsgiref简单应用
2、手写Web框架
models.py
链接数据库返回字典格式:
cursor=pymysql.cursors.DictCursor


import pymysql #连接数据库 conn = pymysql.connect(host='127.0.0.1',port= 3306,user = 'root',passwd='123456',db='web') #db:库名 #创建游标 cur = conn.cursor()sql=''' create table userinfo(id INT PRIMARY KEY ,name VARCHAR(32) ,password VARCHAR(32) )'''cur.execute(sql)#提交 conn.commit() #关闭指针对象 cur.close() #关闭连接对象 conn.close()创建数据表
myserver.py


from wsgiref.simple_server import make_serverfrom urls import url_pattersdef mya(environ, start_response):# print(environ)start_response('200 OK', [('Content-Type', 'text/html')])func = Nonefor item in url_patters:if item[0] == environ.get('PATH_INFO'):func = item[1]breakif func:data = func(environ)return [data]else:return [b'404']if __name__ == '__main__':myserver = make_server('', 8011, mya)print('监听8010')myserver.serve_forever()启动文件
urls.py


from views import * url_patters = [('/login', login),('/index', index),('/time', time), ]路由配置
views.py


def index(environ):with open('templates/index.html', 'rb') as f:data = f.read()return data def time(environ):import datetimenow=datetime.datetime.now().strftime('%y-%m-%d %X')print(now)return now.encode('utf-8') from urllib.parse import parse_qs import pymysql def login(request):if request.get("REQUEST_METHOD") == "POST":try:request_body_size = int(request.get('CONTENT_LENGTH', 0))except (ValueError):request_body_size = 0request_body = request['wsgi.input'].read(request_body_size)data = parse_qs(request_body)user = data.get(b"user")[0].decode("utf8")pwd = data.get(b"pwd")[0].decode("utf8")# 连接数据库conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='web') # db:库名# 创建游标cur = conn.cursor()SQL = "select * from userinfo WHERE NAME ='%s' AND PASSWORD ='%s'" % (user, pwd)cur.execute(SQL)if cur.fetchone():f = open("templates/backend.html", "rb")data = f.read()data = data.decode("utf8")return data.encode("utf8")else:print("OK456")return b"user or pwd is wrong"else:f = open("templates/login.html", "rb")data = f.read()f.close()return data视图函数
tempaltes下


<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> 登录成功 </body> </html>backend.html


<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> index </body> </html>index


<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body><h4>登录页面</h4> <form action="http://127.0.0.1:8011/login" method="post">用户名 <input type="text" name="user">密码 <input type="text" name="pwd"><input type="submit"> </form> </body> </html>login.html
3、其他SOCKET服务端
'cgi': CGIServer,'flup': FlupFCGIServer,'wsgiref': WSGIRefServer,'waitress': WaitressServer,'cherrypy': CherryPyServer,'paste': PasteServer,'fapws3': FapwsServer,'tornado': TornadoServer,'gae': AppEngineServer,'twisted': TwistedServer,'diesel': DieselServer,'meinheld': MeinheldServer,'gunicorn': GunicornServer,'eventlet': EventletServer,'gevent': GeventServer,'geventSocketIO':GeventSocketIOServer,'rocket': RocketServer,'bjoern' : BjoernServer,'auto': AutoServer,
都遵循一个协议wsgi(Web Server Gateway Interface web服务网关接口)