使用 Bokeh AjaxDataSource 发出认证请求

Making credentialed requests with Bokeh AjaxDataSource

我有一个情节设置使用AjaxDataSource。这在我的本地开发中运行良好,并且在我的 Kubernetes 集群中部署时运行良好。但是,在我将 HTTPS 和 Google IAP(身份识别代理)添加到我的绘图应用程序后,所有对我的 AjaxDataSource 的数据 url 的请求都被 Google 应用内购服务。

我过去 运行 遇到过这个问题,其他 AJAX 请求 Google IAP 保护的服务,并通过在我的 axios 中设置 {withCredentials: true} 解决了这个问题要求。但是,我在使用 Bokeh 的 AjaxDataSource 时没有这个选项。如何让 BokehJS 将 cookie 传递到 AjaxDataSource 中的我的服务?

AjaxDataSource可以pass headers:

ajax_source.headers = { 'x-my-custom-header': 'some value' }

无法设置 cookie(将在查看者的浏览器上设置……在这种情况下似乎不相关)。这样做需要构建自定义扩展。

感谢 bigreddot 为我指明了正确的方向。我能够构建一个满足我需要的自定义扩展。这是该扩展的源代码:

from bokeh.models import AjaxDataSource
from bokeh.util.compiler import TypeScript

TS_CODE = """
import {AjaxDataSource} from "models/sources";

export class CredentialedAjaxDataSource extends AjaxDataSource {

    prepare_request(): XMLHttpRequest {
        const xhr = new XMLHttpRequest();
        xhr.open(this.method, this.data_url, true);
        xhr.withCredentials = true;
        xhr.setRequestHeader("Content-Type", this.content_type);

        const http_headers = this.http_headers;
        for (const name in http_headers) {
          const value = http_headers[name];
          xhr.setRequestHeader(name, value)
        }
        return xhr;
    }
}
"""


class CredentialedAjaxDataSource(AjaxDataSource):

    __implementation__ = TypeScript(TS_CODE)

散景扩展文档:https://docs.bokeh.org/en/latest/docs/user_guide/extensions.html