Django
一、web应用
1、web应用
web应用就是一种可以通过web访问的应用程序
#1、优点:
- 不需要客户端,只需要一个适用的浏览器;
- 更新直接在服务端更新,客户端感知不到;
- web应用程序通常耗费很少的用户硬盘空间,或者一点都不耗费;
- 网络应用程序和服务器端的网络产品都很容易结合,如email功能和搜索功能;
- 跨平台性好;
#2、缺点:
- 强调浏览器的使用性,如果浏览器方你没有提供特定的功能,或者弃用特定的平台或者操作系统版本导致不适用,就会影响到大量用户
- 网络连接出问题时,应用将不能正常使用
- 许多web程序是不开源的,只能依赖第三方提供的服务,因此不能针对用户定制化、个性化,大部分情况下也不能离线使用,因而损失了很多灵活性
- 完全依赖应用服务商的可及性。如果公司倒闭,服务器停止使用,用户将无法追索以前的资料
- 用户的数据都保存在软件厂商那边,公司理论上可以检索任何的用户行为,可能会引起隐私安全问题
2、bs、cs架构
1 bs:浏览器----服务端(本质上还是cs)
2 cs:客户端----服务端
- 优点:
- 采用Internet上标准的通信协议作为客户机同服务器通信的协议,这样可以使位于Internet任意位置的人都能够正常访问服务器; 对于服务器来说,通过相应的Web服务和数据库服务可以对数据进行处理。对外采用标准的通信协议,以便共享数据。
- 在服务器上对数据进行处理,就处理的结果生成网页,以方便客户端直接下载
- 在客户机上对数据的处理被进一步简化,将浏览器作为客户端的应用程序,以实现对数据的显示
- 总结:
浏览器本质上是一个socket客户端,服务器是一个socket服务端
二、基于socket写一个web应用
客户端是浏览器,服务端自己写
- 静态页面:
静态的html,内容不会改变,每次访问看到的数据都一样
- 动态页面:页面的数据会发生变化,每次访问看到的可能都不一样(数据来源可能是数据库)
1、main.py
import socket
server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)
while True:
conn, addr = server.accept()
data = conn.recv(1024)
print(data)
# conn.send(b'hello world!')
# 返回数据符合http协议
# conn.send(b'HTTP/1.1 200 ok \r\n\r\n hello world')
# 返回一个符合HTML格式的数据(windows默认使用的是gbk编码)
# conn.send('HTTP/1.1 200 ok \r\n\r\n <h1>我是标题</h1>'.encode('gbk'))
# 返回一个html页面,打开文件,转成二进制,发出去
# with open('index.html', 'r', encoding='utf-8') as f:
# data = f.read()
# response = f'HTTP/1.1 200 ok \r\n\r\n {data}'
# conn.send(response.encode('utf-8'))
# 实现动态页面,在index.html中写一个特殊标记,使用python的变量去替换这个特殊标记
import time
ctime = time.strftime('%Y-%m-%d %X')
with open('index.html', 'r', encoding='utf-8') as f:
data = f.read().replace('{{time}}', str(ctime))
response = f'HTTP/1.1 200 ok \r\n\r\n {data}'
conn.send(response.encode('utf-8'))
conn.close() # 连接是一次性的
2、index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
img {
width: 300px;
height: 260px;
}
p {
color: purple;
font-size: 40px;
}
</style>
</head>
<body>
<p>{{time}}</p>
<hr>
<img src="https://tse2-mm.cn.bing.net/th/id/OIP.TqnFY_-E89YGubN1BrAkMAHaHa?pid=Api&rs=1" alt="图片飞向了外太空">
</body>
</html>
3、http协议
1、http协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网服务器与本地浏览器之间传输超文本的传送协议
2、应用层的协议
3、http协议特性(*****):
- (1)基于tcp/ip协议之上的应用层协议
- (2)基于“请求-响应”模式 ——(HTTP协议规定,请求从客户端发出,最后服务器响应 该请求并返回。就是说,服务器端在没有接收到请求之前不会发送响应)
- (3)无状态保存 ——(HTTP协议自身不对请求和响应之间的通信状态进行保存,也就是说在HTTP这个级别,协议对于发送过的请求或者响应都不做持久化处理)
- (4)无连接 —— (限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接;节省传输时间)
4、请求协议(浏览器发出来的)
请求格式:
三部分:请求首行,请求头,请求体
# GET请求:
'''
# 请求首行(以第一个\r\n\区分的)
# 请求方式:GET 请求地址:/cc/aaa/bbb 协议:http 版本:1.1版本
GET /cc/aaa/bbb HTTP/1.1\r\n
# 请求头(key:value形式)
Host: 192.168.11.211:8080\r\n
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n\r\n'
# \r\n\r\n
# (下面的是请求体的内容)
'''
#POST请求:
'''
# 请求首行
POST /?name=lqz&age=18 HTTP/1.1\r\n
# 请求头
Host: 127.0.0.1:8008\r\n
Connection: keep-alive\r\n
Content-Length: 21\r\n
Cache-Control: max-age=0\r\n
Origin: http://127.0.0.1:8008\r\n
Upgrade-Insecure-Requests: 1\r\n
Content-Type: application/x-www-form-urlencoded\r\n
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Referer: http://127.0.0.1:8008/?name=lqz&age=18\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
Cookie: csrftoken=7xx6BxQDJ6KB0PM7qS8uTA892ACtooNbnnF4LDwlYk1Y7S7nTS81FBqwruizHsxF\r\n\r\n
# 请求体
name=lqz&password=123'
'''
请求方式:get与post请求
- GET提交的数据会放在URL后面,以?分割URL和传输数据,参数之间以&连接,如EditBook?name=test1&id=123456
- POST方法是把提交的数据放在HTTP包的请求体中
- GET提交的数据大小有限制(因为浏览器对url的长度有限制),而POST方法提交的数据没有限制
- GET与POST请求在服务端获取请求数据的方式不同
5、响应协议
响应格式
'''
# 响应首行 响应协议和版本:HTTP/1.1 响应的状态码和标志:200 ok
HTTP/1.1 200 ok \r\n
#响应头(key:value形式)
key:value
key:value
\r\n\r\n
#响应体:在浏览器里看到的东西(浏览器能把下面的html渲染成好看的样子)
<!DOCTYPE html>
<html lang="en">
<h1>hello</h1>
</html>
'''
6、响应状态码
状态码的值,是当客户端向服务器端发送请求时,返回的请求结果
借助状态码,可以用户可以知道服务器端是正常处理了请求,还是出现了问题。
状态码如200 ok,以3位数字和原因组成,第一位数字指定了响应类别,有5种。
四、URL简介
统一资源定位符,是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
互联网上的每个资源都有一个唯一的URL,它包含的信息指出文件的位置 以及浏览器应该怎么去处理它
- 格式:
协议名称://IP:端口号(默认是80)/路径?name=cc&sex=male
# ?之前的是请求路径, ?之后的是请求数据部分
#示例:
http://127.0.0.1:8080/order.html
ftp://xxx
五、web框架
web框架是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。
大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。
web框架已将实现了很多功能,开发人员使用框架提供的方法并完成自己的业务逻辑就能快速的开发web应用了。
浏览器和服务器之前是基于HTTP协议进行通信的,也可说web框架就是在socket通信的代码基础上扩展出来的,有很多简单方便实用的方法,大大提高了开发的效率
1、wsgiref模块
最简单的web应用是把HTML用文件保存好,用一个现成的HTTP服务器软件,接受用户请求,从文件中读取HTML,返回
底层代码由专门的服务器软件实现,我们用python专注于生成HTML文档,因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口协议来实现这样的服务器软件,让我们专心用Python编写Web业务。这个接口就是WSGI:Web Server Gateway Interface。而wsgiref模块就是python基于wsgi协议开发的服务模块。
基于wsgiref写一个web框架
1、socket自己写的,借助于一个模块,已经实现了socket
2、wsgiref:Django默认使用的
3、在web框架上继续开发
- 路径都去urls.py中写
- 路径匹配以后执行的函数,都放在views.py中
- 数据库相关操作,都在models.py中
① models.py
from wsgiref.simple_server import make_server
def server(environ, start_response): # 必须传两个参数
# environ:是一个字典,http拆解出字典,请求方式、请求地址、请求头
# start_response:响应对象,响应状态码,响应头放到里面
start_response("200 ok", [('Content -Type', 'text/html')])
if environ.get('PATH_INFO') == '/index': # 请求地址
data = '我是index页面'.encode('utf-8')
elif environ.get('PATH_INFO') == '/login':
data = '我是login页面'.encode('utf-8')
else:
data = b'<h1>Hello, web!</h1>'
return [data]
if __name__ == '__main__':
# app是可调用对象,可以加括号执行(函数内存地址)
myserver = make_server('127.0.0.1', 8081, server) # 只要客户端发送一次请求,就会调用server()
myserver.serve_forever() # 服务起来了,就相当于用listen一直监听8081端口
login.html 和 index.py文件省略
六、Django与其他web框架的区别
# 1、python中主流的web框架:
Django、flask、tornado(性能高)、sanic、fastapi...
web框架 | socket | 路由的映射关系 | 模板渲染 |
---|---|---|---|
自己写的web框架 | 使用的第三方:wsgiref | 自己写的 | 自己写的 |
Django | 使用的第三方:wsgiref | 自己写的 | 自己写的 |
flask | 用了第三方 | 自己写的 | 用的第三方 |
tornado | 自己写 | 自己写的 | 自己写的 |