将Bokeh与Django Channels集成的实用工具
项目描述
bokeh-django
支持使用Django运行Bokeh应用
简介
Bokeh和Django都是可以独立使用来构建和托管Web应用的Web框架。它们各自都有其优势,而bokeh_django
包的目的就是将这两个框架集成,以便可以将它们的优势结合起来。
安装
pip install bokeh-django
配置
本文档假设您已经启动了一个Django项目。
bokeh-django
允许您在Django项目中定义路由(URL),这些路由将映射到Bokeh应用或嵌入到由Django渲染的模板中的Bokeh应用。然而,在定义路由之前,需要先完成几个配置步骤。
-
配置
INSTALLED_APPS
在
settings.py
文件中确保将channels
和bokeh_django
添加到INSTALLED_APPS
列表中INSTALLED_APPS = [ ..., 'channels', 'bokeh_django', ]
-
设置ASGI应用
默认情况下,Django项目将配置为使用WSGI应用,但
startproject
命令也应该创建了一个asgi.py
文件。在
settings.py
中,将WSGI_APPLICATION
设置改为ASGI_APPLICATION
,并相应地修改路径。它看起来应该像这样ASGI_APPLICATION = 'mysite.asgi.application'
接下来,修改
asgi.py
文件的内容,从bokeh_django
应用配置中获取URL模式。类似以下的内容将有效from channels.auth import AuthMiddlewareStack from channels.routing import ProtocolTypeRouter, URLRouter from django.apps import apps bokeh_app_config = apps.get_app_config('bokeh_django') application = ProtocolTypeRouter({ 'websocket': AuthMiddlewareStack(URLRouter(bokeh_app_config.routes.get_websocket_urlpatterns())), 'http': AuthMiddlewareStack(URLRouter(bokeh_app_config.routes.get_http_urlpatterns())), })
-
配置静态文件
Bokeh和Django都有多种配置服务静态资源的方法。本文档将描述几种可能的配置方法。
Bokeh的
resources
设置可以设置为几个值之一(例如server
、inline
、cdn
),默认为cdn
。如果此设置设置为inline
或cdn
,则Bokeh资源将独立于Django资源提供服务。然而,如果Bokeh的resources
设置设置为server
,则Bokeh资源将以与Django静态资源相同的方式由Django服务器提供服务,因此Django必须配置为能够找到Bokeh资源。要指定Bokeh的
resources
设置,请将以下内容添加到Django的settings.py
文件中from bokeh.settings import settings as bokeh_settings bokeh_settings.resources = 'server'
如果Bokeh的
resources
设置设置为server
,那么我们必须将Bokeh资源的位置添加到STATICFILES_DIRS
设置中from bokeh.settings import settings as bokeh_settings, bokehjsdir STATICFILES_DIRS = [ ..., bokehjsdir(), ]
Django可以通过使用
staticfiles
应用自动找到和收集静态文件,或者可以显式地将静态文件URL模式添加到urls.py
文件中的urlpatterns
列表中。要显式添加静态文件
urlpatterns
,请将以下内容添加到urls.py
文件中from django.contrib.staticfiles.urls import staticfiles_urlpatterns from bokeh_django import static_extensions urlpatterns = [ ..., *static_extensions(), *staticfiles_urlpatterns(), ]
请确保在
static_extensions
之前列出staticfiles_urlpatterns
。或者,您可以通过将
'django.contrib.staticfiles',
添加到INSTALLED_APPS
来配置staticfiles
应用。INSTALLED_APPS = [ ..., 'django.contrib.staticfiles', 'channels', 'bokeh_django', ]
接下来,将
bokeh_django.static.BokehExtensionFinder
添加到STATICFILES_FINDERS
设置中。默认的STATICFILES_FINDERS
有两个项。如果您通过将STATICFILES_FINDERS
设置添加到您的settings.py
文件来覆盖默认设置,那么请确保除了BokehExtensionFinder
之外,还要列出两个默认值STATICFILES_FINDERS = ( "django.contrib.staticfiles.finders.FileSystemFinder", "django.contrib.staticfiles.finders.AppDirectoriesFinder", 'bokeh_django.static.BokehExtensionFinder', )
定义路由
Bokeh应用通过路由或URL与Django集成。
在一个Django应用中,由ROOT_URLCONF
设置指定的文件(例如urls.py
)必须定义urlpatterns
,它是一个django.url.path
和/或django.url.re_path
对象的序列。当将Django应用与Bokeh集成时,urls.py
文件还必须定义bokeh_apps
作为一个bokeh_django
路由对象的序列。这应该使用bokeh_django.document
和/或bokeh_django.autoload
函数来完成。
文档
定义路由的第一种方式是使用bokeh_django.document
,它定义了一个指向Bokeh应用的路由(可以是文件路径或函数)。
from bokeh_django import document
from .views import my_bokeh_app_function
bokeh_apps = [
document('url-pattern/', '/path/to/bokeh/app.py'),
document('another-url-pattern/', my_bokeh_app_function)
]
当使用document
路由时,Django将直接将URL路由到Bokeh应用,并且所有的渲染将由Bokeh处理。
目录
创建document
路由的另一种方法是使用bokeh_django.directory
自动为目录中找到的所有bokeh应用创建document
路由。在这种情况下,文件名将用作URL模式。
from bokeh_django import directory
bokeh_apps = directory('/path/to/bokeh/apps/')
自动加载
为了更全面地集成到Django应用程序中,可以使用autoload
来创建路由。这允许将Bokeh应用程序嵌入到由Django渲染的模板中。这的优点是可以利用视图和模板中的Django功能,但设置稍微复杂一些。需要配置五个组件以协同工作:Bokeh处理器、Django视图、模板、Django URL路径和Bokeh URL路由。
Bokeh处理器
处理器是一个函数(或任何可调用对象),它接受一个bokeh.document.Document
对象,并使用要嵌入的Bokeh内容配置它。这是通过将Bokeh对象添加为文档根来完成的
from bokeh.document import Document
from bokeh.layouts import column
from bokeh.models import Slider
def bokeh_handler(doc: Document) -> None:
slider = Slider(start=0, end=30, value=0, step=1, title="Example")
doc.add_root(column(slider))
处理器还可以嵌入Panel对象。在这种情况下,将文档传递给Panel对象的server_doc
方法
import panel as pn
def panel_handler(doc: Document) -> None:
pn.Row().server_doc(doc)
Django视图
视图是一个Django函数,它接受一个request
对象并返回一个response
。嵌入Bokeh应用程序的视图必须创建一个bokeh.embed.server_document
,并在渲染响应时将其传递到模板的上下文中。
from bokeh.embed import server_document
from django.shortcuts import render
def view_function(request):
script = server_document(request.build_absolute_uri())
return render(request, "embed.html", dict(script=script))
模板
模板文档是Django HTML模板(例如"embed.html"
),将由Django渲染。它可以非常复杂,但至少必须渲染从上下文中传递的script
。
<!doctype html>
<html lang="en">
<body>
{{ script|safe }}
</body>
</html>
Django URL路径
Django URL路径是一个django.url.path
或django.url.re_path
对象,它包含在urlpatters
序列中,将URL模式映射到Django视图,就像通常使用Django一样。
urlpatterns = [
path("embedded-bokeh-app/", views.view_function),
]
Bokeh URL路由
Bokeh URL路由是一个bokeh_django.autoload
对象,它包含在bokeh_apps
序列中,将URL模式映射到Bokeh处理器。
from bokeh_django import autoload
bokeh_apps = [
autoload("embedded-bokeh-app/", views.handler)
]
请注意,URL模式应该与相应的Django URL路径中使用的URL模式相同。实际上,URL模式必须匹配Django视图中配置的server_document
脚本的URL。通常,使用来自request
对象的URL(例如script = server_document(request.build_absolute_uri())
)是最简单的,这是相应Django URL路径的URL。
项目详细信息
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装软件包的更多信息。
源分发
构建分发
bokeh-django-0.1.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1f57bf136482ae6af27c98377b97b58df5a8a61057f22dc854f8781d6730648c |
|
MD5 | 0ada43ea45ba50ef78f0eb8e3dda610e |
|
BLAKE2b-256 | 6b7d87052888d28c78facccd1ff681bebaddc6268d39ea5fe3cb1f9f184b0bf8 |
bokeh_django-0.1.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3941e721b0f98ec81fd994fdc2fb11b669b1a62986bbe5cd2f596dc098e71936 |
|
MD5 | 0f881b982867e983e456a4b4eb975be8 |
|
BLAKE2b-256 | 57c644fec9fdab45d071003d5bda2335fc47f65d537a2b7e5982012d4da87af1 |