python: 网络编程及fastapi快速搭建web服务器
一.网络编程
1.网络编程三要素
ip地址、端口、TCP协议
ip地址
ip地址作用: 根据ip地址能够找到网络中的具体设备(电脑,打印机)
ip地址概念: ip地址是网络设备的唯一标识
ip地址分类: ipv4 和 ipv6(号称世界上每一粒沙子都能分配到ipv6地址)
ipv6用八个四位十六进制数表示地址, 一个四位十六进制数可以表示65536个十进制数, ipv6地址一共有65535的8次方个, 即3.40*10的38次方个.
查看网络状态: ping ip地址/域名
域名: 可以理解成ip地址的别名
查看本机ip地址: win->ipconfig mac->ifconfig
常用本机地址: localhost->127.0.0.1
端口(数据传输的通道)
端口号作用: 根据端口号能够找到网络设备上的程序端口
端口作用: 根据端口能够找到网络设备上的具体某个程序
端口号概念: 用于区分和管理端口的编号
端口概念: 端口是数据传输的通道(数据的必经之路)
端口号范围: 0-65535
端口号个数: 65536个
知名端口号: 0-1023
动态端口号: 1024-65535
协议(规定了数据传输的规则)
TCP协议: 传输控制协议
TCP协议特点: 面向连接,可靠,基于字节流传输
TCP面向连接步骤: 建立连接,传输数据,关闭连接
TCP可靠性: 发送应答机制,超时重传,错误校验,流量控制和阻塞管理
2.socket套接字
socket单词: 中文意思是插座
socket套接字: 网络多个进程中数据传输的工具(网上传送输入输出的装置)
进程概念: 运行中的程序
3.网络通信流程
1.根据ip地址找到网络设备(电脑,打印机)
2.根据端口号找到对应端口
3.根据端口找到对应程序
4.端口传输需要遵循协议规则
5.socket把数据从一个进程传送到另一个进程中
4.tcp开发服务器
TCP服务器开发固定7步:
1.创建socket服务器对象
2.绑定服务器信息(ip地址和端口号)
3.设置监听
4.等待客户端连接,直到连接成功为止
5.接收数据
6.发送数据
7.关闭socket服务器对象8.设置端口复用(若出现端口不能重复使用, 就设置端口复用)
注: 先运行前7步, 若出现第8步的情况再设置第8步, 第8步在第2步绑定服务器地址和端口号前设置.
# 1. 创建socket服务器对象(买手机) import socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # AF_INET代表ipv4,SOCK_STREAM代表tcp协议# 8.设置端口复用(如果出现端口不能重复使用,就设置端口复用) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 2. 绑定服务器地址和端口号(手机绑定卡,激活手机号) server_addr = ('', 8081) server.bind(server_addr) # 参数是服务器地址# 3. 设置监听(开机) server.listen(128) # 参数是最大连接数# 4. 等着客户端连接,直到接通为止(等着接电话) new_server, client_addr = server.accept() # 注意: 返回值是元组,拆包:新的socket对象和客户端地址和端口号信息 print(f'{client_addr}客户端已连接')# 5. 从新的socket对象中接收客户端数据(听对方说什么) 注意: 接收的是二进制数据 client_data = new_server.recv(1024) # 参数是接收的数据长度 返回值是客户端数据 print(f'客户端发来数据:{client_data.decode("gbk")}') # 二进制->字符串: decode(编码格式)# 6. 给客户端发送数据(给对方回复) 注意: 发送也需要编码成二进制数据 new_server.send('我是服务器binzi'.encode("gbk")) # 字符串->二进制: encode(编码格式)# 7. 关闭socket服务器对象(挂电话) new_server.close() server.close()
二.web服务器
1.http协议
http协议作用: 规定了浏览器和web服务器之间的通信格式
html概念: 超文本标记语言
http协议概念: 超文本传输协议
注意: http协议是基于TCP协议的(传输数据需要面向连接)
2.URL
URL(Uniform Resoure Locator): 统一资源定位符
举例->url: http://www.itheima.com/index.com?name=binzi&pwd=123456
协议部分: http://
域名部分: www.itheima.com
资源路径部分: /index.com
查询参数部分[可选]: ?name=binzi&pwd=123456
get方式: 有查询参数部分, 查询参数是在资源路径的?后拼接
post方式: 没有查询参数部分, 查询参数是放到了请求体里
3.开发者模式
如何进入开发者模式?
Windows和Linux平台按F12调出开发者工具
mac OS选择 视图 -> 开发者 -> 开发者工具或者直接使用 alt+command+i 这个快捷键
还有一个多平台通用的操作就是在网页右击选择检查。开发者工具的标签选项说明:
元素(Elements) :用于查看或修改HTML标签
控制台(Console):执行js代码
源代码(Sources):查看静态资源文件,断点调试JS代码
网络(Network) :查看http协议的通信过程开发者工具的Headers选项总共有三部分组成:
General: 主要信息
Response Headers: 响应头
Request Headers: 请求头
Response选项是查看响应体信息的
4,请求报文
请求报文: 请求方式不同,对应的报文结构不同
注意:每行末位默认有一个\r\n
get方式请求报文: 请求行 请求头 请求空行
post方式请求报文: 请求行 请求头 请求空行 请求体
5.响应报文
响应报文: 响应行 响应头 响应空行 响应体
具体响应格式:
响应行: HTTP/1.1 200 OK
响应头: Server: binzi
响应空行: \r\n
响应体: 页面注意:每行末位默认有一个\r\n
常见状态码:
2xx: 访问成功 常见的是200
3xx: 重定向 常见的是301
4xx: 客户端错误 常见的是404
5xx: 服务器错误 常见的是500
6.web服务器返回一句话
# 1. 创建socket服务器对象(买手机)
import socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # AF_INET代表ipv4,SOCK_STREAM代表tcp协议# 2. 绑定服务器地址和端口号(手机绑定卡,激活手机号)
server_addr = ('', 8084)
server.bind(server_addr) # 参数是服务器地址
# 3. 设置监听(开机)
server.listen(128) # 参数是最大连接数
# 4. 等着客户端连接,直到接通为止(等着接电话)
new_server, client_addr = server.accept() # 注意: 返回值是元组,拆包:新的socket对象和客户端地址和端口号信息
print(f'{client_addr}客户端已连接')
# 5. 从新的socket对象中接收客户端数据(听对方说什么) 注意: 接收的是二进制数据
client_data = new_server.recv(1024) # 参数是接收的数据长度 返回值是客户端数据
print(f'{client_data}')# [转换成响应报文]6. 给客户端发送数据(给对方回复) 注意: 发送也需要编码成二进制数据
res_line = 'HTTP/1.1 200 ol\r\n'
res_head = 'Server: binzi\r\n'
res_null = '\r\n'
res_body = '我是服务器~'
res_all = res_line + res_head + res_null + res_body
new_server.send(res_all.encode('gbk')) # 字符串->二进制: encode(编码格式)# 7. 关闭socket服务器对象(挂电话)
new_server.close()
server.close()
7.web服务器返回一个页面
# 1. 创建socket服务器对象(买手机)
import socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # AF_INET代表ipv4,SOCK_STREAM代表tcp协议# 2. 绑定服务器地址和端口号(手机绑定卡,激活手机号)
server_addr = ('', 8084)
server.bind(server_addr) # 参数是服务器地址
# 3. 设置监听(开机)
server.listen(128) # 参数是最大连接数
# 4. 等着客户端连接,直到接通为止(等着接电话)
new_server, client_addr = server.accept() # 注意: 返回值是元组,拆包:新的socket对象和客户端地址和端口号信息
print(f'{client_addr}客户端已连接')
# 5. 从新的socket对象中接收客户端数据(听对方说什么) 注意: 接收的是二进制数据
client_data = new_server.recv(1024) # 参数是接收的数据长度 返回值是客户端数据
print(f'{client_data}')# [转换成响应报文]6. 给客户端发送数据(给对方回复) 注意: 发送也需要编码成二进制数据
res_line = 'HTTP/1.1 200 ol\r\n'
res_head = 'Server: binzi\r\n'
res_null = '\r\n'# with open方式自动关闭文件对象
with open('index.html','rb') as f:res_body = f.read() # 读出来是二进制res_all = res_line + res_head + res_null
new_server.send(res_all.encode() + res_body) # 字符串->二进制: encode(编码格式)# 7. 关闭socket服务器对象(挂电话)
new_server.close()
server.close()
三.fastapi框架
FastAPI简介: 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。
FastAPI 框架关键特性: 高性能,易于学习,高效编码,生产可用
uvicorn: 异步服务器,用于配合fastapi框架一起 快速 搭建web服务器
安装
命令1: pip install fastapi
命令2: pip install uvicor
跳转页面
# 1.导包(注意: 自己创建的文件名不要叫fastapi)
from fastapi import FastAPI
from fastapi import Response
import uvicorn# 2.创建fastapi对象
app = FastAPI()# 3.fastapi处理web数据
# 访问url: http://127.0.0.1:8086/index.html
@app.get('/index.html') # 参数是资源路径
def show():with open('index.html', 'rb') as f:res_body = f.read() # 注意:读出来已经是二进制return Response(res_body)# 4.启动服务器
uvicorn.run(app, host='127.0.0.1', port=8086)
加载图片
# fastapi: 快速,高效,高性能,生产可用的最快python版本web框架
# 1.导包
from fastapi import FastAPI
from fastapi import Response
import uvicorn# 2.创建对象
api = FastAPI()# 3.处理web数据 举例: 网址url: http://127.0.0.1:8081/
@api.get('/') # 自动跳转首页
def show():with open('index.html', 'rb') as f:res_body = f.read()return Response(res_body)# 注意: 如果跳转的页面包含图片,浏览器会自动发送请求:http://127.0.0.1:8081/picture.jpg
@api.get('/picture.jpg') # 自动加载图片
def show():# 自动跳转首页with open('picture.jpg', 'rb') as f:res_body = f.read()return Response(res_body)# 4.启动服务器
uvicorn.run(api, host='127.0.0.1', port=8081)
加载视频
# fastapi: 快速, 高效, 高性能, 生产可用的最快的python版本web框架
# 1.导包
from fastapi import FastAPI, Response
import uvicorn# 2.创建对象
app = FastAPI()# 3.处理web数据
@app.get('/') # 参数可以理解成是url的资源路径部分
def show():with open('F:\\00.heima\\就业班\\day04_220904\\课堂代码\\123\\index.html', 'rb') as fp:res_body = fp.read()res = Response(res_body)return res@app.get('/iu_03.jpg') # 参数可以理解成是url的资源路径部分
def show():with open('F:\\00.heima\\就业班\\day04_220904\\课堂代码\\123\\iu_03.jpg', 'rb') as fp:res_body = fp.read()res = Response(res_body)return res@app.get('/HD.mp4') # 参数可以理解成是url的资源路径部分
def show():with open('F:\\00.heima\\就业班\\day04_220904\\课堂代码\\123\\HD.mp4', 'rb') as fp:res_body = fp.read()res = Response(res_body)return res# 4.启动服务器
uvicorn.run(app, host='127.0.0.1', port=9092)
注: 要实现图片, 视频加载的功能, 需要在html文件中有相应的请求
python: 网络编程及fastapi快速搭建web服务器相关推荐
- 利用 python 的 http.server 包快速搭建web server 服务
文章目录 利用 python 的 http.server 包快速搭建web server 服务 一.背景说明 二.一行代码解决搭建轻量级 web server 三.其外其他的配置可以参考下列网址 利用 ...
- Kali与编程:Winserver 2019 搭建web服务器7-05
1.实验说明:Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以处理浏览器等Web客户端的请求并返回相应响应,也可以放置网站文件,让全世界浏览:可以放置数据文件,让全世界下载. ...
- 深入理解计算机系统:网络编程 下 一个简单的web服务器
编写一个web服务器的基础是熟悉套接字接口.笔者因为还没有对其进行实践,只对其有一些粗浅的了解.本文重点记录一个web服务的核心功能主要由哪几部分组成. 1. main函数 之前写到,从客户端到服务器 ...
- 0成本快速搭建web服务器
NATAPP工具使用 使用natapp内网穿透技术搭建服务器 利用serve本地电脑部署Web服务 使用natapp工具做内网穿透 使用natapp内网穿透技术搭建服务器 记录使用内网穿透技术搭建外网 ...
- 如何在Windows环境下快速搭建Web服务器并发布网页
1. 环境说明 本案例基于Windows Server 2012环境进行搭建,其他Windows系统可参考配置. 2. 配置实现 1)开启 Windows 下程序和功能,如下图所示(红框中所有功能): ...
- python网络编程(基础含实现简易服务器代码)
本文不涉及线程以及相关的死锁.互斥.共源等问题的解决 首先先搞清楚IP.端口号.TCP的概念: IP地址就是标识网络中设备的一个地址,IP 地址分为两类:IPv4 和 IPv6 查看IP地址的方法:L ...
- python flask 快速搭建 WEB 实战
python flask 快速搭建 WEB 实战 tags: flask 文章目录 python flask 快速搭建 WEB 实战 1. app.py配置首页 2. views.py配置首页 3. ...
- ☀️苏州程序大白用万字解析Python网络编程与Web编程☀️《❤️记得收藏❤️》
☀️苏州程序大白用万字解析Python网络编程☀️<❤️记得收藏❤️> 目录
- python 网络编程_Python网络编程(原书第2版)
Python网络编程(原书第2版) 作者:(美)埃里克·周(Eric Chou) 著 出版日期:2019年06月 文件大小:54.50M 支持设备: ¥68.00 适用客户端: 言商书局 iPad/i ...
最新文章
- docker常用命令详解
- matlab离散系统 响应,离散系统的频率响应和输出响应的matlab实现
- Binder 驱动详解(下)
- Vue实现访问百度音乐API实现播放音乐功能
- 以用户体验为导向的设计表现
- python中不属于整数类型_哪个选项不是Python语言的整数类型?
- 飞信SDK内容【转载】
- 睡眠音频分割及识别问题(五)--YAMNet进一步分析
- python分析工具有哪些_常用Python数据分析工具汇总
- 【英语学习】【WOTD】wherewithal 释义/词源/示例
- go语言struct各种定义和用法
- linux svn 客户端安装
- android自定义横向时间轴,Android自定义时间轴的实现过程
- 分享一个免杀的netcat.exe
- 在 Mac 上如何放大或缩小?
- Linux 命令行快捷键
- mysql可以用表情符号_让MySQL支持emoji表情符号存储
- 【python】自动统计考勤数据
- 《跟任何人都能聊得来》读书笔记
- 【转载】详解Android中接口回调、方法回调