使用 jinja 将 python 个模块导入 Flask 头文件

Import python modules to a Flask header file with jinja

说我有这个 header.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Title</title>
</head>
<body>
    {{ random.randrange(0, 5) }}
    {% block body %}
        
    {% endblock %}
</body>
</html>

和扩展它的 main.html 文件:

{% extends "header.html" %}

{% block body %}
    <p>Hello</p>
{% endblock %}

和这个 main.py 文件:

from flask import Flask, render_template
import random

app = Flask(__name__)

@app.route("/")
def main():
    return render_template("main.html")

app.run()

目前,当我 运行 访问该网站时,它显示 500 Internal Server Error 并且我在 python 控制台中收到此错误:

jinja2.exceptions.UndefinedError: 'random' is undefined

我怎样才能以某种方式 'import' 随机库进入 header.html 模板?

我是运行宁

Jinja 无法识别 random。那是必须导入的 python,因此不是 jinja 内置的。 Jinja 有一个内置的随机过滤器:

{{ range(5)|random }} 

更新问题的第二部分:

您可以使用 python 创建自己的过滤器。示例(使用 Flask):

@app.template_filter('datetimeformat')
def datetimeformat(value, format="%Y-%m-%d %H:%M:%S"):
    return value.strftime(format)


{{ the_date|datetimeformat("%Y-%m-%d") }}

实际上你可以使用装饰器 app.context_processor 来实现:

import os
import random


@app.context_processor
def handle_context():
    '''Inject object into jinja2 templates.'''
    return dict(os=os, random=random)

然后您可以在每个模板中使用 os, random 而无需在您的视图函数中输入它们:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ random.randint(0,10) }}<br>
{{ os.path.abspath('') }}
</body>
</html>

你会得到这样的东西:

6
F:\Python\MyProject