Flask模板01

模板

在前面的示例中,视图函数的主要作用是生成请求的响应,这是最简单的请求。实际上,视图函数有两个作用:处理业务逻辑和返回响应内容。在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本。本节学到的模板,它的作用即是承担视图函数的另一个作用,即返回响应内容。 模板其实是一个包含响应文本的文件,其中用占位符(变量)表示动态部分,告诉模板引擎其具体值需要从使用的数据中获取。使用真实值替换变量,再返回最终得到的字符串,这个过程称为“渲染”。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>{% endfor %}
</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除了能识别基本类型的变量,还能识别{};

<p>{{mydict['key']}}</p><p>{{mylist[1]}}</p><p>{{mylist[myvariable]}}</p>
from flask import Flask,render_template
app = Flask(__name__)@app.route('/')
def index():mydict = {'key':'silence is gold'}mylist = ['Speech', 'is','silver']myintvar = 0return 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://127.0.0.1:5000/index。

@app.route('/index')
def index():return render_template('index.html')@app.route('/user/')
def redirect():return url_for('index',_external=True)

自定义错误页面:

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

3.2 过滤器:

过滤器的本质就是函数。有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,这就用到了过滤器。 过滤器的使用方式为:变量名 | 过滤器。 过滤器名写在变量名后面,中间用 | 分隔。如:{{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>

列表操作

first:取第一个元素

  <p>{{ [1,2,3,4,5,6] | first }}</p>

last:取最后一个元素

  <p>{{ [1,2,3,4,5,6] | last }}</p>

length:获取列表长度

  <p>{{ [1,2,3,4,5,6] | length }}</p>

sum:列表求和

  <p>{{ [1,2,3,4,5,6] | sum }}</p>

sort:列表排序

  <p>{{ [6,2,3,1,5,4] | sort }}</p>

语句块过滤(不常用):

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

自定义过滤器:

过滤器的本质是函数。当模板内置的过滤器不能满足需求,可以自定义过滤器。自定义过滤器有两种实现方式:一种是通过Flask应用对象的add_template_filter方法。还可以通过装饰器来实现自定义过滤器。

自定义的过滤器名称如果和内置的过滤器重名,会覆盖内置的过滤器。

实现方式一:通过调用应用程序实例的add_template_filter方法实现自定义过滤器。该方法第一个参数是函数名,第二个参数是自定义的过滤器名称。

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

实现方式二:用装饰器来实现自定义过滤器。装饰器传入的参数是自定义的过滤器名称。

@app.template_filter('db3')
def filter_double_sort(ls):return ls[::-3]

3.3 Web表单:

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

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

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

WTForms支持的HTML标准字段

字段对象说明
StringField文本字段
TextAreaField多行文本字段
PasswordField密码文本字段
HiddenField隐藏文本字段
DateField文本字段,值为datetime.date格式
DateTimeField文本字段,值为datetime.datetime格式
IntegerField文本字段,值为整数
DecimalField文本字段,值为decimal.Decimal
FloatField文本字段,值为浮点数
BooleanField复选框,值为True和False
RadioField一组单选框
SelectField下拉列表
SelectMultipleField下拉列表,可选择多个值
FileField文本上传字段
SubmitField表单提交按钮
FormField把表单作为字段嵌入另一个表单
FieldList一组指定类型的字段

WTForms常用验证函数

验证函数说明
DataRequired确保字段中有数据
EqualTo比较两个字段的值,常用于比较两次密码输入
Length验证输入的字符串长度
NumberRange验证输入的值在数字范围内
URL验证URL
AnyOf验证输入值在可选列表中
NoneOf验证输入值不在可选列表中

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

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

在HTML页面中直接写form表单:

#模板文件
<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,request@app.route('/login',methods=['GET','POST'])
def login():if request.method == 'POST':username = request.form['username']password = request.form['password']print username,passwordreturn render_template('login.html',method=request.method)

使用Flask-WTF实现表单。

配置参数:

 app.config['SECRET_KEY'] = 'silents is gold'

模板页面:

 <form method="post">#设置csrf_token{{ form.csrf_token() }}{{ form.us.label }}<p>{{ form.us }}</p>{{ form.ps.label }}<p>{{ form.ps }}</p>{{ form.ps2.label }}<p>{{ form.ps2 }}</p><p>{{ form.submit() }}</p>{% for x in get_flashed_messages() %}{{ x }}{% endfor %}</form>

视图函数:

#coding=utf-8
from flask import Flask,render_template,\redirect,url_for,session,request,flash#导入wtf扩展的表单类
from flask_wtf import FlaskForm
#导入自定义表单需要的字段
from wtforms import SubmitField,StringField,PasswordField
#导入wtf扩展提供的表单验证器
from wtforms.validators import DataRequired,EqualTo
app = Flask(__name__)
app.config['SECRET_KEY']='1'#自定义表单类,文本字段、密码字段、提交按钮
class Login(Form):us = StringField(label=u'用户:',validators=[DataRequired()])ps = PasswordField(label=u'密码',validators=[DataRequired(),EqualTo('ps2','err')])ps2 = PasswordField(label=u'确认密码',validators=[DataRequired()])submit = SubmitField(u'提交')@app.route('/login')
def login():return render_template('login.html')#定义根路由视图函数,生成表单对象,获取表单数据,进行表单数据验证
@app.route('/',methods=['GET','POST'])
def index():form = Login()if form.validate_on_submit():name = form.us.datapswd = form.ps.datapswd2 = form.ps2.dataprint name,pswd,pswd2return redirect(url_for('login'))else:if request.method=='POST':flash(u'信息有误,请重新输入!')print form.validate_on_submit()return render_template('index.html',form=form)
if __name__ == '__main__':app.run(debug=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

★数学上最大的数是多少?

数学上最大的数是多少&#xff1f; 怪罗科普 收藏(282)| 阅读(117678)人类已经使用数长达千年之久。普遍认为&#xff0c;数的概念最先源于史前人类开始使用手指进行计数。这最终演变成符号语言&#xff0c;然后在沙子、墙壁和木头等物体上作标记。 我们已经向前发展了一大步&…

Flask模板02

3.4 控制语句 常用的几种控制语句&#xff1a; 模板中的if控制语句 app.route(/user) def user():user dongGereturn render_template(user.html,useruser)<html><head>{% if user %}<title> hello {{user}} </title>{% else %}<title> welc…

Storm任务提交过程及目录树介绍

目录前言&#xff1a;1、Storm 任务提交的过程2、Storm相关的目录树总结&#xff1a; 目录 前言&#xff1a; 对于任何一个组件来说&#xff0c;了解它相关的任务提交的过程是非常有必要的&#xff08;毕竟生产中遇到一些Bug时&#xff0c;你如果知道内部执行的过程&#xf…

《Adobe InDesign CS6中文版经典教程》—第1课1.5节修改文档的缩放比例

本节书摘来自异步社区《Adobe InDesign CS6中文版经典教程》一书中的第1课1.5节修改文档的缩放比例&#xff0c;作者【美】Adobe公司,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.5 修改文档的缩放比例Adobe InDesign CS6中文版经典教程InDesign中的控件让用户能…

随机生成一定范围的随机数

function randomNum(min,max) { return Math.ceil(Math.random()*(max-min)min); } min,max最小最大范围数字。转载于:https://www.cnblogs.com/kingzlz/p/6229586.html

【python】Flask视图

2.1 从 Hello World 开始 Flask程序运行过程&#xff1a; 所有Flask程序必须有一个程序实例。 Flask调用视图函数后&#xff0c;会将视图函数的返回值作为响应的内容&#xff0c;返回给客户端。一般情况下&#xff0c;响应内容主要是字符串和状态码。 当客户端想要获取资源…

大数据之Kafka入门简介

目录前言&#xff1a;1、Kafka是什么2、JMS是什么3、Kafka核心组件&#xff08;重点&#xff09;总结&#xff1a; 目录 前言&#xff1a; 作为流式计算中的一个组件&#xff0c;对于它的组成以及运行的原理&#xff0c;学习者也需要相关的了解。以下主要简单介绍了kafka是什…

oracle的安装与plsql的环境配置

1&#xff0c;首先得有oracle的安装包和plsql的安装包&#xff0c;安装包地址可见百度云 http://pan.baidu.com/s/1miTqhmg 2.解压下来进入0817账套&#xff0c;找到set.exe文件&#xff0c;双击安装即可 注意的是安装的时候有两个目录是要自己创建的&#xff0c;否则安装不成功…

如何在Docker容器中运行GUI程序

如何在Docker容器中运行GUI程序 各位&#xff0c;今天我们将学习如何在Docker之中运行GUI程序。我们可以轻易地在Docker容器中运行大多数GUI程序且不出错。Docker是一个开源项目&#xff0c;提供了一个打包、分发和运行任意程序的轻量级容器的开放平台。它没有语言支持、框架或…

【python】Get与Post的区别?(面试官最想听到的答案)

GET和POST是HTTP请求的两种基本方法&#xff0c;要说它们的区别&#xff0c;接触过WEB开发的人都能说出一二。 最直观的区别就是GET把参数包含在URL中&#xff0c;POST通过request body传递参数。 你可能自己写过无数个GET和POST请求&#xff0c;或者已经看过很多权威网站总结出…

大数据之Kafka集群安装及简单使用

目录1、Kafka集群部署2、Kafka常用操作命令 目录 1、Kafka集群部署 1.1、下载安装包 http://kafka.apache.org/downloads.html 在linux中使用wget命令下载安装包 wget http://mirrors.hust.edu.cn/apache/kafka/0.8.2.2/kafka_2.11-0.8.2.2.tgz 1.2、解压安装包 tar -z…

Python爬虫入门之Urllib库的基本使用

那么接下来&#xff0c;小伙伴们就一起和我真正迈向我们的爬虫之路吧。 1.分分钟扒一个网页下来 怎样扒网页呢&#xff1f;其实就是根据URL来获取它的网页信息&#xff0c;虽然我们在浏览器中看到的是一幅幅优美的画面&#xff0c;但是其实是由浏览器解释才呈现出来的&#xf…

【python】hashlib.shasha256练习注册 --笔记

用户注册和登录import csv import hashlib#注册将用户信息填写到csv文件中 def register():username input(用户名:)password input(密码:)user []user.append(username)user.append(hashlib.sha256(password.encode(utf-8)).hexdigest())with open(t2/users.csv, a, newlin…

《3ds Max疯狂设计学院》——1.6节3ds Max 2016新增的主要功能

本节书摘来自异步社区《3ds Max疯狂设计学院》一书中的第1章&#xff0c;第1.6节3ds Max 2016新增的主要功能&#xff0c;作者 曹茂鹏&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 1.6 3ds Max 2016新增的主要功能1&#xff0e;Max Creation Graph3ds Max…

大数据之Kafka内部原理详细介绍

目录前言&#xff1a;1、Kafka整体结构2、Consumer与topic关系3、Kafka消息的分发4、Consumer的负载均衡5、kafka文件存储机制总结&#xff1a; 目录 前言&#xff1a; 本篇文章所介绍的内容还是以了解为主&#xff0c;主要目的还是为了对Kafka有一个更深入的理解。主要介绍…

【python】urllib和urllib3,requests 简要概括---笔记

urllib和urllib3&#xff0c;requestsurl:协议://存放资源的地址&#xff08;域名&#xff09;/具体的资源https://bj.lianjia.com/zufang/dghfjhsjdf648.htmlurllib.request 用来发出请求urllib.parseurllib.request.urlopen(str) --->response对象request urllib.reques…

JS与APP原生控件交互

“热更新”、“热部署”相信对于混合式开发的童鞋一定不陌生&#xff0c;那么APP怎么避免每次升级都要在APP应用商店发布呢&#xff1f;这里就用到了混合式开发的概念&#xff0c;对于电商网站尤其显得重要&#xff0c;不可能每次发布一个活动&#xff0c;都要发布一个现版本&a…

《脱颖而出——成功网店经营之道》一2.6 连横:返利模式的应用及分销

本节书摘来异步社区《脱颖而出——成功网店经营之道》一书中的第2章&#xff0c;第2.6节&#xff0c;作者&#xff1a; 何小健 责编&#xff1a; 赵轩, 更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.6 连横&#xff1a;返利模式的应用及分销 脱颖而出——成功网店…

【python】os模块 递归删除文件夹所有文件 --笔记

os.environ 获取系统的环境变量 os.name nt -- windows \r\n | posix --- Linux \nos.path: import osprint(os.environ) print(os.environ[OS])print(os.path.abspath(t1/file01.py)) # 获取绝对路径 print(os.path.isabs(t1/file01.py)) # 判断所给的路径是否是一个绝对…

大数据之Spark集群安装及简单使用

目录1、Spark集群安装1.1. 安装 2、启动Spark Shell2.1、启动spark shell2.2、在spark shell中编写WordCount程序 目录 1、Spark集群安装 1.1. 安装 1.1.1. 机器部署 准备两台以上Linux服务器&#xff0c;安装好JDK1.7 1.1.2. 下载Spark安装包 下载地址&#xff1a;ht…