美文网首页
2.8.6Flask --3 Flask的模板操作

2.8.6Flask --3 Flask的模板操作

作者: 寒暄_HX | 来源:发表于2020-03-08 17:03 被阅读0次

Flask目录:https://www.jianshu.com/p/9b5e30320849

一个简单的例子:

two_exam.app.py
---------------
from flask import Flask,render_template
app = Flask(__name__)

@app.route('/')
def hello_world():
    return render_template('index.html')

if __name__ == '__main__':
    app.run()

twp_exam.templates.index.html
-----------------------------
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
<h1>欢迎你</h1>
</body>
</html>
页面

jinja2

官方文档
jinja2是一个Python模板引擎,具体的很多操作和Django的模板操作类似,但是也有自己独特的地方。例如jinja2的宏与沙箱模式。

变量与语法

jinja2关于变量与语法的设计和Django的设计大体上差不多。
实例:

two_exam.app.py
---------------
from flask import Flask,render_template
app = Flask(__name__)

@app.route('/')
def hello_user():
    username = '李四'
    dict1 = {
        'age':20,
        'city':'河北'
    }
    list1 = ['广东','上海','北京']
    return render_template('index.html',username='李四',dict1=dict1,list1=list1)

if __name__ == '__main__':
    app.run()

twp_exam.templates.index.html
-----------------------------
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
<h1>欢迎你,{{ username }}</h1>
<h1>你的年龄是{{ dict1.age }}</h1>
<h1>你来自{{ dict1['city'] }}</h1>

{% if dict1.age > 18 %}
    <p>{{ username }} 可以去网吧啦</p>
{% endif %}

<h3>list渲染</h3>
{% for i in list1 %}
    <p>{{ i }}</p>
{% endfor %}

