博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django
阅读量:6004 次
发布时间:2019-06-20

本文共 6297 字,大约阅读时间需要 20 分钟。

---恢复内容开始---

首先了解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()
web

关于响应协议:

请求协议 浏览器-------------------> 服务器       <-------------------                响应协议       由服务端发送给浏览器的一种特殊协议,双方规定好的, 格式: 响应首行
HTTP/1.1 200 OK 协议/版本号/状态码/状态码译文
响应头
status: 200\r\nContent-Type:text/html 键值对 用\r\n 区分开
响应体
\r\n\r\n

Hello, 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()
wsgiref模块

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()
manage文件

 

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()
model文件

 

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 ]
urls文件

 

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")
views文件

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

---恢复内容结束---

转载于:https://www.cnblogs.com/zhangqing979797/p/9825599.html

你可能感兴趣的文章
linux文件存取 inode解读
查看>>
android edittext不弹出软键盘
查看>>
windows下安装和配置nginx
查看>>
selinux
查看>>
第3章 远程连接管理Linux实践
查看>>
透析Linux系统编程
查看>>
数据库Sqlite文件的增删改查
查看>>
hdu 1024 Max Sum Plus Plus 小白都可以看得懂的解析
查看>>
shell中常见参数及判断命令
查看>>
VMware Horizon View 7.5 虚拟桌面实施咨询与购买--软件硬件解决方案
查看>>
2018新版驾照驾照psd模板下载
查看>>
【矢量图控件教程】矢量图控件VectorDraw 常见问题整理大全(一)
查看>>
文件系统、服务、防火墙、SELINUX——安全四大金刚
查看>>
RabbitMQ如何保证队列里的消息99.99%被消费?
查看>>
Lync Server 2010的部署系列_第五章 准备 Active Directory 域服务
查看>>
java基本数据类型及运算符小结
查看>>
第一周博客作业
查看>>
Python strip lstrip rstrip使用方法
查看>>
Linux开发工具_1_gcc入门(上)
查看>>
在这里安家了
查看>>