基础

render_template()有什么用
在Python代码中 直接生成 HTML 缺点很多,比如笨拙,效率低,可读性差。因此, Flask 提供了 Jinja2 模板引擎来帮助开发者高效灵活生成HTML。
使用该方法可以渲染模板,你只要提供模板名称和需要作为参数传递给模板的变量就行了。

html模板文件的位置
模板即自己写好的模板html文件,需要放在templates文件夹内。目录结构如下:

/application.py
/templates
    /hello.html

或者

/application
    /__init__.py
    /templates
        /hello.html

html模板文件的编写规则
Jinja2的详细使用见官方文档。

实例1

利用render_template(),我们可以优化一下flask学习笔记(二):文件浏览器+下载指定文件夹中的文件这个实例中的代码。即将html编写独立出来。修改后的代码如下:明显可读性更好了。

from flask import Flask, send_from_directory, render_template
import os

app = Flask(__name__)

root_dir = r'E:\Documents\test'

@app.route('/')
def index():
    files = os.listdir(root_dir)
    return render_template('files_list.html', files=files)


@app.route('/<filename>')
def download(filename):
    return send_from_directory(root_dir, filename)


app.run(debug=True)

html模板文件files_list.html代码如下:

<!doctype html>
<title>Download</title>
<h1>Directory listing</h1>
<hr>
<ul>
    {% for file in files %}
    <li><a href="{{file}}">{{file}}</a></li>
    {% endfor %}
</ul>

结果展示:效果一样。点击文件后可下载至本地。

实例2

利用render_template(),我们可以优化一下flask学习笔记(三):文件浏览器+下载指定文件夹中的文件(包含子文件夹)这个实例中的代码。即将html编写独立出来。修改后的代码如下:明显代码更简洁,可读性更好,也易扩展。

from flask import Flask, send_from_directory, render_template
import os

app = Flask(__name__)

root_dir = r'E:\temp\root_dir'

@app.route('/')
def index():
    files = os.listdir(root_dir)
    isdir_list = gen_isdir_list(root_dir)
    return render_template("files_list.html", files=files, isdir_list=isdir_list)    


@app.route('/<path:sub_dir>')
def sub_dir1_page(sub_dir):
    dir_name = root_dir + '\\' + sub_dir
    files = os.listdir(dir_name)
    isdir_list = gen_isdir_list(dir_name)
    return render_template("files_list.html", files=files, isdir_list=isdir_list)


@app.route('/<path:sub_dir1>/<path:sub_dir2>')
def sub_dir2_page(sub_dir1, sub_dir2):
    dir_name = root_dir + '\\' + sub_dir1 + '\\' + sub_dir2
    files = os.listdir(dir_name)
    isdir_list = gen_isdir_list(dir_name)
    return render_template("files_list.html", files=files, isdir_list=isdir_list)


@app.route('/<filename>')
def download_root(filename):
    return send_from_directory(root_dir, filename)


@app.route('/<path:sub_dir>/<filename>')
def download_subdir1(sub_dir, filename):
    dir_name = root_dir + '\\' + sub_dir
    return send_from_directory(dir_name, filename)


@app.route('/<path:sub_dir1>/<path:sub_dir2>/<filename>')
def download_subdir2(sub_dir1, sub_dir2, filename):
    dir_name = root_dir + '\\' + sub_dir1 + '\\' + sub_dir2
    return send_from_directory(dir_name, filename)


def gen_isdir_list(dir_name):
    files = os.listdir(dir_name)
    isdir_list = []
    for f in files:
        if os.path.isdir(dir_name + '\\' + f):
            isdir_list.append(True)
        else:
            isdir_list.append(False)
    return isdir_list

app.run(debug=True)

html模板文件files_list.html代码如下:

<!doctype html>
<title>Download</title>
<h1>Directory listing</h1>
<hr>
<ul>    
    {% for file in files %}  
        {% if isdir_list[loop.index0] %}
            <li><a href="{{file + '\\'}}">{{file+ '\\'}}</a></li>
        {% else %}
            <li><a href="{{file}}">{{file}}</a></li>
        {% endif %}
    {% endfor %}
</ul>

结果展示:

更多推荐

flask学习笔记(四):利用render_template()渲染html