pyecharts 无法找到bootstrap/base.html

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())

你可能感兴趣的:(pyecharts,bootstrap,jinja2)