Import a Python module into a Jinja template?

前端 未结 4 986
独厮守ぢ
独厮守ぢ 2020-12-13 02:03

Is it possible to import a Python module into a Jinja template so I can use its functions?

For example, I have a format.py file that contains metho

相关标签:
4条回答
  • 2020-12-13 02:15

    You can export all of the symbols available in a module by providing the modules __dict__ as a parameter to the jinja template render method. The following will make available functions and types of __builtin__, inspect and types module to the template.

    import __builtin__
    import inspect
    import types
    
    env=RelEnvironment()
    template = env.get_template(templatefile)
    
    export_dict={}
    export_dict.update(__builtin__.__dict__)
    export_dict.update(types.__dict__)
    export_dict.update(inspect.__dict__)
    
    result=template.render(**export_dict)
    

    Within template, to use a function of the exported modules similar to the following:

    {%- for element in getmembers(object) -%}
    {# Use the getmembers function from inspect module on an object #}
    {% endfor %}
    
    0 讨论(0)
  • 2020-12-13 02:17

    Within the template, no, you cannot import python code.

    The way to do this is to register the function as a jinja2 custom filter, like this:

    In your python file:

    from dates.format import timesince
    
    environment = jinja2.Environment(whatever)
    environment.filters['timesince'] = timesince
    # render template here
    

    In your template:

    {% macro time(mytime) %}
    <a title="{{ mytime }}">{{ mytime|timesince }}</a>
    {% endmacro %}
    
    0 讨论(0)
  • 2020-12-13 02:23

    Just pass the function into the template, like so

    from dates.format import timesince
    your_template.render(timesince)
    

    and in the template, just call it like any other function,

    {% macro time(mytime) %}
        <a title="{{ mytime }}">{{ timesince(mytime) }}</a>
    {% endmacro %}
    

    Functions are first-class citizens in python, so you can pass them around just like anything else. You could even pass in a whole module if you wanted.

    0 讨论(0)
  • 2020-12-13 02:35

    A template doesn't know import, but you can teach it with the importlib:

    import importlib
    my_template.render( imp0rt = importlib.import_module )  # can't use 'import', because it's reserved
    

    (you can also name it "import" by passing the argument with a dict)

    kwargs = { 'import' : importlib.import_module }
    my_template.render( **kwargs )
    

    then in the jinja-template, you can import any module:

    {% set time = imp0rt( 'time' ) %}
    {{ time.time() }}
    
    0 讨论(0)
提交回复
热议问题