【Flask】搭建服務過程筆記

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_imgclient_get_img在成功通信後保存對方發送的圖片
在這裏插入圖片描述

結果爲
在這裏插入圖片描述在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章