demo-request/main.py

96 lines
2.8 KiB
Python

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import asyncio
import uvicorn
import uuid
import time
import sdtcloudpubsub
import logging.handlers
import glob
import traceback
# Communication use grpc
import grpc
import grpc.aio
import utils.image_pb2 as pb2
import utils.image_pb2_grpc as pb2_grpc
###############################################
# Logger Setting #
###############################################
logger = logging.getLogger()
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
log_fileHandler = logging.handlers.RotatingFileHandler(
filename=f"./logs/log_request.log",
maxBytes=1024000,
backupCount=3,
mode='a')
log_fileHandler.setFormatter(formatter)
logger.addHandler(log_fileHandler)
###############################################
# MQTT Setting #
###############################################
sdtcloud = sdtcloudpubsub.sdtcloudpubsub()
sdtcloud.setClient(f"device-app-{uuid.uuid1()}") # parameter is client ID(string)
###############################################
# FastAPI instance #
###############################################
app = FastAPI()
###############################################
# grpc client #
###############################################
async def upload_image(stub, filename):
with open(filename, 'rb') as f:
image_data = f.read()
response = await stub.UploadImage(pb2.ImageRequest(filename=filename, image_data=image_data))
print(response.message)
print(f"Inference result: {response.inference_result}")
return response
async def run(image_path):
async with grpc.aio.insecure_channel('localhost:50051') as channel:
stub = pb2_grpc.ImageServiceStub(channel)
response = await upload_image(stub, image_path)
return response
class ImagePathRequest(BaseModel):
image_path: str = "./data/test_1.jpg"
# FastAPI endpoint
@app.post("/upload_image/")
async def upload_image_endpoint(request: ImagePathRequest):
start_time = time.time()
try:
response = await run(request.image_path)
logger.info('Successfully requested!')
end_time = time.time()
data = {
"processingTime": end_time - start_time
}
print(f"#### Topic: {sdtcloud.topic}")
print(f"#### DATA: {data}")
sdtcloud.pubReqMessage(data)
return {
"message": response.message,
"inference_result": response.inference_result
}
except Exception as e:
logger.error(traceback.format_exc())
raise HTTPException(status_code=500, detail="Internal Server Error")
if __name__ == '__main__':
uvicorn.run("main:app", host="0.0.0.0", port=8888, reload=True)