Flask入门之自定义过滤器(匹配器)
1. 动态路由的匹配器?
不知道这种叫啥名,啥用法,暂且叫做匹配器吧。
Flask自带的匹配器可以说有四种吧(保守数字,就我学到的)
- 动态路由本身,可以传任何参数字符串或者数字,如:<username>
- 只能传整形数字,如:<int:user_id>
- 只能传浮点型数字,如:<float:num>
- 只能传path路径,如:<path:url>
举个例子
from flask import Flask
app = Flask(__name__)
@app.route('/user/<int:user_id>'
def user(user_id):
return 'Hello,%d' %user_id
if __name__ == '__main__':
app.run(debug=True)
这个user的路由只能响应整型的数字路径,不能输入字符串的
当然上面的很简单,接下来,我要定义一个使用更广泛,功能更强大的
正则匹配器
#coding:utf-8 from flask import Flask
from werkzeug.routing import BaseConverter #定义正则转换器的类
class RegexConverter(BaseConverter):
def __init__(self,url_map,*items):
super(RegexConverter, self).__init__(url_map)
self.regex=items[0] app = Flask(__name__)
#实例化
app.url_map.converters['regex']=RegexConverter @app.route('/user/<regex("([a-z]|[A-Z]){4}"):username>', methods=['POST', 'GET'])
def user(username):
return 'Hello,%s' % username if __name__ == '__main__':
app.run(debug=True)
我们在转化器中规定,只能是四个英文字符才能被这个路由匹配,多余或者少于都不行
我们来看看效果,先输入Bikmin,五个字符,Not Found

再来输入正确的字符数字:Ming

现在已经成功@@
2. HTML中的过滤器
HTML中经常要使用各种转换器
最常见的就是safe了(这是自带的)
更多官方过滤器请查看: List of Builtin Filters
我们先举个safe的例子了解下这个过滤器是如何作用的
#Sample.py
@app.route('/home')
def hone():
return render_template('index.html',title='<h1>Hello,World!</h1>')
#index.html
<body>
{{ title }}
</body>
运行,输出如图

这是为什么呢?因为Jinjia2处于安全考虑,没有进行转义
这种情况下,我们就可以使用safe转化器了(自带的)
将#index.html 改为
<body>
{{ title|safe }}
</body>
再次运行,输出如图

附:上面这种情况除了过滤器起之外,还有另一种方法:块
#index.html
<body>
{% autoescape false %}
{{ title }}
{% endautoescape %}
</body>
同样的,我们也许需要自定义我们自己的过滤器
这里我们就自定义个,可以将markdown语法的文件进行转义输出到页面的过滤器
首先要先安装markdown这个库
pip install markdown
#Sample.py
# coding:utf-8
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/home')
def hone():
return render_template('index.html',title='## header 2')
# 这里定义一个过滤器,取名为'md'
@app.template_filter('md')
def md_to_html(txt):
from markdown import markdown
return markdown(txt)
if __name__ == '__main__':
app.run(debug=True)
现在我们就可以使用md这个过滤器了
#index.html
<body>
{{ title|md }}
</body>
运行,查看结果

这时我们发现,markdown语法(##)已经转换成html格式的<h2>标签,说明起作用了
当然我们还需要用前面讲过的safe进行 转义
#index.html
<body>
{{ title|md|safe }}
</body>

至此,我们已经学会了如何自定义一个过滤器了
-------------------------------------------------以下内容,扩展,选择性学习-------------------------------------------------
在日常工作中,我们不能只对变量进行md转换吧?
我们可能会从一个文本中进行读取,然后渲染到html页面中
这时我们就要定义一个函数,读取文本内容到内存中,赋值给变量,在对其进行md转换。
首先我们要写一个markdown格式的文件,注意不要用notepad来写,读取的时候会有编码错误,调都调不回来
建议使用Pycharm来新建一个http_methods.md的文件并写入:
# 常见的HTTP方法 ## GET
浏览器告知服务器:只获取页面的信息发给我
这是常用的方法 ## POST
浏览器告知服务器:想在URL中发布新信息
并且,服务器必须确保数据已存储且只存储一次
这是HTML中发送表单数据到服务器的一种方法
代码如下:
#Sample.py
# coding:utf-8
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/home')
def hone():
return render_template('index.html',title='## header 2')
@app.template_filter('md')
def md_to_html(txt):
from markdown import markdown
return markdown(txt)
def read_md_file(filename):
with open(filename) as md_file:
content = reduce(lambda x,y:x+y,md_file.readlines())
return content.decode('utf-8')
# 注意:这里很重要,作用是把read_md_file()这个函数注册到所有的Jinjia模板中
# 不然html中会找不到这个函数而出错
@app.context_processor
def inject_methods():
return dict(read_md=read_md_file)
# read_md是html使用的函数名,read_md_file是上面定义的函数名
if __name__ == '__main__':
app.run(debug=True)
#index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ read_md('http_methods.md')|md|safe }}
</body>
</html>
运行,结果如下

已经打到我们想要的效果@@

Flask入门之自定义过滤器(匹配器)的更多相关文章
- Flask基础(14)-->自定义过滤器
Flask基础(13)-->自定义过滤器 什么是过滤器? 过滤器的本质就是函数.有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化.运算等等,而在模板中是不能直接调用 P ...
- EassyMock实践 自定义参数匹配器
虽然easymock中提供了大量的方法来进行参数匹配,但是对于一些特殊场合比如参数是复杂对象而又不能简单的通过equals()方法来比较,这些现有的参数匹配器就无能为力了.easymock为此提供了I ...
- Flask入门学习——自定义一个url转换器
我们知道,flask的url规则是可以添加变量部分的,这个参数变量是写在尖括号里的,比如:/item/<id>/,如果需要指出参数的类型要符合<converter:vai ...
- Mockito 2 参数匹配器
Mockito 通过使用 equals() 这种自然的 Java 样式来校验参数值.有时候,当需要有其他一些灵活性的时候,你可能会要求使用参数匹配(argument matchers). 请参考下面的 ...
- Hamcrest匹配器框架
其实在之前的文章中已经使用过 Hamcrest 匹配器框架,本篇文章将系统的介绍它的使用. 为什么要用Hamcrest匹配器框架 Hamcrest是一款软件测试框架, 可以通过现有的匹配器类检查代码中 ...
- Flask 自定义过滤器多个参数传入
非完整HTML文件: <div class="container" style="margin-top:50px;"> <div class= ...
- flask第二十四篇——模板【6】自定义过滤器
请关注孟船长的公众号:自动化测试实战 大家想了解其他过滤器可以参考这里: http://jinja.pocoo.org/docs/dev/templates/#builtin-filters ---- ...
- flask框架下的jinja2模板引擎(2)(过滤器与自定义过滤器)
flask框架下的jinja2模块引擎(1):https://www.cnblogs.com/chichung/p/9774556.html 这篇论文主要用来记录下 jinja2 的过滤器. 什么是过 ...
- flask的自定义过滤器
过滤器的本质是函数.当模板内置的过滤器不能满足需求,可以自定义过滤器.自定义过滤器有两种实现方式: 一种是通过Flask应用对象的 add_template_filter 方法 通过装饰器来实现自定义 ...
随机推荐
- 敏捷测试(2)--ATDD概念
什么是验收测试驱动开发 在准备实施一个功能或特性之前,首先团队需要定义出期望的质量标准和验收细则,以明确而且达成共识的验收测试计划(包含一系列测试场景)来驱动开发人员的TDD实践和测试人员的测试脚本开 ...
- Ubuntu快速截图
以前截图,都是按Print键全屏截图,Alt+Print可以截当前的窗口.同时把系统自带的截图工具放到面板上,用的时候点击一下,再选择区域截图,很是不方便.不过,Ubuntu允许自己定义快捷键.要自己 ...
- Cocos2D v2.0至v3.x简洁转换指南(四)
实现通用的update方法 在Cocos2d 2.x你需要2个步骤去实现在每帧调用update方法: // 1) schedule update [self scheduleUpdate]; ... ...
- Java进阶(九)正则表达式
java正则表达式 序 由于项目中使用到了利用正则表达式进行表单的校验,回想一下正则表达式的内容,忘得也差不多了,俗话说:"温故而知新,可以为师矣".今天就简单的温故一下正则表达式 ...
- 基于RTMP的实时流媒体的QoE分析
Holly French等人在论文<Real Time Video QoE Analysis of RTMP Streams>中,研究了基于RTMP的实时视频的QoE.在此记录一下. 他们 ...
- Microsoft Dynamics CRM 2011 JS操作集锦
1.Xrm.Page.context 用户ID:getUserId() 用户角色:getUserRoles() 用户语言:getUserLcid() 组织名称:getOrgUniqueName() 组 ...
- JavaScript单线程的疑问与解答
问: JavaScript是单线程的,有任务队列,比如使用setTimeou(func,secs)来在secs毫秒后向任务队列添加func.但是,setTimeout后面跟一个死循环,那么死循环导致任 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- OpenGL Shader Key Points (1)
1. Shader起步 1.1. 可编程管线 仅考虑Vertex shader和fragment shader: 1.2. Shader Object 在编译阶段生成,把shader源代码编译成 ...
- Maven部署项目到Tomcat
首先需要用MyEclipse建立一个Maven项目 为了不报403错误,tomcat目录下的tomcat-user.xml文件的配置如下: setting.xml配置如下,大家关注下Server的配置 ...