1. 程式人生 > >Flask高階應用04---jinja2和模板使用

Flask高階應用04---jinja2和模板使用

一.模板引擎— jinja2

Flask中使用jinja2模板引擎

jinja2是由Flask作者開發,模仿Django的模板引擎

優點:

速度快,被廣泛使用

HTML設計和後端python分離

非常靈活,快速和安全

提供了控制,繼承等高階功能

二、 模板語法(挖坑、繼承)

1、 模板語法主要分為兩種:變數和標籤

模板中的變數:{{ var }}

檢視傳遞給模板的資料

前面定義出來的資料

變數不存在,預設忽略

模板中的標籤:{% tag %}

控制邏輯

使用外部表示式

建立變數

巨集定義

2、結構標籤:

一般會在base.html中設定挖坑模板,在base_main.html中填充基本內容

(1)挖坑—block

{% block xxx %}

{% endblock %}

塊操作
	父模板挖坑,子模板填坑

(2)繼承-----extends

{% extends ‘xxx.html’ %}

繼承以後保留塊中的內容
{{ super() }}

挖坑繼承體現的化整為零的操作

(3)迴圈for、endfor/loop

注意:jianjia2中沒有ifequal語句

{% for item in cols %}

	aa

{% else %}

	bb

{% endfor %}

也可以獲取迴圈資訊loop

loop.first

loop.last

loop.index

loop.revindex

例子:

在檢視中定義一個檢視函式:

@stu.route('/scores/')
def scores():

    scores_list = [21,34,32,67,89,43,22,13]

    content_h2 = '<h2>今天你們真帥</h2>'
    content_h3 = '   <h3>今天你們真帥</h3>   '

    return render_template('scores.html',
                           scores=scores_list,
                           content_h2=content_h2,
                           content_h3=content_h3)

(該檢視函式,在下面講解的過濾器中任然使用其返回的content_h2等引數)

首先: 在頁面中進行解析scores的列表。題目要求:第一個成績展示為紅色,最後一個成績展示為綠色,其他的不變

<ul>
   {% for score in scores %}
        {% if loop.first %}
            <li style="color:red;">{{ loop.revindex }}:{{ loop.index }}:{{ score }}</li>
        {% elif loop.last %}
            <li style="color:green;">{{ loop.revindex }}:{{ loop.index }}:{{ score }}</li>
        {% else %}
            <li> {{ loop.revindex }}:{{ loop.index }}:{{ score }}</li>
        {% endif %}
    {% endfor %}
</ul>

(4)巨集定義macro

就相當於是在模板中定義一個函式,用的時候實現函式呼叫

{% macro hello(name) %}

	{{ name }}

{% endmacro %}

巨集定義,可以在模板中定義函式,在其他地方呼叫

1.無引數情況

<!--巨集定義(無引數情況)-->
    {% macro hello() %}
        <p>你好</p>
    {% endmacro %}

    {{ hello() }}

2.傳引數情況

<!--有引數的情況-->
{% macro say(name) %}
    <p> 你好,{{ name }}</p>
{% endmacro %}

{{ say('小明')}}

3.多個引數

 {% macro say(name,age) %}
      <p> 你好,{{name}} {{age}}</p>
  {% endmacro %}
  
  {{ say('小明',15)}}

4.定義成共有的引入

巨集定義可匯入

{% from ‘xxx’ import xxx %}

單獨定義一個function.py檔案用來存放方法

{% macro hello() %}
      <p>你好</p>
  {% endmacro %}


 {% macro say(name) %}
      <p> 你好,{{ name}}</p>
  {% endmacro %}

在頁面中引入巨集方法,可以實現效果

{% from 'functions.html' import hello,say %}

  {{ hello() }}

  {{ say('小明',15)}}

例1:

在index.html中定義macro標籤,定義一個方法,然後去呼叫方法,結果是展示商品的id和商品名稱

{% macro show_goods(id, name) %}
    商品id:{{ id }}
    商品名稱:{{ name }}
{% endmacro %}

{{ show_goods('1', '娃哈哈') }}
<br>
{{ show_goods('2', '雪碧') }}

例2:

在index.html頁面中定義一個say()方法,然後解析該方法:

{% macro say() %}

    <h3>今天天氣氣溫回升</h3>
    <h3>適合去游泳</h3>
    <h3>適合去郊遊</h3>

{% endmacro %}

{{ say() }}

例3:

定義一個function.html中定義一個方法:

{% macro create_user(name) %}
    建立了一個使用者:{{ name }}
{% endmacro %}

在index.html中引入function.html中定義的方法

{% from 'functions.html' import create_user %}

{{ create_user('小花') }}

3、過濾器

語法:

{{ 變數|過濾器|過濾器... }}

capitalize 單詞首字母大寫

lower 單詞變為小寫

upper 單詞變為大寫

title

trim 去掉字串的前後的空格

reverse 單詞反轉

format

striptags 渲染之前,將值中標籤去掉

safe 講樣式渲染到頁面中

default

last 最後一個字母

first

length

sum

sort

例子:

<ul>
    <li>{{ content_h2 }}</li>
    <li>{{ content_h2|safe }}</li>
    <li>{{ content_h2|striptags }}</li>

    <li>{{ content_h3 }}</li>
    <li>{{ content_h3|length }}</li>
    <li>{{ content_h3|trim|safe }}</li>
    <li>{{ content_h3|trim|length }}</li>
</ul>

三、定義模板

1 、定義基礎模板base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
        {% block title %}
        {% endblock %}
    </title>
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>

    {% block extCSS %}
    {% endblock %}
</head>
<body>

{% block header %}
{% endblock %}

{% block content%}
{% endblock %}

{% block footer%}
{% endblock %}

{% block extJS %}
{% endblock %}

</body>
</html>

2、 定義基礎模板base_main.html

{% extends 'base.html' %}

{% block extCSS %}
    <link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
{% endblock %}

四、靜態檔案資訊配置

1.flask的兩種方式

第一種方式:

<link rel="stylesheet" href="/static/css/index.css">

第二種方式:

<link rel="stylesheet" href="{{ url_for('static', filename='css/index.css') }}">

2.和Django對比

django:

第一種方式:

{% load static %}
<link rel="stylesheet" href="{% static 'css/index.css' %}">

第二種方式:

<link rel="stylesheet" href="/static/css/index.css">