flask request实现两台PC之间文件传输通信

基本知识:使用Flask的request模块实现客户端和服务器端两台PC之间的传输通信。

客户端customer.py

python 复制代码
import requests
import time
import os

from src.tools.resource_tool import logger

url = "http://your_domain.com:8000/upload"

def upload_file(type, file1_path, file2_path):
    # 设置最大重试次数和每次重试间隔时间(秒)
    max_retries = 5  # 最大重试次数:5
    retry_interval = 5  # 重试间隔时间,单位:秒
    retries = 0


    while retries < max_retries:
        # try:
        with open(file1_path, 'rb' as file1_buffer:
            with open(file2_path, 'rb' as file2_buffer:
                file1_name = os.path.basename(file1_path)
                file2_name = os.path.basename(file2_path)
                data = {"type": type}
                files = {'file1': (file1_name , file1_buffer), "file2": (file2_name,                     file2_buffer)}

                print(f"发起request请求,传输{type}文件{files.keys()}")
                response = requests.post(url, data=data, files=files, verify=False)

                # 如果服务器返回成功(状态码200),则结束重试
                if response.status_code == 200:
                    print(f"Uploaded file1 and file2, return file3 successfully! "
                          f"response.status_code={response.status_code}")
                    # print(f"respnse.text = {response.text)}")
                    return response
                elif response.status_code == 400:
                    print(f"Failed to return file3! Server response: {response.text}; "
                          f"response.status_code={response.status_code}")
                else:
                    logger.error(f"Unexpected status code! Server response: {response.text}; response.status_code={response.status_code}")
        # except requests.RequestException as e:
        #     print(f"Error occurred: {e}. Retrying...")
        # print("=============================================")
        
        retries += 1
        time.sleep(retry_interval)

    print(f"Failed after {max_retries} attempts.")

if __name__ == "__main__":
    type = "typeA"
    file1_path = "./D:file1.xlsx"
    file2_path = "./D:file2.xlsx"
    upload_file(type, file1_path, file2_path)

服务器端client.py

python 复制代码
from flask import Flask, request, make_response
from werkzeug.serving import make_server
import os
from file1 import file1_process
from main import Main
import pythoncom
import base64

app = Flask(__name__)

# # 确保地址格式正确
# server_address = ('127.0.0.1', 5000)  # 本地绑定
# sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# sock.connect(server_address)


server = make_server(host='0.0.0.0', port=8000, app=app, threaded=True)
print("111")


@app.route('/upload', methods=['POST'])
def upload_file():
    print("进入upload_file")
    if 'file1' not in request.files or 'file2' not in request.files:
        return "No file in request", 400
    file1= request.files['file1']  # (file1_name, file1)
    file2 = request.files['file2']
    if file1.filename == '' or file2.filename == '':
        return 'No file name', 400
    json = request.form.to_dict()
    type= json["type"]
    print(f"客户端传来数据:file1:{file1}, file2:{file2}, json:{json}")
    print("---------------------------------------------")


    try:
        print("生成文件1结果中")
        file1_process_result = file1_process(type, file1)
        print(file1_process_result )
        print("---------------------------------------------")
    except:
        print("File1 process failed")
        return f"File1 process failed", 400


    try:
        print("生成文件2结果中")
        file2_process_result = file2_process(type, file2)
        print(file2_process_result )
        print("---------------------------------------------")
    except:
        print("File2 process failed")
        return f"File2 process failed", 400



    try:
        print("向客户端返回响应中")
        # with open(file1_path, 'rb') as f:
            # base64_data = base64.b64encode(f.read()).decode('utf-8')
        # with open(f'{xml_path}', 'r', encoding='utf-8') as f:
            # xml_data = f.read()

        response_data = {"file1": file1_process_result , "file2": file2_process_result}
        response = make_response(response_data)
        return response
    except Exception as e:
        print(f"return response failed, e = {e}")
        return f"return response failed", 400

base64.b64encode(byte_data).decode('utf-8')的作用

base64.b64encode(byte_data).decode('utf-8') 这段代码的作用是将字节数据(byte_data)编码为Base64格式,并将结果转化为UTF-8编码的字符串。

具体步骤如下:

  1. base64.b64encode(byte_data):将输入的字节数据(如图片、文件或其他二进制数据)编码成Base64格式。Base64是一种将二进制数据转化为ASCII字符串的编码方式,通常用于在网络上传输二进制数据。

  2. .decode('utf-8') :将Base64编码后的字节对象转化为UTF-8字符串。这是因为b64encode的结果是一个字节对象,而为了便于在文本中使用,需要将其转化为字符串形式。

这个过程常用于将文件内容(如图片或文档)转为字符串,以便通过HTTP协议等文本形式传输,或者保存到数据库中。

flask 中的make_response()函数的参数是

在 Flask 中,make_response() 函数的参数通常是视图函数返回的数据,可以是字符串、字典、元组等。make_response() 会将这些返回值包装成一个 Response 对象。最常见的用法是将字符串、字典或元组传给 make_response(),然后返回一个完整的 HTTP 响应。

具体来说,make_response() 的常见参数:

字符串:表示响应体的内容。

python 复制代码
from flask import make_response

@app.route('/')
def index():
    response = make_response("Hello, World!")
    return response

字典:如果返回一个字典,Flask 会将其转换为 JSON 格式的响应。

python 复制代码
from flask import make_response, jsonify

@app.route('/')
def index():
    data = {"message": "Hello, World!"}
    response = make_response(jsonify(data))
    return response

元组 :如果返回一个元组,通常是 (body, status_code, headers) 形式,make_response() 会处理并生成相应的响应对象。

python 复制代码
from flask import make_response

@app.route('/')
def index():
    response = make_response("Hello, World!", 200)
    response.headers['Custom-Header'] = 'SomeValue'
    return response

因此,make_response() 的参数通常可以是字符串、字典或包含响应体、状态码、头部信息的元组