Боке Сервер и Джанго - PullRequest
       38

Боке Сервер и Джанго

0 голосов
/ 04 сентября 2018

В конечном итоге я пытаюсь разместить интерактивные боке-сюжеты на веб-сайте. Я использую 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)
...