json中load和loads區別
如果返回Json先出status code500,return的時候用jsonify(data)
在客戶端如果想要讀返回的json的話,
respon = requests.request("POST", server_address, json=data)
res_json = json.loads(respon.text)
Python Flask Web 框架入門:https://blog.csdn.net/sinat_38682860/article/details/82354342
下面代碼功能爲:
客戶端發送一張圖片到服務端,服務端返回一個url及圖片
先運行server.py.py
,再運行client.py
server.py.py
內容
from flask import request, Flask, jsonify
import base64
import os
from download import download_image
app = Flask(__name__)
def decode_img(img_path):
# 輸入:本地圖片保存地址
# 輸出:圖片二進制base64base64格式
with open(img_path, mode='rb') as file:
img = file.read()
return base64.encodebytes(img).decode("utf-8")
def do_something(image_path, server_send_client_img='./static/server_send_client_img'):
# 下面爲測試本地服務的代碼
url = 'http://wx4.sinaimg.cn/large/006CXrEjly1gdj8q4gbrtj30hs0hsabc.jpg'
data = {}
img_path = os.path.join(server_send_client_img, os.path.basename(url))
download_image(url, img_path)
img_base64 = decode_img(img_path)
data['url'], data['img_base64'] = url, img_base64
return data
@app.route("/", methods=['POST'])
def do_something_server(server_get_client_img='./static/server_get_client_img'):
os.makedirs(server_get_client_img, exist_ok=True)
post_data = request.json
if post_data:
image_data = base64.b64decode(post_data["image_base64"])
image_path = post_data['image_path']
image_path = os.path.join(server_get_client_img, os.path.basename(image_path))
with open(image_path, 'wb') as file:
file.write(image_data)
print('【服務端】接收到圖片,已保存至{}'.format(image_path))
data = do_something(image_path)
print('【服務端】發送返回圖到客戶端')
return jsonify(data)
else:
return 'fail'
if __name__ == "__main__":
app.run("127.0.0.1", port=5000)
client.py
內容
import json
import base64
import requests
import os
def decode_img(img_path):
# 輸入:本地圖片保存地址
# 輸出:圖片二進制base64base64格式
with open(img_path, mode='rb') as file:
img = file.read()
return base64.encodebytes(img).decode("utf-8")
def write_img(res_json, client_get_img='./static/client_get_img'):
# 輸入:圖片二進制base64base64格式
# 輸出:圖片保存到本地
image_data = base64.b64decode(res_json['img_base64'])
image_path = os.path.join(client_get_img, os.path.basename(res_json['url']))
with open(image_path, 'wb') as file:
file.write(image_data)
print('【客戶端】已保存返回的圖片至: {}'.format(image_path))
def deal_with_respoon(respon):
# 輸入:服務端的返回
# 輸出:服務端傳來的Url、圖片二進制base64base64格式(圖片保存到本地)
res_json = json.loads(respon.text)
print('【客戶端】已發送圖片 {} 至 {}'.format(img_path, server_address))
print('【客戶端】已接收到返回圖片的url: {}'.format(res_json['url']))
write_img(res_json)
def client_request(server_address, img_path):
# 輸入:服務端地址,本地上傳的圖片地址
# 輸出:服務端傳來的Url、圖片二進制base64base64格式(圖片保存到本地)
data = {}
data['image_base64'] = decode_img(img_path)
data['image_path'] = img_path
respon = requests.request("POST", server_address, json=data)
deal_with_respoon(respon)
if __name__ == '__main__':
img_path = r'.\static\client_send_img\1.jpg'
server_address = "http://127.0.0.1:5000"
client_request(server_address, img_path)
download.py
import urllib.request
import os
def download_image(url, download_path, again=0):
img_name = download_path
if os.path.exists(img_name):
return img_name, True
try:
urllib.request.urlretrieve(url, filename=img_name)
return img_name, True
except:
if again == 5:
print('Error Download:', url)
return img_name, False
else:
print('Download again:', url)
return img_name, download_image(url, download_path=download_path ,again=again + 1)
文件目錄如下:
上面三個py文件是自己寫的代碼,其他的都是新建flask時自帶的
static下的四個文件夾也是自己新建的,
client_send_img
文件下下需要提前放好需要發送的圖片
server_send_client_img
中的圖片由server.py.py
中的url下載的
server_get_client_img
和client_get_img
在成功通信後保存對方發送的圖片
結果爲