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()