-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.py
70 lines (60 loc) · 1.99 KB
/
app.py
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
import logging
import requests
from shiny import App, render, ui, reactive
logging.basicConfig(
format="%(asctime)s - %(message)s",
level=logging.INFO
)
api_url = "http://127.0.0.1:8080/predict"
app_ui = ui.page_fluid(
ui.panel_title("Penguin Mass Predictor"),
ui.layout_sidebar(
ui.panel_sidebar(
[ui.input_slider("bill_length", "Bill Length (mm)", 30, 60, 45, step = 0.1),
ui.input_select("sex", "Sex", ["Male", "Female"]),
ui.input_select("species", "Species", ["Adelie", "Chinstrap", "Gentoo"]),
ui.input_action_button("predict", "Predict")]
),
ui.panel_main(
ui.h2("Penguin Parameters"),
ui.output_text_verbatim("vals_out"),
ui.h2("Predicted Penguin Mass (g)"),
ui.output_text("pred_out")
)
)
)
def server(input, output, session):
logging.info("App start")
@reactive.Calc
def vals():
d = [{
"bill_length_mm" : input.bill_length(),
"sex_male" : input.sex() == "Male",
"species_Adelie" : input.species() == "Adelie",
"species_Gentoo" : input.species() == "Gentoo",
"species_Chinstrap" : input.species() == "Chinstrap"
}]
return d
@reactive.Calc
@reactive.event(input.predict)
def pred():
logging.info("Request Made")
try:
r = requests.post(api_url, json = vals())
logging.info("Request Returned")
if r.status_code != 200:
logging.error(f"HTTP error {r.status_code} returned: {r.reason}")
else:
return r.json().get('predict')[0]
except requests.ConnectionError:
logging.error("Failed to connect to VetiverAPI. Have you run launch-api.py?")
return 0
@output
@render.text
def vals_out():
return f"{vals()}"
@output
@render.text
def pred_out():
return f"{round(pred())}"
app = App(app_ui, server)