一:WEB应用
什么是WEB应用?
用浏览器访问的应用程序
优点:
- 不需要客户端,只需要一个浏览器
- 直接在服务端更新,客户端感受不到
- 耗费用户的硬盘空间少
- 跨平台性强,直接用浏览器就可以访问
缺点:
- 强调浏览器的适用性(不同的浏览器,样式不同)
- 用户的数据都保存在软件厂商那边
二:BS、CS架构
BS:Browser-Server(浏览器-服务端)
CS:Client-Server(客户端-服务端)
BS的本质还是CS
三:手写一个WEB应用
客户端是浏览器,服务端自己写(Python)
演化过程
1.最初的版本 - 客户端与服务端
服务端.py
import socket
s = socket.socket()
s.bind(('127.0.0.1', 8080))
s.listen(5)
conn, addr = s.accept()
data = conn.recv(1024)
conn.send(b'Hello')
print(data.decode('UTF-8'))
conn.close()
s.close()
客户端.py
import socket
client = socket.socket()
client.connect(('127.0.0.1', 8080))
client.send('Hello'.encode('UTF-8'))
data = client.recv(1024)
print(data.decode('UTF-8'))
client.close()
2.浏览器版本1 - 接收浏览器发送的数据
服务端.py
import socket
s = socket.socket()
s.bind(('127.0.0.1', 8080))
s.listen()
conn, addr = s.accept()
data = conn.recv(1024)
conn.send(b'Hello')
print(data.decode('UTF-8'))
conn.close()
s.close()
浏览器 输入IP地址和端口号
127.0.0.1:8080
浏览器发起请求 - 此处可以看出请求里面的所有内容
浏览器的页面 - 无法显示服务器端发来的内容
3.浏览器版本2 - 发送数据到浏览器
服务端.py
import socket
s = socket.socket()
s.bind(('127.0.0.1', 8080))
s.listen(5)
while True:
conn, addr = s.accept()
print('=======>', addr)
data = conn.recv(1024)
print(data.decode('UTF-8'))
conn.send('HTTP/1.1 200 OK
Hello'.encode('UTF-8')) # 按照HTTP协议特定的格式传输数据
conn.close()
s.close()
HTTP的传输格式
HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
k1:v1
k2:v2
k3:v3
Hello
浏览器页面 - 可以显示服务端发来的内容
4.浏览器版本3 - 发送更多格式的数据到浏览器
服务端.py
import socket
s = socket.socket()
s.bind(('127.0.0.1', 8080))
s.listen(5)
while True:
conn, addr = s.accept()
print('=======>', addr)
data = conn.recv(1024)
print(data.decode('UTF-8'))
conn.send('HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
'.encode('UTF-8'))
with open('index.html', mode='rb') as f:
for line in f:
conn.send(line)
conn.close()
s.close()
index.html
- 将要发送的内容放进一个文件中
<h1>Hello World</h1>
<p style="color:rgba(255,104,104,0.7);">你好呀!</p>
浏览器页面 - 可以显示服务端发送的内容,并且可以显示样式
5.浏览器版本4 - 直接打开html
文件
将上面的content.txt
重命名为content.html
,然后直接用浏览器打开
动态页面 和 静态页面
静态页面:
静态的HTML,内容不会改变,每次访问 看到的数据都一样
动态页面:
页面的数据会发生变化,每次访问 看到的可能都不一样(数据来源:数据库)
实现一个动态页面:
# index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>{{time}}</h2>
</body>
</html>
import socket
s = socket.socket()
s.bind(('127.0.0.1', 8080))
s.listen(5)
while True:
conn, addr = s.accept()
print('=======>', addr)
data = conn.recv(1024)
print(data.decode('UTF-8'))
import time
ctime = time.time() # 可能是数据库里面查询出来的
with open('index.html', 'r', encoding='UTF-8') as f:
data = f.read().replace('{{time}}', str(ctime))
response = 'HTTP/1.1 200 OK
%s' % data
conn.send(response.encode('UTF-8'))
conn.close()
四:HTTP协议
HTTP:超文本传输协议
1.请求协议
三部分:请求首行、请求头、请求体
2.响应协议
三部分:响应首行、响应头、响应体
3.HTTP协议的特性
① 基于TCP/IP协议之上的应用层协议
② 基于:请求 - 响应 模式
③ 无保存状态
4.响应状态码
状态码 | 释义 |
---|---|
1xx | 接收到请求,正在处理(用户一般看不到) |
2xx | 请求成功(200) |
3xx | 重定向(301 302)访问一个地址,跳转到另一个地址 |
4xx | 客户端出错(404) |
5xx | 服务端出错(502) |
5.URL - 统一资源定位符
① 什么是URI?
URI(Uniform Resource Identifiers),HTTP使用URI来传输数据和建立连接。
② 什么是URL?
URL(Uniform Resource Locator),中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。
URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息。
③ URL的组成部分
以下面这个URL为例,介绍下普通URL的各部分组成:
http://www.xuexianqi.top:80/archives/286.html?name=root&pwd=123#top1
部分 | 参数 | 作用 | 是否必须 |
---|---|---|---|
协议 | http:// |
代表网页使用的是HTTP协议。 在Internet中可以使用多种协议,如HTTP,FTP等等 |
是 但是浏览器会自动补全 |
域名 | www.xuexianqi/top |
解析到真实的IP地址 也可以直接填写IP地址 |
是 |
端口号 | 80 |
跳转到对应的端口号的应用程序http 默认端口为80 https 默认端口为442 |
否 |
虚拟目录 | archives |
虚拟目录部分,一般用于分类 | 否 |
文件名 | 286.html |
读取域虚拟目录下的某一个文件 | 否 |
参数 | ?name=root&pwd=123 |
携带搜索和查询的内容 参数可以用多个 & 连接 |
否 |
锚点 | #top1 |
用于定位到页面中的某一个部分 | 否 |
五:WEB框架
web框架就是在三
中的十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率
有一些底层代码,别人已经写好了。我们只需要在这些基础上,继续开发。
- urls.py - 路由:路径和对应函数的映射关系
- views.py - 视图函数:一堆函数
- models.py - 数据库操作相关
六:基于wsgiref
写1个WEB框架
socket:自己写,借助socket模块,已实现了socket
wsgiref:django默认使用的
在web框架上继续开发
以后路径都去urls.py中写
路径匹配以后执行的函数,都放在views.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 Page'.encode('utf-8')
elif environ.get('PATH_INFO') == '/login':
data = 'Login Page'.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() # 服务就起来了,相当于之前写的socket一直监听8081端口
七:Django介绍
Django
框架是PythonWeb
三大主流框架之一,以其功能强大全面而受到众多开发者追捧,现如今Django
已经更新到3
版本,但是并不推荐使用,更多建议使用1
版本。
Django版本 | Python版本 |
---|---|
1.11 | 2.7、3.4、3.5、3.6、3.7(在1.11.17中添加) |
2.0 | 3.4、3.5、3.6、3.7 |
2.1 | 3.5、3.6、3.7 |
2.2 | 3.5、3.6、3.7、3.8(在2.2.8中添加) |
3.0、3.1 | 3.6、3.7、3.8 |
八:Django和其他WEB框架的区别
python中主流web框架:django,flask,tornado(性能高),sanic,fastapi...
WEB框架 | Socket | 路由关系映射 | 模板渲染 |
---|---|---|---|
自制的web框架 | 第三方wsgiref | 自己写 | 自己写 |
Django | 第三方wsgiref | 自己写 | 自己写 |
Flask | 第三方 | 自己写 | 第三方 |
Tornado | 自己写 | 自己写 | 自己写 |
九:Django的安装与简单使用
1.Django的安装
方式1:命令行
在命令行中输入:pip3 install django==版本号
(不输入版本号,默认安装最新版3.X)
方式2:PyCharm
PyCharm右下角 - Interpreter Settings
- +号
- 搜索:django
- 选择版本号 - 点击:Install package
方式3:Terminal
PyCharm下方的Terminal输入:pip3 install django==版本号
(不输入版本号,默认安装最新版3.X)
2.安装完毕后,会生成一个:django-admin
的命令
该命令在Python解释器的Script
文件夹中,该文件夹在安装Python解释器的时候,已经添加到环境变量中了。
3.创建Django项目
方式1:命令行
django-admin startproject 项目名
方式:PyCharm
File
- New Project
- Django
4.创建app
方式1:命令行
![](https://gitee.com/xuexianqi/img/raw/master/img/image-20200927084102297.png)