flask request实现两台PC之间文件传输通信
基本知识:使用Flask的request模块实现客户端和服务器端两台PC之间的传输通信。
客户端customer.py:
import requests
import time
import osfrom src.tools.resource_tool import loggerurl = "http://your_domain.com:8000/upload"def upload_file(type, file1_path, file2_path):# 设置最大重试次数和每次重试间隔时间(秒)max_retries = 5 # 最大重试次数:5retry_interval = 5 # 重试间隔时间,单位:秒retries = 0while 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 responseelif 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 += 1time.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:
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 base64app = 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", 400file1= request.files['file1'] # (file1_name, file1)file2 = request.files['file2']if file1.filename == '' or file2.filename == '':return 'No file name', 400json = 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", 400try:print("生成文件2结果中")file2_process_result = file2_process(type, file2)print(file2_process_result )print("---------------------------------------------")except:print("File2 process failed")return f"File2 process failed", 400try: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 responseexcept 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编码的字符串。
具体步骤如下:
base64.b64encode(byte_data)
:将输入的字节数据(如图片、文件或其他二进制数据)编码成Base64格式。Base64是一种将二进制数据转化为ASCII字符串的编码方式,通常用于在网络上传输二进制数据。.decode('utf-8')
:将Base64编码后的字节对象转化为UTF-8字符串。这是因为b64encode
的结果是一个字节对象,而为了便于在文本中使用,需要将其转化为字符串形式。
这个过程常用于将文件内容(如图片或文档)转为字符串,以便通过HTTP协议等文本形式传输,或者保存到数据库中。
flask 中的make_response()函数的参数是
在 Flask 中,make_response()
函数的参数通常是视图函数返回的数据,可以是字符串、字典、元组等。make_response()
会将这些返回值包装成一个 Response
对象。最常见的用法是将字符串、字典或元组传给 make_response()
,然后返回一个完整的 HTTP 响应。
具体来说,make_response()
的常见参数:
字符串:表示响应体的内容。
from flask import make_response@app.route('/')
def index():response = make_response("Hello, World!")return response
字典:如果返回一个字典,Flask 会将其转换为 JSON 格式的响应。
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()
会处理并生成相应的响应对象。
from flask import make_response@app.route('/')
def index():response = make_response("Hello, World!", 200)response.headers['Custom-Header'] = 'SomeValue'return response
因此,make_response()
的参数通常可以是字符串、字典或包含响应体、状态码、头部信息的元组