Как интегрировать Боке сервер ИНТЕРАКТИВНОСТЬ с Django? - PullRequest
0 голосов
/ 23 мая 2019

Я уже знаю, как отображать отдельные графики боке на Django. То, что я сейчас ищу, - это объяснение высокого уровня о том, как подключить интерактивный сервер Bokeh (пример, который я использую: https://demo.bokeh.org/weather) к моему проекту Django. Ключевое слово, которое нужно подчеркнуть, это интерактивный . Когда я использую выпадающие списки на моей странице Django, сервер Bokeh должен реагировать интерактивно, как обычно, когда я запускаю bokeh serve --show app.py, например.

Как вы можете видеть ниже, я уже добавил большую часть кода урока в мое представление django. Все отображается отлично, однако интерактивности не происходит - например, когда я выбираю просмотр данных Сиэтла, ничего не происходит - потому что сервер bokeh не активируется или что-то еще?

# all my imports up here...

def homepage(request):
    return render(request, 'pages/landing.html')

def alerts_dashboard(request):
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# THE FOLLOWING CODE FROM HERE ON DOWN IS PURE COPY-PASTED FROM 
# THE BOKEH DEMO LINK ABOVE

    STATISTICS = ['record_min_temp', 'actual_min_temp', 'average_min_temp', 'average_max_temp', 'actual_max_temp', 'record_max_temp']

    def get_dataset(src, name, distribution):
        df = src[src.airport == name].copy()
        del df['airport']
        df['date'] = pd.to_datetime(df.date)
        # timedelta here instead of pd.DateOffset to avoid pandas bug < 0.18 (Pandas issue #11925)
        df['left'] = df.date - datetime.timedelta(days=0.5)
        df['right'] = df.date + datetime.timedelta(days=0.5)
        df = df.set_index(['date'])
        df.sort_index(inplace=True)
        if distribution == 'Smoothed':
            window, order = 51, 3
            for key in STATISTICS:
                df[key] = savgol_filter(df[key], window, order)

        return ColumnDataSource(data=df)

    def make_plot(source, title):
        plot = figure(x_axis_type="datetime", plot_width=800, tools="", toolbar_location=None)
        plot.title.text = title

        plot.quad(top='record_max_temp', bottom='record_min_temp', left='left', right='right',
                  color=Blues4[2], source=source, legend="Record")
        plot.quad(top='average_max_temp', bottom='average_min_temp', left='left', right='right',
                  color=Blues4[1], source=source, legend="Average")
        plot.quad(top='actual_max_temp', bottom='actual_min_temp', left='left', right='right',
                  color=Blues4[0], alpha=0.5, line_color="black", source=source, legend="Actual")

        # fixed attributes
        plot.xaxis.axis_label = None
        plot.yaxis.axis_label = "Temperature (F)"
        plot.axis.axis_label_text_font_style = "bold"
        plot.x_range = DataRange1d(range_padding=0.0)
        plot.grid.grid_line_alpha = 0.3

        return plot

    def update_plot(attrname, old, new):
        city = city_select.value
        plot.title.text = "Weather data for " + cities[city]['title']

        src = get_dataset(df, cities[city]['airport'], distribution_select.value)
        source.data.update(src.data)

    city = 'Austin'
    distribution = 'Discrete'

    cities = {
        'Austin': {
            'airport': 'AUS',
            'title': 'Austin, TX',
        },
        'Boston': {
            'airport': 'BOS',
            'title': 'Boston, MA',
        },
        'Seattle': {
            'airport': 'SEA',
            'title': 'Seattle, WA',
        }
    }

    city_select = Select(value=city, title='City: ', options=sorted(cities.keys()))
    distribution_select = Select(value=distribution, title='Distribution: ', options=['Discrete', 'Smoothed'])

    df = pd.read_csv('2015_weather.csv')
    source = get_dataset(df, cities[city]['airport'], distribution)
    plot = make_plot(source, "Weather data for " + cities[city]['title'])

    city_select.on_change('value', update_plot)
    distribution_select.on_change('value', update_plot)

    controls = column(city_select, distribution_select)

    theLayout = column(controls, plot, sizing_mode='stretch_both')

    script, div = components(theLayout)

    return render_to_response('pages/alerts_dashboard.html', {'script':script, 'linePlot': div})

Basic .html

    <div class="container">

        <div class="section">

            {{ linePlot | safe }}

        </div>

    </div>

Я ушел

curdoc().add_root(row(plot, controls))
curdoc().title = "Weather"

конечно, я не думаю, что это мне поможет.

Я слышал о сокетах и ​​слушателях, но, честно говоря, понятия не имею, о чем они. Можете ли вы описать мне, как это должно работать, и если сокеты / слушатели - правильный путь, о котором, если так, я буду обучаться. Или я пропускаю простое исправление?

Спасибо!

...