• 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

      

  • 相关阅读:
    Spring Batch与ETL工具比较
    Spring Batch基本概念
    SpringBatch介绍
    2019第51周日
    用arthas的watch方法观察执行方法的输入输出
    三人行必有我师
    用arthas查看JVM已加载的类及方法信息
    线上问题排查利器Arthas
    换个视觉
    Java Servlet:服务器小程序
  • 原文地址:https://www.cnblogs.com/W-Zing/p/9544428.html
Copyright © 2020-2023  润新知