请关注微信公众号:自动化测试实战

先来教大家一个pycharm设置默认模板的方法。我们每次新建模板或者平时写代码打开以后可能都要重复写# coding: utf-8这些代码,其实我们可以设置好模板,让它自动生成的:

  • 打开pycharm的setting(windows)或者preference(Mac)

  • 进入:

就可以看到:

右侧就是默认生成的模板了,在这里改成默认生成的代码,以后就不用每次都写那些固定的代码了。

现在我把代码改为:

这样每次我新建flask项目的时候默认就会生成这个模板了。

今天和接下来几天我们继续介绍模板,然后会有一个小项目,不会HTML也没关系,跟着船长一起写就可以了,等学完了flask你发现你会html了,也懂数据库的增删改查了,船长本来想专门讲前端的,后来觉得还是一起说算了,毕竟要不然时间就拖太长了。

过滤器:abs——绝对值

文件结构:

flaskDemo.py

# coding: utf-8

from flask import Flask, render_template
import flask app = Flask(__name__) # type: Flask
app.debug = True @app.route('/')
def login():
context = {
"name": "Warren",
"age": -18
}
return render_template('index.html', **context) if __name__ == '__main__':
app.run()

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>过滤器</title>
</head>
<body>
<p>{{ age | abs }}</p>
</body>
</html>

flaskDemo.py文件中age值是-18,如果我们在index.html文件中直接用{{ age }}那么页面返回的值就是-18,现在我们上面的代码给加了一个过滤器,就是age | abs后面的| abs就是一个过滤器了。在Python里,abs代表取绝对值。现在再执行代码,发现页面返回的就是18了。

| abs中,|叫做管道,所以过滤器就是在变量上,通过管道符号 | 加过滤器名称来使用的。

过滤器:default——默认值

我们再讲一个过滤器——default,代码:

flaskDemo.py

# coding: utf-8

from flask import Flask, render_template
import flask app = Flask(__name__) # type: Flask
app.debug = True @app.route('/')
def login():
context = {
"user": {
"name": "Warren",
"age": -18}
}
return render_template('index.html', **context) if __name__ == '__main__':
app.run()

index.html

<!DOCTYPE html>

<html lang="en">
<head>
<meta charset="UTF-8">
<title>过滤器</title>
</head>
<body>
<p>绝对值:{{ user.age | abs }}</p>
<p>默认值:{{ user.gender | default }}</p>
</body>
</html>

上面user.gender.py文件里context里是没有这个key的,我们现在执行代码:

看到默认值是空,现在把代码改为{{ user.gender | default('male') }}

也就是我们给gender这个key传一个默认值:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>过滤器</title>
</head>
<body>
<p>绝对值:{{ user.age | abs }}</p>
<p>默认值:{{ user.gender | default('male') }}</p>
</body>
</html>

执行代码,看到:

此外,default还可以传一个布尔类型的值,默认是False,就是说如果前面的值有值,那么就返回原值,如果没值(None,False)——False的情况,就用过滤器里面的值:

# coding: utf-8

from flask import Flask, render_template
import flask app = Flask(__name__) # type: Flask
app.debug = True @app.route('/')
def login():
context = {
"user": {
"name": "Warren",
"age": -18,
"gender": None}
}
return render_template('index.html', **context) if __name__ == '__main__':
app.run()

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>过滤器</title>
</head>
<body>
<p>绝对值:{{ user.age | abs }}</p>
<p>默认值:{{ user.gender | default('male', True) }}</p>
</body>
</html>

上面代码我们给default传了两个值,第二个是True,这时候执行代码,看到的默认值就是male

如果defaultFalse{{ user.gender | default('male', False) }}那么页面返回的就是None

除了上面的写法以外,还以用or代替,这种情况就是不使用过滤器:
.py文件不变

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>过滤器</title>
</head>
<body>
<p>绝对值:{{ user.age | abs }}</p>
<p>默认值:{{ user.gender or 'male'}}</p>
</body>
</html>

执行代码:

过滤器:转义

直接看代码比较方便:

flaskDemo.py

# coding: utf-8

from flask import Flask, render_template
import flask app = Flask(__name__) # type: Flask
app.debug = True @app.route('/')
def login():
context = {
"user": {
"name": "Warren",
"age": -18,
"gender": None,
"comment": u'<script>alert("弹出框")</script>'}
}
return render_template('index.html', **context) if __name__ == '__main__':
app.run()

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>过滤器</title>
</head>
<body>
<p>绝对值:{{ user.age | abs }}</p>
<p>默认值:{{ user.gender or 'male'}}</p>
<p>转义:{{ user.comment }}</p>
</body>
</html>

执行代码,看到页面返回的就是我们.py文件里写的,内容:

现在修改<p>转义:{{ user.comment }}</p><p>转义:{{ user.comment | safe }}</p>,再执行代码:

看到页面弹出了alert框,也就是说写的js代码生效了,在js中,弹出框就是<script>alert('提示信息')</script>(大家平时做测试时候也可以在输入框里输入一下这个,看一下开发们对这个有没有处理)。这就是safe过滤器的作用。

