---恢复内容开始---
首先了解web应用
一.
web应用是通过web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要一个浏览器,应用程序分为两种 C/S B/S ,c/s是客户端/服务器程序,这类程序一般独立运行, b/s 是浏览器/服务器端应用程序,,浏览器是一个socket客户端,服务器是一个socket服务端
web应用小程序
1 import socket 2 3 def handle_request(client): 4 #5.接收浏览器的信息,1024字节接收 5 request_data = client.recv(1024) 6 print("request_data: ",request_data) 7 # 5.发送响应协议 8 client.send("HTTP/1.1 200 OK\r\nstatus: 200\r\nContent-Type:text/html\r\n\r\n".encode("utf8")) 9 # 6.发送数据至浏览器(客户端)10 client.send("Hello, luffycity!
".encode("utf8"))11 12 def main():13 # 1.创建socket对象 socket.socket()14 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)15 # 2.绑定ip端口16 sock.bind(('localhost',8812))17 # 3.限制次数18 sock.listen(5)19 20 while True:21 print("the server is waiting for client-connection....")22 # 4.connection 相当于连接的那把伞,地址23 connection, address = sock.accept()24 handle_request(connection)25 connection.close()26 27 if __name__ == '__main__':28 29 main()
关于响应协议:
请求协议 浏览器-------------------> 服务器 <------------------- 响应协议 由服务端发送给浏览器的一种特殊协议,双方规定好的, 格式: 响应首行
HTTP/1.1 200 OK 协议/版本号/状态码/状态码译文
响应头
status: 200\r\nContent-Type:text/html 键值对 用\r\n 区分开
响应体
\r\n\r\nHello, luffycity!
主要内容 有\r\n\r\n 区分 了解http协议 二.
http是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本的传送协议。 HTTP 协议特性 1.基于TCP/IP: http协议是基于TCP/IP协议之上的应用层协议。 2.基于请求-响应模式: HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并 返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有 接收到请求之前不会发送响应 3.无状态保存 比如打开一个网页的时候,协议会稍微停留几秒钟,方便快速进行下次访问 4.无连接 无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。 请求协议 get与post请求方法不同
- GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的请求体中.
- GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
- GET与POST请求在服务端获取请求数据方式不同。
响应协议:
关于web框架
三
wsgiref模块
最简单的web应用是把html用文件保存好,用一个现成的http服务器软件,接受用户的请求,从文件读取html,返回,要生成动态的html文件,需要把上述步骤自己实现,太麻烦了,需要自己去写,TCP连接(socket模块),解析http请求(接收来自http的协议),发送htto响应(发送响应协议),浏览器和服务器是通过http协议进行通信的,需要一个接口协议实现服务器软件,这个接口就是wsgi,而wsgiref就是python基于wsgi协议开发的服务模块
1 from wsgiref.simple_server import make_server 2 3 def application(environ, start_response): 4 """ 5 6 :param environ: 请求信息字典 7 :param start_response: 封装响应格式的 8 :return: 9 """10 print("environ",environ)11 print("PATH_INFO",environ.get("PATH_INFO"))12 start_response('200 OK', [('Content-Type', 'text/html'),("k1","v1")])13 return [b'Hello, web!
']14 15 16 httpd = make_server('', 8080, application)17 18 print('Serving HTTP on port 8080...')19 # 开始监听HTTP请求:20 httpd.serve_forever()
environ: 将http协议的各种请求以字典的的形式返回,直接取字典的键值对,
关于web框架的小小小项目
web项目中,templates是用来存放html文件的文件夹
manage.py是用来通过wsgief模块,进行动态的http协议交互
1 # 引入wsgi模块 2 from wsgiref.simple_server import make_server 3 4 from urls import urlpattens 5 6 def application(environ, start_response): 7 8 print("environ",environ) 9 print("PATH_INFO",environ.get("PATH_INFO"))10 path=environ.get("PATH_INFO")11 data=b""12 13 14 # 方案115 # if path=="/login":16 # data=login(environ)17 # elif path=="/auth":18 # data=auth(environ)19 20 # 方案221 func=None22 # 2.1遍历取到的路径 如("/timer", timer),如果path=/time func为timer23 for item in urlpattens:24 print("------>",item[0])25 if item[0]==path:26 func=item[1]27 break28 # 2.2 如果func为空,data= 404 如果不为空,执行timer(environ)函数29 if not func:30 data=b"404
"31 else:32 data = func(environ)33 34 start_response('200 OK', [('Content-Type', 'text/html')])35 # 3.给浏览器返回36 return [data]37 38 39 httpd = make_server('', 8088, application)40 41 print('Serving HTTP on port 8088...')42 # 开始监听HTTP请求:43 httpd.serve_forever()
models.py 是用来与数据库打交道的
1 # 创建表结构 2 3 import pymysql 4 #连接数据库 5 conn = pymysql.connect(host='127.0.0.1',port= 3306,user = 'root',passwd='',db='web') #db:库名 6 #创建游标 7 cur = conn.cursor() 8 9 sql='''10 create table userinfo(11 id INT PRIMARY KEY ,12 name VARCHAR(32) ,13 password VARCHAR(32)14 )15 16 '''17 18 cur.execute(sql)19 20 #提交21 conn.commit()22 #关闭指针对象23 cur.close()24 #关闭连接对象25 conn.close()
urls.py 是用来进行对views.py导入的,用来存放访问的请求转到manage,在找到相应的关系执行函数
1 # url与视图函数的映射关系 2 from views import login,auth,fav,index,timer 3 4 urlpattens = [ 5 ("/timer", timer), 6 ("/login", login), 7 ("/auth", auth), 8 ("/favicon.ico", fav), 9 ("/", index),10 ]
views.py 是用来进行对浏览器端返回的信息进行函数的方法结果返回给manage,最后返回到浏览器
1 from urllib.parse import parse_qs 2 3 def login(environ): 4 with open("templates/login.html", "rb") as f: 5 data = f.read() 6 7 return data 8 9 def auth(environ):10 # 登录认证11 12 # 1 获取用户输入的用户名和密码13 # 1.1获取接受的字节数14 request_body_size = int(environ.get('CONTENT_LENGTH', 0))15 print("request_body_size", request_body_size) # 1716 # 1.2 按照字节数获取17 request_body = environ['wsgi.input'].read(request_body_size) # b'user=alex&pwd=123'18 # 1.3 将账号密码装换成字典的形式19 reqeust_data = parse_qs(request_body) # {b'user': [b'alex'], b'pwd': [b'123']}20 # 1.4 用get取出字典,转换成字符串21 user = (reqeust_data.get(b"user")[0]).decode("utf8")22 pwd = (reqeust_data.get(b"pwd")[0]).decode("utf8")23 print("====>", user, pwd)24 25 # 2 去数据库做校验,查看提交用户是否合法26 # 连接数据库27 import pymysql28 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='web') # db:库名29 # 创建游标30 cur = conn.cursor()31 SQL = "select * from userinfo WHERE NAME ='%s' AND PASSWORD ='%s'" % (user, pwd)32 cur.execute(SQL)33 # print("cur.fetchone:",cur.fetchone()) # (1, 'alex', '123')34 if cur.fetchone():35 # 验证成功36 data = "登录成功!".encode("gbk")37 else:38 # 验证失败39 data = "登录失败!".encode("gbk")40 41 return data42 43 44 def fav(environ):45 46 with open("templates/favicon.ico","rb") as f:47 data=f.read()48 49 return data50 51 52 def index(environ):53 54 with open("templates/index.html", "rb") as f:55 data = f.read()56 57 return data58 59 def timer(environ):60 61 import datetime62 now=datetime.datetime.now()63 64 return str(now).encode("utf8")
---恢复内容结束---