Gradio_FastAPI / app.py
SilvioLima's picture
Update
e540e5d
raw
history blame
4.19 kB
import gradio as gr
from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn
import json
# --- Backend FastAPI (integrado no mesmo arquivo) ---
class Item(BaseModel):
name: str
description: str | None = None
price: float
# Criamos as funções do backend como funções Python normais
def root_message():
return {"message": "Hello World"}
def hello_message(name: str):
return {"message": f"Hello, {name.upper()}"}
def create_item_backend(name: str, description: str | None = None, price: float = 0.0):
item = Item(name=name, description=description, price=price)
return item
# --- Frontend Gradio ---
def get_root_message():
"""Chama a função do backend diretamente"""
try:
result = root_message()
return result.get("message", "Resposta inesperada da API.")
except Exception as e:
return f"Erro: {e}"
def get_hello_message(name):
"""Chama a função do backend diretamente"""
if not name:
return "Por favor, insira um nome."
try:
result = hello_message(name)
return result.get("message", "Resposta inesperada da API.")
except Exception as e:
return f"Erro: {e}"
def create_item(name, description, price):
"""Chama a função do backend diretamente"""
if not name or price is None:
return "Nome e Preço são campos obrigatórios."
try:
result = create_item_backend(name, description, price)
# Converte o objeto Item para dict
return {
"name": result.name,
"description": result.description,
"price": result.price
}
except Exception as e:
return f"Erro: {e}"
# --- Interface Gradio ---
with gr.Blocks(title="FastAPI + Gradio Integrado") as demo:
gr.Markdown("# 🚀 FastAPI + Gradio Integrado")
gr.Markdown("**Backend e Frontend em um único app!**")
with gr.Tab("🏠 Saudação Raiz"):
gr.Markdown("### Endpoint: GET /")
btn_root = gr.Button("Chamar API Raiz", variant="primary")
output_root = gr.Textbox(
label="Resposta da API",
placeholder="Clique no botão para ver a mensagem...",
lines=3
)
btn_root.click(fn=get_root_message, inputs=None, outputs=output_root)
with gr.Tab("👋 Saudação com Nome"):
gr.Markdown("### Endpoint: GET /hello/{name}")
with gr.Row():
with gr.Column():
input_name = gr.Textbox(
label="Digite seu nome",
placeholder="Seu nome aqui..."
)
btn_hello = gr.Button("Enviar Saudação", variant="primary")
with gr.Column():
output_hello = gr.Textbox(
label="Resposta da API",
lines=3
)
btn_hello.click(fn=get_hello_message, inputs=input_name, outputs=output_hello)
with gr.Tab("📦 Criar Item"):
gr.Markdown("### Endpoint: POST /items/")
with gr.Row():
with gr.Column():
input_item_name = gr.Textbox(
label="Nome do Item*",
placeholder="Nome do item..."
)
input_item_desc = gr.Textbox(
label="Descrição do Item (Opcional)",
placeholder="Descrição do item...",
lines=2
)
input_item_price = gr.Number(
label="Preço do Item*",
value=0.0
)
btn_create = gr.Button("Criar Item", variant="primary")
with gr.Column():
output_item = gr.JSON(
label="Item Criado (Resposta da API)"
)
btn_create.click(
fn=create_item,
inputs=[input_item_name, input_item_desc, input_item_price],
outputs=output_item
)
# Rodapé
gr.Markdown("---")
gr.Markdown("### 🔧 Desenvolvido com Gradio + FastAPI (Integrado)")
# --- Para funcionar no Hugging Face Spaces ---
if __name__ == "__main__":
demo.launch()