1

私は、ファイルをアップロードできる Web サイトを開発しようとしています。ファイルを後で分析してインタラクティブな図 (散布図とヒストグラム) を生成し、ユーザーが操作できるようにブラウザーに戻します。(Excel をオンラインにして、ファイルをアップロードし、図を取得し、図を操作できるようにすることを想像してください。) さまざまなオプションを検討し、プロットには Bokeh を使用することにしました。ファイルをアップロードするための python スクリプトと html ページを作成しました。Bokeh を使用して、出力ファイル (例: "plot.html") を作成できました。これはうまくいきます。

これとは別に、Tornado をインストールして、単純なファイル (「test.txt」など) をアップロードして動的に読み取り、ファイルの内容を output.html に単純に返すことができるようにしました。したがって、これはうまく機能します。

ただし、Tornado で使用するために記述されたスクリプトを変更して、以前の Bokeh 生成された plot.html を表示するようにすると、これは機能しません。Tornado で適切にレンダリングできない Bokeh で生成された html (プロット オブジェクトを含む) について何かありますか? たとえば、データベース検索のエントリには、シリアル化できない要素が含まれる可能性があり、検索結果を表示するには、シリアル化できない要素を削除する必要があると読みました。このようなことが起こっているのではないかと思います。

関連するスクリプトを次に示します。

display.py: Tornado を使用してファイルの内容を読み取り、返すため。これは機能し、予想どおり、test.txt の内容を返します。

import os.path
import random
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
define("port", default=80, help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.render('index.html')
class OutputHandler(tornado.web.RequestHandler):
    def post(self):
        fname = self.get_argument('upfile')
        f = open(fname, 'r')
        lines = f.readlines()
        self.render('plot.html', content=lines)
if __name__ == '__main__':
    tornado.options.parse_command_line()
    app = tornado.web.Application(
        handlers=[(r'/', IndexHandler), (r'/content', OutputHandler)],
        template_path=os.path.join(os.path.dirname(__file__), "templates"),
        static_path=os.path.join(os.path.dirname(__file__), "static"),
        debug=True
    )
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

plot.py : Bokeh を使用してプロットを読み取り、生成するため。これは機能し、生成されたプロットを含む plot.html を作成します。

from bokeh.plotting import *
output_file("plot.html")
filename = 'test.dat'
f=open(filename,'r')
#####
# deleted lines for manipulating data 
#####
scatter(ndarray[:1000,0], ndarray[:1000,1], color='red', alpha=0.7)
quad(top=hist, bottom=np.zeros(len(hist)), left=edges[:-1], right=edges[1:],
     fill_color="#036564", line_color="#033649")

display_plot.py : Tornado を介してボケ生成された plot.html を表示します。これは動作しません。

import os.path
import random
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
define("port", default=80, help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.render('plot.html')

# the rest the same as in display.py for now.

この最後のスクリプトは、プロット オブジェクトを含む Bokeh で生成された html を表示することは、正しくレンダリングできるテキストと図のみを含む他の html ファイルを表示することと同じではない、と私に思わせました。これは本当で、Tornado (またはそのことに関する任意の Web サービス) を使用して plot.html を表示するにはどうすればよいですか?

ご協力いただきありがとうございます。

4

1 に答える 1