Spaces:
Runtime error
Runtime error
File size: 4,190 Bytes
a09c5e4 e540e5d a09c5e4 e540e5d a09c5e4 e540e5d a09c5e4 e540e5d a09c5e4 e540e5d a09c5e4 e540e5d a09c5e4 e540e5d a09c5e4 e540e5d a09c5e4 e540e5d a09c5e4 e540e5d a09c5e4 e540e5d a09c5e4 e540e5d a09c5e4 e540e5d a09c5e4 e540e5d a09c5e4 e540e5d a09c5e4 e540e5d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | 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() |