明天我们继续讲几个过滤器。今天这个大家趁着休息去试试吧~

flask第二十二篇——模板【4】过滤器的更多相关文章

  1. flask第二十四篇——模板【6】自定义过滤器

    请关注孟船长的公众号:自动化测试实战 大家想了解其他过滤器可以参考这里: http://jinja.pocoo.org/docs/dev/templates/#builtin-filters ---- ...

  2. flask第二十六篇——模板【控制语句】【2】

    如果你也在学flask,就请加船长的公众号:自动化测试实战 我们先补充一下for循环的知识,我们之前说过,flask是由Jinja2+sqlAlchemy+werkzeug组成的,我们现在学的控制语句 ...

  3. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  4. 【Python之路】第二十二篇--Django【基础篇】

    1 Django流程介绍 MTV模式       著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业 ...

  5. flask第十九篇——模板【3】

    请关注微信公众号:自动化测试实战 今天我们继续模板的知识,现在我们增加字典的复杂度,这个时候在render_template第二个参数可以传**title,以后我们会用**context代替原来的ti ...

  6. flask第十八篇——模板【2】

    请关注公众号:自动化测试实战 上一节我们介绍了模板的基本使用方法,现在我们想一个问题,如果把index.html放到template文件夹下面的文件夹该怎么办呢?其实很容易,当文件夹结构如下图所示时: ...

  7. Python之路(第二十二篇) 面向对象初级:概念、类属性

    一.面向对象概念 1. "面向对象(OOP)"是什么? 简单点说,“面向对象”是一种编程范式,而编程范式是按照不同的编程特点总结出来的编程方式.俗话说,条条大路通罗马,也就说我们使 ...

  8. flask第二十五篇——控制语句

    有兴趣的请加船长公众号:自动化测试实战 先和大家强调一个发邮件的问题 # coding: utf-8 import smtplib from email.mime.text import MIMETe ...

  9. 第二十二篇、IO多路复用 一

    一.简介io多路复用 可以监听多个文件描述符(socket对象)(文件句柄),一旦文件句柄出现变化,就会感知到 Linux中的 select,poll,epoll(内核2.6以上) 都是IO多路复用的 ...

随机推荐

  1. oracle连接数据库报错:ORA-01034: ORACLE not available(Oracle 不存在),ORA-27101: shared memory realm does not exist

    花一天半的时间解决客户端连接服务端的oracle数据库,无法连接问题.ORA-01034: ORACLE not available(Oracle 不存在),ORA-27101: shared mem ...

  2. Scrapy:学习笔记(2)——Scrapy项目

    Scrapy:学习笔记(2)——Scrapy项目 1.创建项目 创建一个Scrapy项目,并将其命名为“demo” scrapy startproject demo cd demo 稍等片刻后,Scr ...

  3. 用python解析word文件(段落篇(paragraph) 表格篇(table) 样式篇(style))

    首先需要安装相应的支持库: 直接在命令行执行pip install python-docx 示例代码如下: import docxfrom docx import Document #导入库 path ...

  4. Linux学习笔记之Linux启动级别

    对于绝大多数Linux程序员来说,进入Linux系统后一般看到的是黑乎乎的界面(开发模式),因为系统如果启动选择开发模式,会减少启动时间,优化内存等.但是通常我们刚安装完Linux系统,然后进去以后是 ...

  5. php面向对象多继承实现

    在PHP面向对象概念编程中,一个子类只能继承一个父类,但是从php5.4后新增traits实现代码复用机制变向达到多继承.Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立 ...

  6. 20155201 第十一周Java课堂实践

    一.表达式后缀表达式: a b x c d e / - f x + 二.mini dc MyDC.java import java.util.StringTokenizer; import java. ...

  7. 20145204《Java程序设计》第10周学习总结

    网络编程 网络编程:在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴.在发送和接收数据时,大部分的程序设计 ...

  8. 欧几里德和扩展欧几里德详解 以及例题CodeForces 7C

    欧几里德定理: 对于整数a,b来说,gcd(a, b)==gcd(b, a%b)==d(a与b的最大公约数),又称为辗转相除法 证明: 因为a是d的倍数,b是d的倍数:所以a%d==0:b%d==0: ...

  9. CCNA学习指南 -开放最短路径优先OSPF(单区域)

    在上个世纪九十年代撰写的<TCP/IP协议详解 卷一:协议>的动态选路中,内容大部分还是介绍 RIP路由选择信息协议,在互联网络如此发达的今天,RIP因为它的局限性逐步被OSPF取代. 在 ...

  10. Codeforces Round #394 (Div. 2) E. Dasha and Puzzle(dfs)

    http://codeforces.com/contest/761/problem/E 题意:给出一棵树,现在要把这棵树上的结点放置在笛卡尔坐标上,使得每一条边与x轴平行或者与y轴平行.输出可行解,即 ...