Python Flask框架模板操作实例分析


Posted in Python onMay 03, 2019

本文实例讲述了Python Flask框架模板操作。分享给大家供大家参考,具体如下:

模板

在前面的示例中,视图函数的主要作用是生成请求的响应,这是最简单的请求。实际上,视图函数有两个作用:处理业务逻辑和返回响应内容。在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本。本节学到的模板,它的作用即是承担视图函数的另一个作用,即返回响应内容。 模板其实是一个包含响应文本的文件,其中用占位符(变量)表示动态部分,告诉模板引擎其具体值需要从使用的数据中获取。使用真实值替换变量,再返回最终得到的字符串,这个过程称为“渲染”。Flask使用Jinja2这个模板引擎来渲染模板。Jinja2能识别所有类型的变量,包括{}。 Jinja2模板引擎,Flask提供的render_template函数封装了该模板引擎,render_template函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值。

Jinja2官方文档(http://docs.jinkan.org/docs/jinja2/)

我们先来认识下模板的基本语法:

{% if user %}
  {{ user }}
{% else %}
  hello!
<ul>
  {% for index in indexs %}
  <li> {{ index }} </li>
</ul>

通过修改一下前面的示例,来学习下模板的简单使用:

@app.route('/')
def hello_itcast():
  return render_template('index.html')
@app.route('/user/<name>')
def hello_user(name):
  return render_template('index.html',name=name)

变量

在模板中{{ variable }}结构表示变量,是一种特殊的占位符,告诉模板引擎这个位置的值,从渲染模板时使用的数据中获取;Jinja2除了能识别基本类型的变量,还能识别{};

<span>{{mydict['key']}}</span>
<br/>
<span>{{mylist[1]}}</span>
<br/>
<span>{{mylist[myvariable]}}</span>
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
  mydict = {'key':'silence is gold'}
  mylist = ['Speech', 'is','silver']
  myintvar = 0
  return render_template('vars.html',
              mydict=mydict,
              mylist=mylist,
              myintvar=myintvar
              )
if __name__ == '__main__':
  app.run(debug=True)

反向路由: Flask提供了url_for()辅助函数,可以使用程序URL映射中保存的信息生成URL;url_for()接收视图函数名作为参数,返回对应的URL;

如调用url_for('index',_external=True)返回的是绝对地址,在下面这个示例中是http://localhost:5000/

如调用url_for('index',name='apple',_external=True)返回的是:
http://localhost:5000/index/apple

@app.route('/')
def hello_itcast():
  return render_template('index.html')
@app.route('/user/<name>')
def hello_user(name):
  return url_for('hello_itcast',_external=True)

自定义错误页面:

from flask import Flask,render_template
@app.errorhandler(404)
def page_not_found(e):
  return render_template('404.html'), 404

过滤器:

过滤器的本质就是函数。有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,这就用到了过滤器。 过滤器的使用方式为:变量名 | 过滤器。 过滤器名写在变量名后面,中间用 | 分隔。如:{{variable | capitalize}},这个过滤器的作用:把变量variable的值的首字母转换为大写,其他字母转换为小写。 其他常用过滤器如下:

safe:禁用转义;

<p>{{ '<em>hello</em>' | safe }}</p>

capitalize:把变量值的首字母转成大写,其余字母转小写;

<p>{{ 'hello' | capitalize }}</p>

lower:把值转成小写;

<p>{{ 'HELLO' | lower }}</p>

upper:把值转成大写;

<p>{{ 'hello' | upper }}</p>

title:把值中的每个单词的首字母都转成大写;

<p>{{ 'hello' | title }}</p>

trim:把值的首尾空格去掉;

<p>{{ ' hello world ' | trim }}</p>

reverse:字符串反转;

<p>{{ 'olleh' | reverse }}</p>

format:格式化输出;

<p>{{ '%s is %d' | format('name',17) }}</p>

striptags:渲染之前把值中所有的HTML标签都删掉;

<p>{{ '<em>hello</em>' | striptags }}</p>

语句块过滤(不常用):

{% filter upper %}
  this is a Flask Jinja2 introduction
{% endfilter %}

自定义过滤器:

通过Flask应用对象的add_template_filter方法,函数的第一个参数是过滤器函数,第二个参数是过滤器名称。然后,在模板中就可以使用自定义的过滤器。

def filter_double_sort(ls):
  return ls[::2]
app.add_template_filter(filter_double_sort,'double_2')

Web表单:

web表单是web应用程序的基本功能。

它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。

在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能。

WTForms支持的HTML标准字段

Python Flask框架模板操作实例分析

WTForms常用验证函数

Python Flask框架模板操作实例分析

使用Flask-WTF需要配置参数SECRET_KEY。

CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。 SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密匙生成加密令牌。

<form method='post'>
  <input type="text" name="username" placeholder='Username'>
  <input type="password" name="password" placeholder='password'>
  <input type="submit">
</form>
from flask import Flask,render_template
@app.route('/login',methods=['GET','POST'])
def login():
  if request.method == 'POST':
    username = request.form['username']
    password = request.form['password']
    print username,password
  return render_template('login.html',method=request.method)

配置参数:

app.config['SECRET_KEY'] = 'silents is gold'
{{ form.username.label }}
{{ form.username() }}
{{ form.password.label }}
{{ form.password() }}
{{ form.submit() }}

我们通过登录页面来演示表单的使用。

#coding=utf-8
from flask import Flask,render_template,\
  flash,redirect,url_for,session
#导入WTF扩展包的Form基类
from flask_wtf import Form
from wtforms.validators import DataRequired,EqualTo
from wtforms import StringField,PasswordField,SubmitField
app = Flask(__name__)
#设置secret_key,防止跨站请求攻击
app.config['SECRET_KEY'] = '2017'
#自定义表单类,继承Form
class Login(Form):
  us = StringField(validators=[DataRequired()])
  ps = PasswordField(validators=[DataRequired(),EqualTo('ps2','error')])
  ps2 = PasswordField(validators=[DataRequired()])
  submit = SubmitField()
#定义视图函数,实例化自定义的表单类,
@app.route('/',methods=['GET','POST'])
def forms():
  #实例化表单对象
  form = Login()
  if form.validate_on_submit():
  #获取表单数据
    user = form.us.data
    pswd = form.ps.data
    pswd2 = form.ps2.data
    print user,pswd,pswd2
    session['name'] = form.us.data
    flash(u'登陆成功')
    return redirect(url_for('forms'))
  else:
    print form.validate_on_submit()
  return render_template('forms.html',form=form)
if __name__ == "__main__":
  app.run(debug=True)

控制语句

常用的几种控制语句:

模板中的if控制语句

@app.route('/user')
def user():
  user = 'dongGe'
  return render_template('user.html',user=user)
<html>
 <head>
   {% if user %}
    <title> hello {{user}} </title>
  {% else %}
     <title> welcome to flask </title>    
  {% endif %}
 </head>
 <body>
   <h1>hello world</h1>
 </body>
 </html>

模板中的for循环语句

@app.route('/loop')
 def loop():
  fruit = ['apple','orange','pear','grape']
  return render_template('loop.html',fruit=fruit)
<html>
 <head>
   {% if user %}
    <title> hello {{user}} </title>
  {% else %}
     <title> welcome to flask </title>    
  {% endif %}
 </head>
 <body>
   <h1>hello world</h1>
  <ul>
    {% for index in fruit %}
      <li>{{ index }}</li>
    {% endfor %}
  </ul>
 </body>
 </html>

宏:

类似于python中的函数,宏的作用就是在模板中重复利用代码,避免代码冗余。

Jinja2支持宏,还可以导入宏,需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复。

定义宏

{% macro input() %}
 <input type="text"
     name="username"
     value=""
     size="30"/>
{% endmacro %}

调用宏

{{ input()}}
#定义带参数的宏
#调用宏,并传递参数
  <input type="password"
      name=""
      value="name"
      size="40"/>

模板继承:

模板继承是为了重用模板中的公共内容。{% block head %}标签定义的元素可以在衍生模板中修改,extends指令声明这个模板继承自哪?父模板中定义的块在子模板中被重新定义,在子模板中调用父模板的内容可以使用super()。

{% extends 'base.html' %}
 {% block content %}
  <h1> hi,{{ name }} </h1>
 {% for index in fruit %}
  <p> {{ index }} </p>
 {% endfor %}
 {% endblock %}

Flask中的特殊变量和方法:

在Flask中,有一些特殊的变量和方法是可以在模板文件中直接访问的。

config 对象:

config 对象就是Flask的config对象,也就是 app.config 对象。

{{ config.SQLALCHEMY_DATABASE_URI }}

request 对象:

就是 Flask 中表示当前请求的 request 对象。

{{ request.url }}

url_for 方法:

url_for() 会返回传入的路由函数对应的URL,所谓路由函数就是被 app.route() 路由装饰器装饰的函数。如果我们定义的路由函数是带有参数的,则可以将这些参数作为命名参数传入。

{{ url_for('index') }}
{{ url_for('post', post_id=1024) }}

get_flashed_messages方法:

返回之前在Flask中通过 flash() 传入的信息列表。把字符串对象表示的消息加入到一个消息队列中,然后通过调用 get_flashed_messages() 方法取出。

{% for message in get_flashed_messages() %}
  {{ message }}
{% endfor %}

希望本文所述对大家基于flask框架的Python程序设计有所帮助。

Python 相关文章推荐
python抓取京东价格分析京东商品价格走势
Jan 09 Python
python抓取网页内容示例分享
Feb 24 Python
详解Django框架中的视图级缓存
Jul 23 Python
django 在原有表格添加或删除字段的实例
May 27 Python
PHP实现发送和接收JSON请求
Jun 07 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
Dec 24 Python
django中账号密码验证登陆功能的实现方法
Jul 15 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
使用python批量转换文件编码为UTF-8的实现
Apr 03 Python
python函数map()和partial()的知识点总结
May 26 Python
浅谈keras中的目标函数和优化函数MSE用法
Jun 10 Python
python神经网络ResNet50模型
May 06 Python
Python Flask框架扩展操作示例
May 03 #Python
Python安装Flask环境及简单应用示例
May 03 #Python
Python实现字典按key或者value进行排序操作示例【sorted】
May 03 #Python
Python3模拟curl发送post请求操作示例
May 03 #Python
零基础使用Python读写处理Excel表格的方法
May 02 #Python
Python TestCase中的断言方法介绍
May 02 #Python
Python3中的bytes和str类型详解
May 02 #Python
You might like
PHP入门速成教程
2007/03/19 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
了解PHP的返回引用和局部静态变量
2015/06/04 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
javascript学习笔记(七) js函数介绍
2012/06/19 Javascript
js实现获取焦点后光标在字符串后
2014/09/17 Javascript
用JS生成UUID的方法实例
2016/03/30 Javascript
AngularJS 作用域详解及示例代码
2016/08/17 Javascript
解析JavaScript模仿块级作用域
2016/12/29 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
JS实现区分中英文并统计字符个数的方法示例
2018/06/09 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
[04:42]2015国际邀请赛CDEC战队晋级之路
2015/08/13 DOTA
详解Python中expandtabs()方法的使用
2015/05/18 Python
Python装饰器用法实例总结
2018/02/07 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
python实现高斯投影正反算方式
2020/01/17 Python
python用pip install时安装失败的一系列问题及解决方法
2020/02/24 Python
filter使用python3代码进行迭代元素的实例详解
2020/12/03 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
Html5 webview元素定位工具的实现
2020/08/07 HTML / CSS
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
C语言面试题
2013/05/19 面试题
建筑行业的大学生自我评价
2013/12/08 职场文书
党员违纪检讨书
2014/02/18 职场文书
理工大学毕业生自荐信范文
2014/02/22 职场文书
售后服务承诺书怎么写
2014/05/21 职场文书
2015年双拥工作总结
2015/04/08 职场文书
2016公司年会通知范文
2015/04/25 职场文书
致运动员加油稿
2015/07/21 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书
应届生们该怎么书写求职信?
2019/07/05 职场文书
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android