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.set_cookie('user_id', '1', max_age=3600)  # 名称 值 有效期(秒)
删:response.delete_cookie('user_id')
查:user_id = request.cookies.get('user_id')

Session

增 / 改(设置):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

  

  

    

 

猜你喜欢

转载自www.cnblogs.com/W-Zing/p/9544428.html