Bootstrap

flask——Jinja2模板简单使用

在Flask中,配套的模板是Jinja2

Jinja2模板简介

渲染模板的方法

  • render_template()
from flask import render_template  //导入
@app.route('/')
def he():
    print(url_for("hello",aid=2,name="ABCDE",pwd="98765"))
    return render_template("index.html")
    //默认会在templates目录下找模板文件
    //也可以设置模板文件的位置
    //app = Flask(__name__,template_folder="D:\pipenv\venv\demo")
  • render_templates_string()
return render_template_string('<h1 style="color:red;">红</h1>')

模板传参

  • 如果只有一个或者少量参数,直接在render_template函数中添加关键字参数就可以了
return render_template("index.html", title="我是标题")
  • 如果有多个参数的时候,那么可以先把所有的参数放在字典中,然后在render_template中调用
@app.route('/')
def he():
    content = {
        'title':"我是标题",
        'username':'linlinlin'
    }
    return render_template("index.html", **content)
    //注意:这里的 **可以把字典转换成关键参数传递进去,方便使用和管理
    

在模板中使用 :{{ title }}

  • 传递多个参数也可以不加 ** ,但是使用的时候稍许麻烦.在模板中:{{content.title }}
return render_template("index.html", content=content)
  • 列表,字典传参
'books': {
            'python': 23,
            'java': 33,
            'php': 39
        },
        "list":['a','b','v','d']

模板中的使用

<p>{{ books.python}}</p>
<p>{{ books.values }}</p>
<p>{{ list.1 }}</p>
<p>{{ list[2] }}</p>

Jinja2模板过滤器

过滤器可以处理变量,把原始的变量经过处理后再展示出来
例如:{{ name|length }},将返回name的长度。

  1. length(value):返回序列或字典的项数

  2. abs(value) :返回数值的绝对值

  3. default(value,default_value,boolean=false)
    如果当前变量没有值,则会使用参数中的值来代替。value为None时,也会被代替。

  4. first(value):返回一个序列的第一个元素

  5. format(value,*arags,**kwargs):格式化字符串

 {{ "%s" - "%s"|format('Hello',"World") }}输出:Hello - World
  1. last(value):返回一个序列的最后一个元素。
  2. join(value,d=’++’):将一个序列用d这个参数的值拼接成字符串。
{{ list | join('++') }}
输出:a++b++c++d
  1. safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。
  2. escape 或 e 转义字符,会将<、>等符号转为HTML中的符号.例如:strrr|e
关闭转义
{% autoescape off %}
{{ es }}
{% endautoescape %}
  1. int(value):将值转换为int类型。
  2. float(value):将值转换为float类型。
  3. lower(value):将字符串转换为小写。
  4. upper(value):将字符串转换为大写。
  5. replace(value,old,new): 替换将old替换为new的字符串。
  6. truncate(value,length=100,killwords=False):截取length长度的字符串。
  7. striptags(value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。
  8. trim(value):截取字符串前面和后面的空白字符。
  9. string(value):将变量转换成字符串。
  10. wordcount(value):计算一个长字符串中单词的个数。
    更多点这里

自定义过滤器

from datetime import datetime
"now_time":datetime(2020,4,11,5,0,0)

@app.template_filter("handle_time")
def my_time(time):
    if isinstance(time,datetime):
        now=datetime.now();
        # .total_seconds()得到总秒数
        timestamp=(now-time).total_seconds()
        if timestamp <60:
            return "一分钟内"
        elif timestamp>=60 and timestamp<=60*60:
            return "%s分钟之前" % int(timestamp/60)
        elif timestamp>=60*60 and timestamp<=60*60*24:
            return "{}小时之前".format(int(timestamp/60/60))
    else:
        return time
-----------------------------------------------
<p>距离2020年4月11日5时相差{{ now_time | handle_time }}</p>

控制语句

if else

{% if username=="sang" %}
{{ username }}
{% else %}
<p>我不是sang</p>
{% endif %}

for in

<ul>
    {% for user in list %}
    <li>{{ user }}</li>
    {% endfor %}
</ul>

遍历字典

<ul>
    {% for key,value in books.items() %}
        <li>{{ key }}:{{ value }}</li>
    {% endfor %}
</ul>

Jinja中的for循环还包含以下变量,可以用来获取当前的遍历状态
loop.index:当前迭代的索引(从1开始)
loop.index0:当前迭代的索引(从0开始)
loop.first:是否为第一次迭代,返回True或False
loop.last:是否为最后一次迭代,返回True或False
loop.length:序列的长度

宏与import

类似python中的函数,但没有返回值。

//定义
{% macro hhh(name,type='text',value='') %}
    <input type="{{ type }}" ,name="{{ name }}",value="{{ value }}">
{% endmacro %}
  • import…as…形式调用
    import导入宏
{% import "marco.html" as macro %}
{{  macro.hhh('password',type="password") }}
  • from…import…as…/from…import…形式调用
{% from "macro.html" import hhh %}
{{ input("password",type="password") }}</td>

include和set

include可以把一个模板引入到另一个模板中

{% include "macro.html " %}

set赋值语句

全局:{% set name="XXX" %}
局部:
{% with %}
    {% set name="XXX" %}
{% endwith %}

{% with name="XXX" %}
	{{name}}
{% endwith %}

模板继承

flask中的模板可以继承,通过在父模板中定义 block,子模板继承了父模板的block,也可以去重写。

  • 子模板可以重写父模板,可以在block里面加标签,在不属于父模板 block内添加标签是不显示的
  • 子模板不能继承多个父模板
  • 可以嵌套模板
{% extends "base.html" %}

{% block demo %}
  //子类可以在这里重写内容,也可以不重写,直接使用父类的
{% endblock %}

静态文件的配置

在falsk中使用 css,js,image等等这些使页面美观的东西全部放在 static文件夹中,我们使用的时候直接使用 url_for调用

<link href="{{ url_for('static',filename='demo.css') }}">

url_for默认在static文件夹下找demo.css文件。
我们也可以设置默认查找位置不在static文件夹下,指定一下位置就好了

app = Flask(__name__,static_folder='e:\demo')
;