一、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