Flask_day02

Werkzeug库

Flask有两大核心:WerkzeugJinja2

  • Werkzeug 实现路由、调试和Web服务器网关接口
  • Jinja2 实现了模板

routing 模块内部有:

  • Rule类:用来构造不同的URL模式的对象,路由URL规则
  • Map类 :存储所有的URL规则和一些配置参数
  • BaseConverter的子类 :负责定义匹配规则
  • MapAdapter类 :负责协调Rule做具体的匹配的工作

获取请求参数(request

  request 就是flask中代表当前请求的 request 对象,其中一个请求上下文变量(理解成全局变量,在视图函数中直接使用可以取到当前本次请求)。

  常用属性如下:

属性 说明 类型
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'
View Code

状态保持(Cookie 、Session)

Cookie

# 默认判断账号与密码是正确的
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

# 使用 session 的话,需要配置 secret_key
app.config['SECRET_KEY'] = 'fjkasdjfklasjdfl'  # 后面的值随便设置
增 / 改(设置):session['user_id'] = "1"
删:session.pop('user_id', None)
查:user_id = session.get('user_id', '')

上下文(相当于一个容器,保存了 Flask 程序运行过程中的一些信息。)

一、请求上下文(request context)

  请求上下文对象有:request 、session

  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 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等

Flask-Script 扩展

  安装:pip install flask-script

  代码中要把 Manager 类和应用程序实例进行关联:manager = Manager(app)

  程序运行方法:python hello.py runserver 参数(参数可以通过--help查看)

  示例代码:

 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()
View Code

Jinja2模板引擎

  使用模板的好处:

  • 视图函数只负责业务逻辑和数据处理(业务逻辑方面)

  • 而模板则取到视图函数的数据结果进行展示(视图展示方面)

  • 代码结构清晰,耦合度低

  渲染模板函数:

  • Flask提供的 render_template 函数封装了该模板引擎

  • render_template 函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值。

  使用:

  1、{{}} 来表示变量名,这种 {{}} 语法叫做变量代码块(例:<h1>{{ post.title }}</h1>)

  2、用 {%%} 定义的控制代码块,可以实现一些语言层次的功能,比如循环或者if语句

  3、使用{# #} 进行注释,注释的内容不会在html中被渲染出来

  示例代码:

  • 创建视图函数,将该模板内容进行渲染返回
 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                            )
View Code
  • 模板中的代码
 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>
View Code

过滤器

  过滤器的使用方式为:变量名 | 过滤器。

{{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 %}

自定义过滤器

  过滤器的本质是函数。当模板内置的过滤器不能满足需求,可以自定义过滤器。自定义过滤器有两种实现方式:

  1、一种是通过Flask应用对象的 add_template_filter 方法

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 %}
View Code

  

原文地址:https://www.cnblogs.com/W-Zing/p/9544428.html