

お世話になっております。

python3のHTMLテンプレートjinja2のinclude機能でS3上にあるファイルをincludeしたいのですが、どのようにすればよいのかわかりません。

[code]

    <div id="sample">
        <!--サンプルHTMLを読み込む-->
        {% include "https://.../sample.html" %}
    </div>
    
[/code]

上記のようにS3上のHTMLファイルのフルパスを指定してもエラーになりました。

理想はメモリ上にS3上のHTMLをダウンロードして、そのデータをjinja2でdivタグの中に埋め込みたいのですが、どうすればよろしいでしょうか。


CC BY-SA 4.0
2018-10-24T02:41:47.210
49594
2018-10-25T02:06:10.510
2018-10-24T02:59:13.620
3060
30656
question
python html python3
jinja2によるS3ファイルのinclude


jinja2のinclude機能を使ってネットワーク上にあるファイルを`include`することはできませんが、そのファイルを取得する関数を書いて`jinja2`に`render`時に渡すことで実現できます。

以下は、サンプルコードです。

[code]

    from jinja2 import Environment, select_autoescape, FileSystemLoader
    import urllib.request
    
    def include_from_url(url):
        with urllib.request.urlopen(url) as f:
            return f.read()
    
    env = Environment(
        loader=FileSystemLoader('.'),
        autoescape=select_autoescape(['html', 'xml']),
    )
    template = env.get_template('template.html')
    print(template.render(include_from_url=include_from_url))
    
[/code]

template.html

[code]

    <div id="sample">
        <!--サンプルHTMLを読み込む-->
        {{include_from_url('https://.../sample.html')}}
    </div>
    
[/code]

なお、`flask`で使っている場合は、`Context Processors`が使えます。  
ドキュメント <http://flask.pocoo.org/docs/1.0/templating/#context-processors>

[code]

    @app.context_processor
    def utility_processor():
        def include_from_url(url):
            with urllib.request.urlopen(url) as f:
                return f.read()
    
[/code]


CC BY-SA 4.0
2018-10-25T00:26:10.470
49630
2018-10-25T02:06:10.510
2018-10-25T02:06:10.510
15171
15171
49594
answer