Basic Example
This example demonstrates a simple Gradio application running on nanoHUB.
Jupyter Notebook Approach
Create a new Jupyter notebook on nanoHUB and add the following cells:
Cell 1: Load the extension and configure environment
%load_ext nanohubgradio
%set_gradio_env
Cell 2: Create and run the Gradio app
import os
import gradio as gr
import plotly.express as px
import pandas as pd
# Simple sample data
df = pd.DataFrame({
"x": list(range(1, 11)),
"y": [1, 4, 2, 8, 5, 7, 6, 9, 10, 3],
"group": ["A"] * 5 + ["B"] * 5
})
def update_plot(group):
"""Update plot based on selected group"""
dff = df if group == "ALL" else df[df["group"] == group]
fig = px.line(dff, x="x", y="y", markers=True, title=f"y vs x ({group})")
stats = f"Rows: {len(dff)} | y min: {dff['y'].min()} | y max: {dff['y'].max()}"
return fig, stats
# Create Gradio interface
with gr.Blocks(title="Basic Gradio App") as app:
gr.Markdown("# Basic Gradio App")
gr.Markdown("Pick a group to filter the chart:")
with gr.Row():
group = gr.Dropdown(
choices=["A", "B", "ALL"],
value="ALL",
label="Select Group",
interactive=True
)
with gr.Row():
plot = gr.Plot(label="Plot")
with gr.Row():
stats = gr.Markdown()
# Set up the callback
group.change(
fn=update_plot,
inputs=[group],
outputs=[plot, stats]
)
# Load initial plot
app.load(fn=update_plot, inputs=[group], outputs=[plot, stats])
if __name__ == "__main__":
# Use environment variables set by %set_gradio_env or start_gradio
host = os.getenv("GRADIO_HOST", "0.0.0.0")
port = int(os.getenv("GRADIO_PORT", "8001"))
root_path = os.getenv("GRADIO_ROOT_PATH", "")
app.launch(
server_name=host,
server_port=port,
root_path=root_path if root_path else None,
share=False,
quiet=True,
inline=False
)
Understanding the Code
Loading the extension:
%load_ext nanohubgradioregisters the magic commandSetting the environment:
%set_gradio_envconfigures all necessary environment variablesCreating the app: Standard Gradio Blocks application code
Running the server:
app.launch()starts the development server
The magic command automatically detects your nanoHUB session and configures:
The correct root path for the weber proxy
The host and port settings
Access URLs for external connection
Standalone Python File Approach
You can also create a standalone Python file and use the start_gradio command.
basic.py
import os
import gradio as gr
import plotly.express as px
import pandas as pd
# Simple sample data
df = pd.DataFrame({
"x": list(range(1, 11)),
"y": [1, 4, 2, 8, 5, 7, 6, 9, 10, 3],
"group": ["A"] * 5 + ["B"] * 5
})
def update_plot(group):
"""Update plot based on selected group"""
dff = df if group == "ALL" else df[df["group"] == group]
fig = px.line(dff, x="x", y="y", markers=True, title=f"y vs x ({group})")
stats = f"Rows: {len(dff)} | y min: {dff['y'].min()} | y max: {dff['y'].max()}"
return fig, stats
# Create Gradio interface
with gr.Blocks(title="Basic Gradio App") as app:
gr.Markdown("# Basic Gradio App")
gr.Markdown("Pick a group to filter the chart:")
with gr.Row():
group = gr.Dropdown(
choices=["A", "B", "ALL"],
value="ALL",
label="Select Group",
interactive=True
)
with gr.Row():
plot = gr.Plot(label="Plot")
with gr.Row():
stats = gr.Markdown()
# Set up the callback
group.change(
fn=update_plot,
inputs=[group],
outputs=[plot, stats]
)
# Load initial plot
app.load(fn=update_plot, inputs=[group], outputs=[plot, stats])
if __name__ == "__main__":
# Use environment variables set by %set_gradio_env or start_gradio
host = os.getenv("GRADIO_HOST", "0.0.0.0")
port = int(os.getenv("GRADIO_PORT", "8001"))
root_path = os.getenv("GRADIO_ROOT_PATH", "")
app.launch(
server_name=host,
server_port=port,
root_path=root_path if root_path else None,
share=False,
quiet=True,
inline=False
)
Running the App
Save this as basic.py and run it using:
start_gradio basic.py
This command will:
Start your Gradio application on port 8001
Configure the weber proxy on port 8000 for external access
Automatically inject a nanoHUB header bar with support and terminate buttons
Display the access URL in your terminal
Key Features
Automatic Header Injection: The
start_gradiotool automatically adds a header bar with nanoHUB brandingResponsive Layout: Uses Gradio’s Row/Column components for responsive design
Interactive Callbacks: Uses
group.change()to update the plot when the dropdown changes- Initial Load: Uses
app.load()to display the plot when the app first loads routes_pathname_prefix=os.getenv(“DASH_ROUTES_PATHNAME_PREFIX”), requests_pathname_prefix=os.getenv(“DASH_REQUESTS_PATHNAME_PREFIX”)
)
# Create a bar chart fig = px.bar(df, x=”Fruit”, y=”Amount”, color=”City”, barmode=”group”)
- app.layout = html.Div([
html.H1(“Fruit Sales Dashboard”, style={‘textAlign’: ‘center’}), html.Hr(), dcc.Graph(
id=’fruit-chart’, figure=fig
)
])
- if __name__ == “__main__”:
- app.run(
jupyter_server_url=os.environ.get(“DASH_BASE_PROXY”), host=os.environ.get(“DASH_HOST”, “0.0.0.0”), port=os.environ.get(“DASH_PORT”, “8001”),
)
- Initial Load: Uses
Then run from the terminal:
start_dash --app app.py
This approach:
Automatically configures the environment
Launches the wrwroxy reverse proxy
Injects a header bar with nanoHUB branding
Provides a “Submit a ticket” link for support
Includes a “Terminate Session” button