{#这里是和django的第一点不同,items需要加括号#}
{% for k,v in dict1.items() %}
    <p>{{ k }}--{{ v }}</p>
{% endfor %}
</body>
</html>
页面截图

关于for循环还有一个要说的地方就是他对class样式的控制。

...
    <style>
        .a{
            color:red;
        }
        .b{
            color: green;
        }
        .c{
            color: aqua;
        }

    </style>
...
<h2>对class的操作</h2>
{% for i  in list1 %}
    <p class="{{ loop.cycle('a','b','c') }}">{{ i }}</p>
{% endfor %}
...
页面截图

for循环的扩展

for循环内的变量

如何在html中使用break和continue。在app.py中添加。

#为jinja2添加break/continue扩展
app.jinja_env.add_extension('jinja2.ext.loopcontrols')

上面我们简单说来一下从后端传到前端的值怎么使用,接着我们来说说怎么在前端定义变量与代码块。

<h2>变量与代码块</h2>

{% with %}
    {% set value = 30 %}
    <p>{{ value }}</p>  {#这个value只在这个with块内有用#}
{% endwith %}
页面截图

过滤器

过滤器用来对我们要展示的内容进行进一步的处理。
有两种方式,方式一是使用管道符,方式二是使用标签。

@app.route('/use_filter')
def use_filter():
    hello = 'hello,lucy'
    return render_template('glq.html',hello=hello)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>过滤器</title>
</head>
<body>
    <h3>不使用过滤器</h3>
    {{ hello }}
    <h3>使用管道符过滤器</h3>
    {{ hello | upper }}
    <h3>使用标签过滤器</h3>
    {% filter upper %}
        {{ hello }}
    {% endfilter %}
</body>
</html>
页面截图

内置过滤器

就举几个常用的,具体参考文档。

@app.route('/use_filter')
def use_filter():
    hello = 'hello,lucy'
    a = -1
    var = None
    html_str = '<h4>测试文本</h4>'
    return render_template('glq.html',hello=hello,a=a,var=var,html_str=html_str)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>过滤器</title>
</head>
<body>
    <h3>不使用过滤器</h3>
    {{ hello }}
    <h3>使用管道符过滤器</h3>
    {{ hello | upper }}
    <h3>使用标签过滤器</h3>
    {% filter upper %}
        {{ hello }}
    {% endfilter %}
    <h3>常用过滤器</h3>
    <h4>绝对值</h4>
    <p>{{ a }}</p>
    <p>{{ a|abs }}</p>
    <h4>默认值</h4>
    <h6>默认值是指给没有定义的变量赋的值,如果在后端已经赋值,哪怕是None也不行</h6>
    <p>{{ var | default("没有这个值") }}</p>
    <p>{{ var2 |default("没有这个值") }}</p>
    <h6>当然我们可以用default的另一个参数</h6>
    <p>{{ var | default("没有这个值",True) }}</p>
    <h6>同时也可以将 default 简写成 d </h6>
    <p>{{ var | d("没有这个值",True) }}</p>
    <h4>转义字符</h4>
    {% autoescape off %}
        <p>{{ html_str }}</p>
        {{ html_str | escape }}
        <h6>可以简写成 e</h6>
        {{ html_str | e }}
    {% endautoescape %}
</body>
</html>
页面截图

自定义过滤器

jinja2的自定义过滤器和jango的差不多。

#自定义过滤器
#装饰器
@app.template_filter("phone_foramt")
def phone_format(phone):
    return phone[:3]+'*'*8

#函数
def shibei(a):
    return a*10
app.jinja_env.filters['shibei']=shibei
    <h1>自定义过滤器</h1>
    <p>{{  phone | phone_foramt }}</p>
    <p>{{  a | shibei }}</p>
页面截图

模板的宏

宏,一般叫宏的东西都感觉好高级,其实他就是一个用来进行批量处理的称谓。也可以把jinja2的宏理解成是函数。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>宏</title>
</head>
<body>

{% macro input(type_name,name,value="") %}
    <input  type="{{ type_name }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}
{{ input('text','username','admin') }}

<h3>number输入</h3>
{{ input ('number','age') }}
</body>
</html>

宏就没有py文件多少事情了,就不展示py内容。


页面截图

同样,他既然是个函数了,那么肯定就能从外部文件导入呀。

from.html
---------
{% macro input(type_name,name,value="") %}
    <input  type="{{ type_name }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}

hong.html
----------
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>宏</title>
</head>
<body>
{% from 'from.html' import input %}
{#这里也可以写成   {% import 'from.html' as fr %}#}
{{ input('text','username','admin') }}

<h3>number输入</h3>
{{ input ('number','age') }}
</body>
</html>
页面截图

模板的继承

继承大致上与jango的类似,都是用来减少前端代码的重复率,提高开发速率。
所以这里

{% extends 母版与继承 %}

消息闪现

一个好的应用和用户界面都需要良好的反馈。如果用户得不到足够的反馈,那么应用最终会被用户唾弃。

Flask 的闪现系统提供了一个良好的反馈方式。

from flask import Flask,render_template,flash,redirect
app = Flask(__name__)

#给消息闪现加上key值
app.secret_key='xxsx-key'

#消息闪现
@app.route('/xxsx')
def xxsx():
    flash('欢迎回来')
    return redirect('/m')

@app.route('/m')
def m():
    return render_template('xxsx.html')

if __name__ == '__main__':
    app.run()
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>消息闪现</title>
</head>
<body>
<h1>用户中心</h1>
{% for msg in get_flashed_messages() %}
    <p>{{ msg }}</p>
{% endfor %}
</body>
</html>
页面跳转

页面时发生了跳转 但是本来我们传输给xxsx的 欢迎回来 却显示在 m页面中。


页面截图

不过在刷新一下,闪现的消息就消失了,他只会存在一次。

分类消息闪现

除了普通的消息闪现,我们也可以一次传输多个消息,这就用到了flash的第二个参数与get_flashed_messages的第二个参数。

from flask import Flask,render_template,flash,redirect
app = Flask(__name__)

#给消息闪现加上key值
app.secret_key='xxsx-key'

#消息闪现
@app.route('/xxsx')
def xxsx():
    flash('欢迎回来','success')
    flash('警告你一下','error')
    return redirect('/m')

@app.route('/m')
def m():
    return render_template('xxsx.html')

if __name__ == '__main__':
    app.run()
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>消息闪现</title>
</head>
<body>
<h1>用户中心</h1>
{% for msg in get_flashed_messages(with_categories=true) %}
    <p class="{{ cat }}">{{ msg }}</p>
{% endfor %}
</body>
</html>
页面截图

这样就可以用来传输多种消息。同时可以来适配class。

过滤消息闪现

在某些时候,我们希望有些消息不传输过去,这就有了屏蔽消息闪现。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>消息闪现</title>
</head>
<body>
<h1>用户中心</h1>
{% for cat,msg in get_flashed_messages(with_categories=true,category_filter=['error']) %}
    <p class="{{ cat }}">{{ msg }}</p>
{% endfor %}
</body>
</html>
页面截图

除了 error 其他的消息都被我们屏蔽了。

相关文章

网友评论

      本文标题:2.8.6Flask --3 Flask的模板操作

      本文链接:https://www.haomeiwen.com/subject/iqtwrhtx.html