Как подключить приложение django к серверу bokeh? - PullRequest
0 голосов
/ 31 марта 2020

В настоящее время я пытаюсь использовать сервер bokeh для отображения некоторых интерактивных диаграмм боке в своем приложении django, но у меня возникают трудности при подключении через views.py.

Браузер возвращает ошибку OSE:

Cannot pull session document because we failed to connect to the server (to start the server, try the 'bokeh serve' command)

Сам сервер возвращает ошибку 404 для запроса:

200-03-31 08:17:09,179 404 GET /ws?bokeh-protocol-version=1.0&bokeh-session-id=ZhGn4XcmC1qDPYtF4SRPGPa1GzSgTqktqmvkIEGJke26 (127.0.0.1) 0.55ms

Мой сервер настроен следующим образом:

bokeh_server
|
|--main.py

main.py очень базовая c диаграмма боке

main.py

from bokeh.io import curdoc
from bokeh.layouts import column
from bokeh.plotting import figure
from bokeh.models.sources import ColumnDataSource

source = ColumnDataSource(dict(x=list(range(5)), y=list(range(5))))
p = figure(width=300, height=300, tools=[], toolbar_location=None, name="test")
p.line(x='x', y='y', source=source)
curdoc().add_root(column(p, sizing_mode='scale_width'))

Бег сервер (bokeh serve bokeh_server), а затем открытие https://localhost:5006 в браузере правильно отображает диаграмму (https://localhost:5006/bokeh_server)

Проблема возникает, когда я пытаюсь открыть ее из приложения django.

views.py

from django.shortcuts import render
from django.http import HttpResponse
from bokeh.client import pull_session

def testbserver(request):
    session = pull_session(url="http://localhost:5006/")
    script = server_session(model=None,
                            session_id=None,
                            url="http://localhost:5006/",
                            )
    return render(request, 'testserver.html', {'script':script})

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path('testbserver/', views.testbserver, name='testbserver'),
]

testserver. html

{% extends "base_generic.html" %}

{% block content %}
<div class="container-fluid">
  <div class="row">
    <div class="col-sm-12">
    {{script | safe }}
    </div>
  </div>
</div>
{% endblock %}

Я попытался запустить сервер с разрешенными веб-сокетами (bokeh serve bokeh_server/ --allow-websocket-origin="*" --log-level trace), но все равно получаю ту же ошибку.

Любые предложения по поводу других вещей с благодарностью принимаются!

1 Ответ

0 голосов
/ 31 марта 2020

Спасибо @Eugene Pakhomov за указатели, необходимые для обновления views.py до:

views.py


from django.shortcuts import render
from django.http import HttpResponse
from bokeh.client import pull_session
from bokeh.embed import server_session

def testbserver(request):
    session = pull_session(url="http://localhost:5006/bokeh_server")
    script = server_session(model=None,
                            session_id=session.id,
                            url="http://localhost:5006/bokeh_server",
                            )
    return render(request, 'testserver.html', {'script':script})

Также была проблема в тест-сервере. html - Я не делал сценарий безопасным:

testserver. html

{% extends "base_generic.html" %}

{% block content %}

<head>
<link href = "https://cdn.pydata.org./bokeh/release/bokeh-1.4.0.min.css" rel = "stylesheet" type = "text/css" >
<link href = "https://cdn.pydata.org./bokeh/release/bokeh-widgets-1.4.0.min.css" rel = "stylesheet" type = "text/css" >
<link href = "https://cdn.pydata.org./bokeh/release/bokeh-tables-1.4.0.min.css" rel = "stylesheet" type = "text/css" >

<script type = "text/javascript" src = "https://cdn.pydata.org./bokeh/release/bokeh-1.4.0.min.js"> </script>
<script type = "text/javascript" src = "https://cdn.pydata.org./bokeh/release/bokeh-widgets-1.4.0.min.js"> </script>
<script type = "text/javascript" src = "https://cdn.pydata.org./bokeh/release/bokeh-tables-1.4.0.min.js"> </script>

<h1>Test</h1>
{{script | safe}}
</head> 
<div style="margin-left:20px;margin-top:20px">

<body>
    {{div | safe}}
</body>

{% endblock %}
...