flask基本使用
一、flask安装以及启动
1、安装
pip install flask
2、开启第一个flask项目
新建文件HelloWord.py
3、参数配置
1)从配置对象中加载,创建配置的类 app.config.from_object("类名")
from flask import Flask class Config(object): DEBUG = True # 创建 Flask 类的对象,指向程序所在的包的名称 app = Flask(__name__) # 从配置对象中加载配置 app.config.from_object(Config) if name == "__main__" app.run()
2)创建配置文件 config.ini,并在配置文件中添加配置 app.config.from_pyfile("文件名")
DEBUG = True
在flask文件中调用配置文件
4、路由
指定路由地址
通过路由传参数
通过路由传递用户ID,来取到对应用户的信息。路由传递的参数默认当做 string 处理,也可以指定参数的类型
指定参数的类型
指定请求方式 methods
正则匹配路由
使用场景:限制用户访问,只有符合规则的路由参数才能访问(可以用来限流)
实现步骤:
1)导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
2)自定义转换器:自定义类继承于转换器基类
3)添加转换器到默认的转换器字典中
4)使用自定义转换器实现自定义匹配规则
5、视图
获取请求的参数
返回json数据
重定向
6、异常捕获
7、钩子函数
请求钩子是通过装饰器的形式实现,Flask支持四种请求钩子;
before_first_request: 在处理第一个请求前执行
before_request: 在每次请求前执行 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
after_request: 如果没有抛出错误,在每次请求后执行
teardown_request:在每次请求后执行 接受一个参数:错误信息,如果有相关错误抛出
二、flask的模板
1、基本使用
在项目下创建 templates
文件夹,用于存放所有的模板文件,并在目录下创建一个模板html文件 temp_demo1.html
设置 templates 文件夹属性以便能够在代码中有智能提示
设置 html 中的模板语言,以便在 html 有智能提示
创建视图函数,将该模板内容进行渲染返回
一个例子
python代码
html代码
2、过滤器
过滤器的本质就是函数
有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,而在模板中是不能直接调用 Python 中的某些方法,那么这就用到了过滤器。
a、使用方式:
1)过滤器的使用方式为:变量名 | 过滤器。
{{ variable | filter_name(*args) }}
2)如果没有任何参数传给过滤器,则可以把括号省略掉
{{ variable | filter_name }}
3)在 jinja2 中,过滤器是可以支持链式调用的
{{ "hello world" | reverse | upper }}
b、常见内置过滤器
字符串操作
safe:禁用转义
<p>{{ '<em>hello</em>' | safe }}</p>
hello
capitalize:把变量值的首字母转成大写,其余字母转小写
<p>{{ 'hello' | capitalize }}</p>
Hello
lower:把值转成小写
<p>{{ 'HELLO' | lower }}</p>
hello
upper:把值转成大写
<p>{{ 'hello' | upper }}</p>
HELLO
title:把值中的每个单词的首字母都转成大写
<p>{{ 'hello' | title }}</p>
Hello
reverse:字符串反转
<p>{{ 'olleh' | reverse }}</p>
hello
format:格式化输出
<p>{{ '%s is %d' | format('name',17) }}</p>
name is 17
striptags:渲染之前把值中所有的HTML标签都删掉
<p>{{ '<em>hello</em>' | striptags }}</p>
hello
truncate: 字符串截断
<p>{{ 'hello every one' | truncate(9)}}</p>
hello...
列表操作
first:取第一个元素 1
<p>{{ [1,2,3,4,5,6] | first }}</p>
last:取最后一个元素 6
<p>{{ [1,2,3,4,5,6] | last }}</p>
length:获取列表长度 21
<p>{{ [1,2,3,4,5,6] | length }}</p>
sum:列表求和 6
<p>{{ [1,2,3,4,5,6] | sum }}</p>
sort:列表排序 [1,2,3,4,5,6]
<p>{{ [6,2,3,1,5,4] | sort }}</p>
语句过滤
{% filter upper %}
#一大堆文字#
{% endfilter %}
自定义过滤器
过滤器的本质是函数。
当模板内置的过滤器不能满足需求,可以自定义过滤器。自定义过滤器有两种实现方式:
1)一种是通过Flask应用对象的 add_template_filter 方法
2)通过装饰器来实现自定义过滤器
重要:自定义的过滤器名称如果和内置的过滤器重名,会覆盖内置的过滤器。
自定义列表反转过滤器
使用列表反转过滤器
3、控制代码模块
控制代码块主要包含两个:
1) if/else if /else / endif
Jinja2 语法中的if语句跟 Python 中的 if 语句相似,后面的布尔值或返回布尔值的表达式将决定代码中的哪个流程会被执行
2) for / endfor
在 Jinja2 中使用循环来迭代任何列表或者生成器函数
for循环中一些特殊的变量
cycle函数会在每次循环的时候,返回其参数中的下一个元素,
demo:
4、模板代码复用
宏 macro
1)把它看作 Jinja2 中的一个函数,它会返回一个模板或者 HTML 字符串
2)为了避免反复地编写同样的模板代码,出现代码冗余,可以把他们写成函数以进行重用
3)需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复
继承
模板继承是为了重用模板中的公共内容。
继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写。
1)相当于在父模板中挖个坑,当子模板继承父模板时,可以进行填充。
2)子模板使用 extends 指令声明这个模板继承自哪个模板
3)父模板中定义的块在子模板中被重新定义,在子模板中调用父模板的内容可以使用super()
父模板
子模板
继承使用时注意点:
1)不支持多继承
2)为了便于阅读,在子模板中使用extends时,尽量写在模板的第一行
3)不能在一个模板文件中定义多个相同名字的block标签。
4)当在页面中使用多个block标签时,建议给结束标签起个名字,当多个block嵌套时,阅读性更好。
包含
将另一个模板整个加载到当前模板中,并直接渲染。
1)include的使用
{% include 'hello.html' %}
包含在使用时,如果包含的模板文件不存在时,程序会抛出TemplateNotFound异常,可以加上 ignore missing 关键字。如果包含的模板文件不存在,会忽略这条include语句。
2)include 的使用加上关键字ignore missing
{% include 'hello.html' ignore missing %}
5、模板中的特有变量
可以在自己的模板中访问一些 Flask 默认内置的函数和对象
config
你可以从模板中直接访问Flask当前的config对象: {{config.SQLALCHEMY_DATABASE_URI}} sqlite:///database.db
request
就是flask中代表当前请求的request对象: {{request.url}} http://127.0.0.1
session
为Flask的session对象: {{session.new}} True
g变量
在视图函数中设置g变量的 name 属性的值,然后在模板中直接可以取出: {{ g.name }} anndy
url_for()
url_for会根据传入的路由器函数名,返回该路由对应的URL,在模板中始终使用url_for()就可以安全的修改路由绑定的URL,则不比担心模板中渲染出错的链接: {{url_for('home')}} /
如果我们定义的路由URL是带有参数的,则可以把它们作为关键字参数传入url_for(),Flask会把他们填充进最终生成的URL中: {{ url_for('post', post_id=1)}} /post/1
get_flashed_messages()
这个函数会返回之前在flask中通过flask()传入的消息的列表,flash函数的作用很简单,可以把由Python字符串表示的消息加入一个消息队列中,再使用get_flashed_message()函数取出它们并消费掉:
{%for message in get_flashed_messages()%}
{{message}}
{%endfor%}
6、Flask-WTF表单
Web表单
Web 表单是 Web 应用程序的基本功能。
它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。
在Flask中,为了处理web表单,我们可以使用 Flask-WTF 扩展,它封装了 WTForms,并且它有验证表单数据的功能
WTForms支持的HTML标准字段
WTForms常用验证函数
注意:
使用 Flask-WTF 需要配置参数 SECRET_KEY。
CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。 SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密匙生成加密令牌。
一、flask安装以及启动
1、安装
pip install flask
2、开启第一个flask项目
新建文件HelloWord.py
3、参数配置
1)从配置对象中加载,创建配置的类 app.config.from_object("类名")
from flask import Flask class Config(object): DEBUG = True # 创建 Flask 类的对象,指向程序所在的包的名称 app = Flask(__name__) # 从配置对象中加载配置 app.config.from_object(Config) if name == "__main__" app.run()
2)创建配置文件 config.ini,并在配置文件中添加配置 app.config.from_pyfile("文件名")
DEBUG = True
在flask文件中调用配置文件
4、路由
指定路由地址
通过路由传参数
通过路由传递用户ID,来取到对应用户的信息。路由传递的参数默认当做 string 处理,也可以指定参数的类型
指定参数的类型
指定请求方式 methods
正则匹配路由
使用场景:限制用户访问,只有符合规则的路由参数才能访问(可以用来限流)
实现步骤:
1)导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
2)自定义转换器:自定义类继承于转换器基类
3)添加转换器到默认的转换器字典中
4)使用自定义转换器实现自定义匹配规则
5、视图
获取请求的参数
返回json数据
重定向
6、异常捕获
7、钩子函数
请求钩子是通过装饰器的形式实现,Flask支持四种请求钩子;
before_first_request: 在处理第一个请求前执行
before_request: 在每次请求前执行 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
after_request: 如果没有抛出错误,在每次请求后执行
teardown_request:在每次请求后执行 接受一个参数:错误信息,如果有相关错误抛出
二、flask的模板
1、基本使用
在项目下创建 templates
文件夹,用于存放所有的模板文件,并在目录下创建一个模板html文件 temp_demo1.html
设置 templates 文件夹属性以便能够在代码中有智能提示
设置 html 中的模板语言,以便在 html 有智能提示
创建视图函数,将该模板内容进行渲染返回
一个例子
python代码
html代码
2、过滤器
过滤器的本质就是函数
有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,而在模板中是不能直接调用 Python 中的某些方法,那么这就用到了过滤器。
a、使用方式:
1)过滤器的使用方式为:变量名 | 过滤器。
{{ variable | filter_name(*args) }}
2)如果没有任何参数传给过滤器,则可以把括号省略掉
{{ variable | filter_name }}
3)在 jinja2 中,过滤器是可以支持链式调用的
{{ "hello world" | reverse | upper }}
b、常见内置过滤器
字符串操作
safe:禁用转义
<p>{{ '<em>hello</em>' | safe }}</p>
hello
capitalize:把变量值的首字母转成大写,其余字母转小写
<p>{{ 'hello' | capitalize }}</p>
Hello
lower:把值转成小写
<p>{{ 'HELLO' | lower }}</p>
hello
upper:把值转成大写
<p>{{ 'hello' | upper }}</p>
HELLO
title:把值中的每个单词的首字母都转成大写
<p>{{ 'hello' | title }}</p>
Hello
reverse:字符串反转
<p>{{ 'olleh' | reverse }}</p>
hello
format:格式化输出
<p>{{ '%s is %d' | format('name',17) }}</p>
name is 17
striptags:渲染之前把值中所有的HTML标签都删掉
<p>{{ '<em>hello</em>' | striptags }}</p>
hello
truncate: 字符串截断
<p>{{ 'hello every one' | truncate(9)}}</p>
hello...
列表操作
first:取第一个元素 1
<p>{{ [1,2,3,4,5,6] | first }}</p>
last:取最后一个元素 6
<p>{{ [1,2,3,4,5,6] | last }}</p>
length:获取列表长度 21
<p>{{ [1,2,3,4,5,6] | length }}</p>
sum:列表求和 6
<p>{{ [1,2,3,4,5,6] | sum }}</p>
sort:列表排序 [1,2,3,4,5,6]
<p>{{ [6,2,3,1,5,4] | sort }}</p>
语句过滤
{% filter upper %}
#一大堆文字#
{% endfilter %}
自定义过滤器
过滤器的本质是函数。
当模板内置的过滤器不能满足需求,可以自定义过滤器。自定义过滤器有两种实现方式:
1)一种是通过Flask应用对象的 add_template_filter 方法
2)通过装饰器来实现自定义过滤器
重要:自定义的过滤器名称如果和内置的过滤器重名,会覆盖内置的过滤器。
自定义列表反转过滤器
使用列表反转过滤器
3、控制代码模块
控制代码块主要包含两个:
1) if/else if /else / endif
Jinja2 语法中的if语句跟 Python 中的 if 语句相似,后面的布尔值或返回布尔值的表达式将决定代码中的哪个流程会被执行
2) for / endfor
在 Jinja2 中使用循环来迭代任何列表或者生成器函数
for循环中一些特殊的变量
cycle函数会在每次循环的时候,返回其参数中的下一个元素,
demo:
4、模板代码复用
宏 macro
1)把它看作 Jinja2 中的一个函数,它会返回一个模板或者 HTML 字符串
2)为了避免反复地编写同样的模板代码,出现代码冗余,可以把他们写成函数以进行重用
3)需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复
继承
模板继承是为了重用模板中的公共内容。
继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写。
1)相当于在父模板中挖个坑,当子模板继承父模板时,可以进行填充。
2)子模板使用 extends 指令声明这个模板继承自哪个模板
3)父模板中定义的块在子模板中被重新定义,在子模板中调用父模板的内容可以使用super()
父模板
子模板
继承使用时注意点:
1)不支持多继承
2)为了便于阅读,在子模板中使用extends时,尽量写在模板的第一行
3)不能在一个模板文件中定义多个相同名字的block标签。
4)当在页面中使用多个block标签时,建议给结束标签起个名字,当多个block嵌套时,阅读性更好。
包含
将另一个模板整个加载到当前模板中,并直接渲染。
1)include的使用
{% include 'hello.html' %}
包含在使用时,如果包含的模板文件不存在时,程序会抛出TemplateNotFound异常,可以加上 ignore missing 关键字。如果包含的模板文件不存在,会忽略这条include语句。
2)include 的使用加上关键字ignore missing
{% include 'hello.html' ignore missing %}
5、模板中的特有变量
可以在自己的模板中访问一些 Flask 默认内置的函数和对象
config
你可以从模板中直接访问Flask当前的config对象: {{config.SQLALCHEMY_DATABASE_URI}} sqlite:///database.db
request
就是flask中代表当前请求的request对象: {{request.url}} http://127.0.0.1
session
为Flask的session对象: {{session.new}} True
g变量
在视图函数中设置g变量的 name 属性的值,然后在模板中直接可以取出: {{ g.name }} anndy
url_for()
url_for会根据传入的路由器函数名,返回该路由对应的URL,在模板中始终使用url_for()就可以安全的修改路由绑定的URL,则不比担心模板中渲染出错的链接: {{url_for('home')}} /
如果我们定义的路由URL是带有参数的,则可以把它们作为关键字参数传入url_for(),Flask会把他们填充进最终生成的URL中: {{ url_for('post', post_id=1)}} /post/1
get_flashed_messages()
这个函数会返回之前在flask中通过flask()传入的消息的列表,flash函数的作用很简单,可以把由Python字符串表示的消息加入一个消息队列中,再使用get_flashed_message()函数取出它们并消费掉:
{%for message in get_flashed_messages()%}
{{message}}
{%endfor%}
6、Flask-WTF表单
Web表单
Web 表单是 Web 应用程序的基本功能。
它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。
在Flask中,为了处理web表单,我们可以使用 Flask-WTF 扩展,它封装了 WTForms,并且它有验证表单数据的功能
WTForms支持的HTML标准字段
WTForms常用验证函数
注意:
使用 Flask-WTF 需要配置参数 SECRET_KEY。
CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。 SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密匙生成加密令牌。