Flask模板渲染

183 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

之前博客聊了Flask的基本的核心的请求流程,浏览器填写url地址请求flask服务器,服务器通过url过滤路由,路由指向视图函数,函数反馈内容给浏览器。今天聊聊基于Flask前后端不分离的html渲染。

Flask 本身没有html渲染技术,默认采用的是三方的jinja2渲染技术,所以今天要聊的是三个部分:

模板渲染概念

首先聊聊模板渲染的概念,所有的模板渲染,从使用的角度上必须分出两部分来看:

1、数据

2、展示方式

比如,结婚时候需要用到的请柬,整体是一个固定的格式,然后被邀请人,时间,地点,事宜,邀请人这些为变量,而Flask 模板渲染也是如此的,整个渲染的过程其实就是:

1、在前端页面定义渲染数据的位置

2、定义要渲染的数据

3、然后将数据填写到定义好的页面当中,展现给用户。

Flask渲染步骤

抛开jinja2语法,flask渲染数据是有一个固定的讨论的,我们来讨论一下:

1、首先要渲染html就得有html,flask默认加载当前目录下templates目录下的html文件,当然也可以在app创建的时候进行设置:

app = Flask(__name__,template_folder="D:\")

2、然后修改前端代码,添加渲染位置

....
<h1>{{name}}</h1>
...

3、最后通过flask内置的方法区加载html,传递参数

render_template("index.html",name = "laobian")

Jinja2语法

jinja2是Python三方的一个强调的模板渲染库,除了可以在这里使用,在很多文本渲染的地方也是可以看到的,比如ansible的playbook。

这里注意,这些语句是写在html当中的,并且需要你懂一些前端的知识,嘿嘿嘿。

变量渲染

jinja2可以默认通过{{}}来渲染模板变量,并且可以调用方法

如果变量是字符串

{{ username }}  #直接调用变量
{{ username[1] }} #调用索引
{{ username.upper() }} #调用无参数的方法
{{ username.replace("a","b") }} #调用有参数的方法

如果变量是字典

{{ user.username }} #以键取值

逻辑渲染

条件判断

比如登录状态和用户名这样的场景,只有登录成功才显示登录名称,要不显示请登录的字样,这样的判断可以采用jinja2的判断语句试实现。

{% if 条件 %}
<p>满足if语句展现的标签</p>
{% elif 条件%}
<p>满足elif语句展现的标签</p>
{% else %}
<p>满足else语句展现的标签</p>
{% endif %}
循环

尤其对于相同结构的html,比如新闻列表这样的结构,采用循环可以极大的降低代码量。

{% for i in 变量 %}
<p>循环展示的标签</p>
{% endfor %}
过滤器

过滤器可以理解为可以自定义的比较复杂的变量处理方式,使用方式是在变量的后面加上|和方法名称,比如:

safe可以转义html

{{ 变量|safe }} #

自定义过滤器

@app.template_filter("过滤器名称")
def nice(被过滤变量):
    return value.upper() #返回过滤后的内容

模板加载

如果在开发过程当中,遇到同样的一个前端样式,在多个页面当中被使用,那么就可以使用这个功能,将共性的html模块放到单独的页面当中,然后使用incude加载使用,这样更加方便代码维护。

{% include "index.html" %}

模板继承

模板继承比模板加载更加复杂,但是更加灵活,他正对的是整个网站层面的框架,通常整个完整的所有页面整体的风格是一致的,所以会有很多共性的的地方,比如导航,页尾,这样情况下,可以先基于共性的部分构建框架,设定可以修改的块,其他页面采用模板继承,只编写个性部分。

<!-- 定义和使用html -->
{% block 块名称%}
{% endblock %}
<!-- 使用模板 -->
{% extends "模板文件名称" %}

总结

随着前后端技术的发展,前后端不分离的技术使用的越来越少,但是jinja2在模板渲染上使用的还是很频繁的,比如自动化运维和自动化测试的过程当中。但是要注意的是,jinja2直接看知识点的效果不好,需要结合案例,完整的去实现,之后再更新一个项目的博客吧。

最后还是请各位大佬多多指点。