pyecharts1.3.1采用jinja2 Markup渲染网页,
return Markup(chart.render_embed(template_name='index.html'))
{% extends "bootstrap/base.html" %}
提示
jinja2.exceptions.TemplateNotFound: bootstrap/base.html
调用路径:
# ./pyecharts/charts/base.py
class Base:
def render_embed(
self,
template_name: str = "simple_chart.html",
env: Optional[Environment] = None,
):
self._prepare_render()
html = RenderEngine(env).render_chart_to_template(template_name, chart=self)
return html
def _prepare_render(self):
self.json_contents = self.dump_options()
self._use_theme()
# ./pyecharts/render/engine.py
class RenderEngine:
@staticmethod
def generate_js_link(chart: Any) -> Any:
if not chart.js_host:
chart.js_host = CurrentConfig.ONLINE_HOST
links = []
for dep in chart.js_dependencies.items:
# TODO: if?
if dep.startswith("http://api.map.baidu.com"):
links.append(dep)
if dep in FILENAMES:
f, ext = FILENAMES[dep]
links.append("{}{}.{}".format(chart.js_host, f, ext))
else:
for url, files in EXTRA.items():
if dep in files:
f, ext = files[dep]
links.append("{}{}.{}".format(url, f, ext))
break
chart.dependencies = links
return chart
def render_chart_to_template(self, template_name: str, chart: Any) -> str:
tpl = self.env.get_template(template_name)
return replace_placeholder(tpl.render(chart=self.generate_js_link(chart)))
模板中为:
{%- macro render_chart_content(c) -%}
<div id="{
{ c.chart_id }}" style="width:{
{
c.width }}; height:{
{
c.height }};margin:auto;">div>
<script>
var chart_{
{
c.chart_id }} = echarts.init(
document.getElementById('{
{ c.chart_id }}'), '{
{ c.theme }}', {
renderer: '{
{ c.renderer }}'});
{
% for js in c.js_functions.items %}
{
{
js }}
{
% endfor %}
var option_{
{
c.chart_id }} = {
{
c.json_contents }};
chart_{
{
c.chart_id }}.setOption(option_{
{
c.chart_id }});
{
% if c._is_geo_chart %}
var bmap = chart_{
{
c.chart_id }}.getModel().getComponent('bmap').getBMap();
{
% if c.bmap_js_functions %}
{
% for fn in c.bmap_js_functions.items %}
{
{
fn }}
{
% endfor %}
{
% endif %}
{
% endif %}
script>
{%- endmacro %}
{%- macro render_chart_dependencies(c) -%}
{% for dep in c.dependencies %}
<script type="text/javascript" src="{
{ dep }}">script>
{% endfor %}
{%- endmacro %}
render_embed方法中,get_template、render方法导致无法查找到bootstrap,原因未知
解决办法:修改为render_template,需要进行self._prepare_render()并获取chart.dependencies
在render_embed()后加入函数render_embed_new()
# ./pyecharts/charts/base.py
class Base:
def render_embed_new(
self,
env: Optional[Environment] = None,
):
self._prepare_render()
return RenderEngine(env).generate_js_link(self)
return render_template('index.html', chart=chart.render_embed_new())