python: 网络编程及fastapi快速搭建web服务器

  • Post author:
  • Post category:python


一.网络编程


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 socket

server = 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 socket

server = 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文件中有相应的请求



版权声明:本文为m0_70197592原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。