Hamid Fsian
Hamid Fsian

Reputation: 33

how to send information(data) from a FastAPI server(client) to another FastAPI(model)

I am a newbie in RESTful API...

so I am trying to deploy two servers (client and model). The main idea is :

Currently, I am strugling with the client server part, how to do a post to another server ?


# Define a flask app
app = FastAPI()

app.mount("/static", StaticFiles(directory="static"), name="static")

templates = Jinja2Templates(directory="./templates")

origins = ["*"]
methods = ["*"]
headers = ["*"]


app.add_middleware(
    CORSMiddleware, 
    allow_origins = origins,
    allow_credentials = True,
    allow_methods = methods,
    allow_headers = headers    
)


@app.get('/', response_class=HTMLResponse)
def root(request: Request):
        return templates.TemplateResponse("index.html", {"request": request})
    #render_template('index.html')



#here the client will upload his image to the server
#and then encrypt it in the same button
@app.post('/encrypt', status_code=200)
async def upload_img(f: UploadFile = File(...)):

        ret = {}
        logger.debug(f)
        #base_path = "uploads"
        # filename = "predict.jpg"
        f.filename = "predict.jpg"
        base_path = os.path.dirname(__file__)
        file_path = os.path.join(base_path, 'uploads',secure_filename(f.filename))
        os.makedirs(base_path, exist_ok=True)
        try:
            with open(file_path, "wb") as buffer:
                shutil.copyfileobj(f.file, buffer)
        except Exception as e:
            print("Error: {}".format(str(e)))


        image_info = {"filename": f.filename,  "image": f}

        #preprocess image
        plain_input = load_input(f)
        #create a public context and drop sk
        ctx, sk = create_ctx()
        
        #encrypt 
        enc_input = prepare_input(ctx, plain_input)
        enc_input_serialize = enc_input.serialize()

        # la tu dois faire un post au serveur
        return  sk



class inference_param(BaseModel):
    context : bytes
    enc_input : bytes


@app.post("/data") #send data to the model server
async def send_data(data : inference_param):
    return data



Upvotes: 3

Views: 1372

Answers (1)

HTF
HTF

Reputation: 7260

Since your endpoint is asynchronous you can use the asynchronous HTTP library like aiohttp or httpx to make the request.

If you don't want your clients of the client server to wait until the image is uploaded you can also use Background Tasks.

Upvotes: 3

Related Questions