В конечном итоге я пытаюсь разместить интерактивные боке-сюжеты на веб-сайте. Я использую Ubuntu 18.04
nginx / 1.14.0, Django == 2.1, gunicorn == 19.9.0, Python 3.6.5, bokeh-0.13.0
Мне удалось увидеть локальный график с боке, и я был успешен без django, используя директивы на сайте nginx.conf ...
location /bkapp {
proxy_pass http://127.0.0.1:5100;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host:$server_port;
proxy_buffering off;
}
и:
bokeh serve bkapp.py --port 5100 --prefix=bkapp --allow-websocket-origin=www.website.com
... для связи с сервером bokeh по адресу www.website.com/bkapp в моем браузере (не локально). Мне не нужно было добавлять триггеры портов или виртуальные серверы для порта 5100 на моем маршрутизаторе.
!!!!!!!!!!!!!!!!!!!!
ОДНАКО, Я ХОЧУ ПОЛУЧИТЬ МАРШРУТ ЧЕРЕЗ ДжАНГО / ГУНИКОРН:
в настоящее время я получаю сообщение об ошибке сервера (500)
!!!!!!!!!!!!!!!!!!!!
Я думаю, что моя проблема заключается в маршрутизации / обмене данными после ввода запроса в views.py. Я думаю, что моя проблема здесь, и я настраивал код из
Внедрение интерактивного боке в представлениях Django .
views.py правильно настроен для ответа на типичные запросы, но не может подключиться / работать с локальным сервером Bokeh
Для подачи в интернет я использую команду:
bokeh serve perceptron.py --port 5100 --prefix=perceptron --allow-websocket-origin=localhost:5100
views.py:
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
session = pull_session(url="http://localhost:5100/")
script = autoload_server(model=None,
app_path="/bkapp",
url="http://localhost:5100/",
session_id = session.id)
return render(request, 'bkapp/index.html', {
'script': script})
bkapp / index.html:
{% extends 'home/base.html' %}
{% block content %}
<div >
<link href="https://cdn.pydata.org/bokeh/release/bokeh-0.13.0.min.css" rel="stylesheet" type="text/css">
<link href="https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.13.0.min.css" rel="stylesheet" type="text/css">
<link href="https://cdn.pydata.org/bokeh/release/bokeh-tables-0.13.0.min.css" rel="stylesheet" type="text/css">
<script src="https://cdn.pydata.org/bokeh/release/bokeh-0.13.0.min.js"></script>
<script src="https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.13.0.min.js"></script>
<script src="https://cdn.pydata.org/bokeh/release/bokeh-tables-0.13.0.min.js"></script>
{{ script | safe }}
</div>
{% endblock %}
nginx's website.conf:
upstream website_server {
server unix:/home/jeff/dev/run/gunicorn.sock fail_timeout=0;
}
server {
listen 80;
server_name website.com www.website.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name website.com www.website.com;
add_header Strict-Transport-Security "max-age=31536000";
ssl_certificate /etc/letsencrypt/live/website.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/website.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'XXX';
root /usr/share/nginx/html;
index index.html index.htm;
location /static/ {
alias /home/jeff/website/static/;
}
location /media/ {
expires -1;
alias /home/jeff/website/media/;
add_header Cache-Control "public";
}
client_max_body_size 4G;
access_log /home/jeff/website/logs/nginx-access.log;
error_log /home/jeff/website/logs/nginx-error.log;
location / {
proxy_pass http://127.0.0.1:5100;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
#proxy_set_header Host $http_host;
proxy_set_header Host $host:$server_port;
proxy_buffering off;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://website_server;
break;
}
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /home/jeff/website/static/;
}
}
и вот bkapp.py, который вы можете имитировать (скопировано из учебных пособий bokeh):
from random import random
from bokeh.layouts import column
from bokeh.models import Button
from bokeh.palettes import RdYlBu3
from bokeh.plotting import figure, curdoc
# create a plot and style its properties
p = figure(x_range=(0, 100), y_range=(0, 100), toolbar_location=None)
p.border_fill_color = 'black'
p.background_fill_color = 'black'
p.outline_line_color = None
p.grid.grid_line_color = None
# add a text renderer to our plot (no data yet)
r = p.text(x=[], y=[], text=[], text_color=[], text_font_size="20pt",
text_baseline="middle", text_align="center")
i = 0
ds = r.data_source
# create a callback that will add a number in a random location
def callback():
global i
# BEST PRACTICE --- update .data in one step with a new dict
new_data = dict()
new_data['x'] = ds.data['x'] + [random()*70 + 15]
new_data['y'] = ds.data['y'] + [random()*70 + 15]
new_data['text_color'] = ds.data['text_color'] + [RdYlBu3[i%3]]
new_data['text'] = ds.data['text'] + [str(i)]
ds.data = new_data
i = i + 1
# add a button widget and configure with the call back
button = Button(label="Press Me")
button.on_click(callback)
# put the button and plot in a layout and add to the document
curdoc().add_root(column(button, p))
ОБНОВЛЕНИЕ Вторник, 4 сентября 2018 года, 9:55 утра PDT:
Добавлены session = pull_session () и идентификатор сессии для скрипта в views.py,
теперь каждый звонок на сайт / bkapp вызывает:
Ошибка сервера Bokeh:
404 GET /ws?bokeh-protocol-version=1.0&bokeh-session-id=wBvizF5w1yUuFqsa55Ikm3zngMSpcauhG3IvtoICU4Sb (127.0.0.1) 1.66ms
ошибка Gunicorn:
File "/home/jeff/dev/lib/python3.6/site-packages/bokeh/client/session.py", line 343, in pull
raise IOError("Cannot pull session document because we failed to connect to the server (to start the server, try the 'bokeh serve' command)")
OSError: Cannot pull session document because we failed to connect to the server (to start the server, try the 'bokeh serve' command)