一、Web应用本质
任何Web应用实际上都是一个Socket服务端,浏览器就是Web应用的客户端。一个最简单的Web应用就是写好一个HTML的文档,然后用现成的HTTP服务器软件如Nginx、Apache、Tomcat等区接收用户请求,再把HTML文档中的内容
通过万维网传送给客户端。但是这样只能给客户端发送同一个HTML文档的内容,如果要动态生成HTML就需要我们自己去做接收HTTP请求、解析HTTP请求、从HTTP请求中获取到需要的信息后生成一个新的HTML、发送一个HTTP响应将动态生成的HTML传送给客户端。由于HTTP协议是一个很深奥的协议,它有很多内容,如果以上这些事情都有我们自己来完成就需要研究HTTP协议,这样就太影响开发效率了,为了解决这个问题就有了CGI通用网关接口,它帮助我们完成对HTTP协议的接收、解析以及最后的响应,让我们可以专心写Web业务代码,针对Python实现的CGI之一就是WSGI。
二、wsgiref模块
wsgiref模块的simple_server中的make_server类可以让我简单实现一个Web服务器,该类实例化需要三个参数,服务器IP、服务器端口、请求处理函数,其中请求处理函数有两个参数一个environ包含一个请求的所有信息以键值对形式存放,start_response定义响应头信息,函数中需要返回一个响应正文中的数据,然后实例化之后就可以用实例化的对象调用serve_forever()方法启动服务端
from wsgiref.simple_server import make_server def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [b'<h1>Hello, web!</h1>'] httpd = make_server('', 8080, application) print('Serving HTTP on port 8000...') # 开始监听HTTP请求: httpd.serve_forever()
三、Web框架
Web框架实际上就是将我们在写Web应用中需要反复做的或者很复杂的事情进行模块化封装,让我们只需要按照框架要求的格式写Web应用就可以极大的减少开发工作量,比如我们可以利用wsgiref模块实现一个简单的Web框架app01
负责启动整个项目的manage.py
from wsgiref.simple_server import make_server # request response from app01.views import * from app01 import urls def routers(): URLpattern=urls.URLpattern return URLpattern def applications(environ,start_response): path=environ.get("PATH_INFO") print("path",path) start_response('200 OK', [('Content-Type', 'text/html'),('Charset', 'utf8')]) urlpattern=routers() func=None for item in urlpattern: if path==item[0]: func=item[1] break if func: return [func(environ)] else: return [b"<h1>404!<h1>"] # return [b"<h1>hello world<h1>"] if __name__ == '__main__': t=make_server("",8810,applications) print("server is working...") t.serve_forever()
负责路径和业务函数映射的urls
from app01.views import * URLpattern = ( ("/login/", login), )
负责处理业务逻辑的views
import pymysql from urllib.parse import parse_qs def login(request): if request.get("REQUEST_METHOD")=="POST": print("+++++",request) #当请求方式是GET时 # user_union,pwd_union=request.get("QUERY_STRING").split("&") # _,user=user_union.split("=") # _,pwd=pwd_union.split("=") # 环境变量 CONTENT_LENGTH 可能是空值 或者 值丢失 try: request_body_size = int(request.get('CONTENT_LENGTH', 0)) except (ValueError): request_body_size = 0 # 当请求方式是POST时, 变量将会被放在存在域wsgi.input文件中的HTTP请求信息中, 由WSGI 服务器一起发送. request_body = request['wsgi.input'].read(request_body_size) d = parse_qs(request_body) user=d.get(b"user")[0].decode("utf8") pwd=d.get(b"pwd")[0].decode("utf8") print("user",user,pwd) #连接数据库 conn = pymysql.connect(host='',port= 3306,user = 'root',passwd='',db='s6') #db:库名 #创建游标 cur = conn.cursor() SQL="select * from userinfo2 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"))%user return data.encode("utf8") else: return b"user or pwd is wrong" else: f = open("templates/login.html", "rb") data = f.read() f.close() return data
负责处理数据库的models
import pymysql import pymysql #连接数据库 conn = pymysql.connect(host='',port= 3306,user = 'root',passwd='',db='s6') #db:库名 #创建游标 cur = conn.cursor() # sql=''' # create table userinfo2( # id INT PRIMARY KEY , # name VARCHAR(32) , # password VARCHAR(32) # ) # # ''' # # cur.execute(sql) # # cur.executemany("insert into userinfo2 values(%s,%s,%s)", [(1,"yuan","123"), # (2,"alex","456"), # (3,"egon","789")]) cur.execute("select * from userinfo2 WHERE NAME='yuan' AND PASSWORD ='123'") #提交 conn.commit() #关闭指针对象 cur.close() #关闭连接对象 conn.close()
来源:https://www.cnblogs.com/lfpython/p/7694982.html