- Werkzeug 实现路由、调试和Web服务器网关接口
- Jinja2 实现了模板
routing 模块内部有:
- Rule类:用来构造不同的URL模式的对象,路由URL规则
- Map类 :存储所有的URL规则和一些配置参数
- BaseConverter的子类 :负责定义匹配规则
- MapAdapter类 :负责协调Rule做具体的匹配的工作
属性 | 说明 | 类型 |
data | 记录请求的数据,并转换为字符串 | * |
form | 记录请求中的表单数据 | MultiDict |
args | 记录请求中的查询参数 | MultiDict |
cookies | 记录请求中的cookie信息 | Dict |
headers | 记录请求中的报文头 | EnvironHeaders |
method | 记录请求使用的HTTP方法 | GET/POST |
url | 记录请求的URL地址 | string |
files | 记录请求上传的文件 | * |
1 @app.route('/', methods=['POST']) 2 def index(): 3 pic = request.files.get('pic') 4 pic.save('./static/1.png') 5 return 'index'
# 默认判断账号与密码是正确的
response = make_response('success')
增 / 改(设置):response.set_cookie('user_id', '1', max_age=3600) # 名称 值 有效期(秒)
删:response.delete_cookie('user_id')
查:user_id = request.cookies.get('user_id', '')
# 使用 session 的话,需要配置 secret_key app.config['SECRET_KEY'] = 'fjkasdjfklasjdfl' # 后面的值随便设置
增 / 改(设置):session['user_id'] = "1" 删:session.pop('user_id', None) 查:user_id = session.get('user_id', '')
一、请求上下文(request context)
request :封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get('user'),获取的是get请求的参数。
session :用来记录请求会话中的信息,针对的是用户信息。举例:session['name'] = user.id,可以记录用户信息。还可以通过session.get('name')获取用户信息。
二、应用上下文(application context)
应用上下文对象有:current_app 、g
current_app :应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量。(例:current_app.name 和 current_app.test_value='value')
g变量 :g 作为 flask 程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g 保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别。(例:g.name='abc')
请求上下文 和 应用上下文 的区别:
- 请求上下文:保存了客户端和服务器交互的数据
- 应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等
安装:pip install flask-script
示例代码:
1 from flask import Flask 2 from flask_script import Manager 3 4 app = Flask(__name__) 5 # 把 Manager 类和应用程序实例进行关联 6 manager = Manager(app) 7 8 @app.route('/') 9 def index(): 10 return 'hello word!' 11 12 if __name__ == "__main__": 13 manager.run()
使用模板的好处:
-
视图函数只负责业务逻辑和数据处理(业务逻辑方面)
-
而模板则取到视图函数的数据结果进行展示(视图展示方面)
-
代码结构清晰,耦合度低
-
Flask提供的 render_template 函数封装了该模板引擎
-
render_template 函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值。
使用:
1、{{}} 来表示变量名,这种 {{}} 语法叫做变量代码块(例:<h1>{{ post.title }}</h1>)
2、用 {%%} 定义的控制代码块,可以实现一些语言层次的功能,比如循环或者if语句
1 @app.route('/') 2 def index(): 3 # 往模板中传入的数据 4 my_str = 'Hello word!' 5 my_int = 10 6 my_array = [3, 4, 2, 1, 7, 9] 7 my_dict = { 8 'name': 'W-Zing', 9 'age': 18 10 } 11 return render_template('temp_demo1.html', 12 my_str=my_str, 13 my_int=my_int, 14 my_array=my_array, 15 my_dict=my_dict 16 )
- 模板中的代码
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 我的模板html内容 9 <br/>{{ my_str }} 10 <br/>{{ my_int }} 11 <br/>{{ my_array }} 12 <br/>{{ my_dict }} 13 14 15 还可以进行相关的运算、取值 16 <br/> my_int + 10 的和为:{{ my_int + 10 }} 17 <br/> my_int + my_array第0个值的和为:{{ my_int + my_array[0] }} 18 <br/> my_array 第0个值为:{{ my_array[0] }} 19 <br/> my_array 第1个值为:{{ my_array.1 }} 20 <br/> my_dict 中 name 的值为:{{ my_dict['name'] }} 21 <br/> my_dict 中 age 的值为:{{ my_dict.age }} 22 23 24 </body> 25 </html>
过滤器的使用方式为:变量名 | 过滤器。
{{variable | filter_name(*args)}} # 如果没有任何参数传给过滤器,则可以把括号省略掉
链式调用:
{{ "hello world" | reverse | upper }}
常见的内建过滤器
字符串操作:
1、safe:禁用转义
2、capitalize:把变量值的首字母转成大写,其余字母转小写
3、lower:把值转成小写
4、upper:把值转成大写
5、title:把值中的每个单词的首字母都转成大写
6、reverse:字符串反转
7、format:格式化输出
8、striptags:渲染之前把值中所有的HTML标签都删掉
9、truncate: 字符串截断
列表操作:
1、first:取第一个元素
2、last:取最后一个元素
3、length:获取列表长度
4、sum:列表求和
5、sort:列表排序
语句块过滤:
{% filter upper %}
#一堆文字#
{% endfilter %}
def do_listreverse(test): pass app.add_template_filter(do_listreverse,'lireverse')
2、通过装饰器来实现自定义过滤器(@app.template_filter)
@app.template_filter('lireverse') def do_listreverse(test): pass
提示:自定义的过滤器名称如果和内置的过滤器重名,会覆盖内置的过滤器。
1 {% for item in my_list if item.id != 5 %} 2 {% if loop.index == 1 %} 3 {{ item.value }} 4 {% elif loop.index == 2 %} 5 {{ item.value }} 6 {% else %} 7 {{ item.value }} 8 {% endif %} 9 {% endfor %}