基本知识:使用Flask的request模块实现客户端和服务器端两台PC之间的传输通信。
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)
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编码的字符串。
具体步骤如下:
-
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()
的常见参数:
字符串:表示响应体的内容。
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()
的参数通常可以是字符串、字典或包含响应体、状态码、头部信息的元组