• Flask—02-Flask会话控制与模板引擎


    会话控制原理

    • 说明:概念百度说明的很详细,请自行百度
    • 说明:

      由于HTTP协议无状态无连接的特点,导致一个用户在同一网站做连续操作时,需要不断的提供身份信息;为了解决这个问题,我们可以通过cookie携带特定的信息加以解决。当首次访问网站时设置cookie信息,以后每次再访问该网站时,浏览器会自动携带cookie信息。

    • 使用:

      from flask import Blueprint, request, make_response
      
      cookie = Blueprint('cookie', __name__, url_prefix='/cookie')
      
      # 获取
      @cookie.route('/get/')
      def get_cookie():
          return request.cookies.get('name', '猴哥是我')
      
      # 设置
      @cookie.route('/set/')
      def set_cookie():
          resp = make_response('cookie已设置')
          # 设置cookie,默认有效期为浏览器关闭
          # expires:有效期,是一个datetime类型的参数
          # max_age:有效期,是一个int类型的参数,推荐使用
          resp.set_cookie('name', '八戒', max_age=10)
          return resp
      
      # 删除
      @cookie.route('/del/')
      def del_cookie():
          resp = make_response('cookie已删除')
          # 删除cookie,其实是设置cookie立即失效
          resp.delete_cookie('name')
          return resp
      

    session

    • 说明:

      session是一种比cookie更加安全的携带信息的方案,功能与cookie相同。

    • 分类:

      • server side session:数据存放在服务器上,客户端保存的是seesion_id(通过cookie传输)
      • client side session:将session数据加密编码,然后保存到客户端,flask默认采用的就是这种方案
    • 使用:

      from flask import Blueprint, session
      
      sess = Blueprint('sess', __name__, url_prefix='/session')
      
      # 获取
      @sess.route('/get/')
      def get_session():
          return session.get('name', 'who are you?')
      
      # 设置
      @sess.route('/set/')
      def set_session():
          # 设置有效期,默认浏览器关闭即失效
          # 设置为True,session有效期为永久
          # 永久的时间由PERMANENT_SESSION_LIFETIME配置选项决定,默认31天
          session.permanent = True
          session['name'] = 'cuihua'
          return 'session已设置'
      
      # 删除
      @sess.route('/del/')
      def del_session():
          # 删除指定的session,第二个参数设置为None,session不存在也不报错
          # session.pop('name', None)
          # 清空session
          session.clear()
          return 'session已删除'
      

    flask-session

    • 说明:将session数据保存到服务器的解决方案。

    • 安装:pip install flask-session

    • 使用:

      from flask import Flask, session
      from flask_script import Manager
      from redis import Redis
      from flask_session import Session
      
      app = Flask(name)
      app.config['SECRET_KEY'] = '123456'
      app.config['SESSION_TYPE'] = 'redis'
      app.config['SESSION_REDIS'] = Redis()
      manager = Manager(app)
      sess = Session(app)
      # 可以通过两步进行初始化
      # sess.init_app(app)
      
      @app.route('/')
      def index():
          return 'flask-session'
      
      @app.route('/get/')
      def get_session():
          return session.get('name', '你是谁?')
      
      @app.route('/set/')
      def set_session():
          session['name'] = 'houge'
            return 'session已设置'
      
      if __name__ == '__main__':
           manager.run()
      

    模板引擎

    • 说明:

      模板文件就是安装特定的语法规则书写的负责展示效果的HTML文件;模板引擎就是提供这种特定规则替换和解析的工具。

    • Jinja2:

      在flask中采用的时Jinja2的模板引擎,它是由flask核心开发组人员开发的。

    Jinja2语法

    • 目录结构

      project/        # 工程目录
          manage.py        # 启动控制文件
          templates/        # 模板文件目录
      
    • 模板渲染

      • templates目录下创建一个模板文件index.html,在其中写入页面内容
      • 在视图函数中渲染模板:render_template('index.html')
      • 渲染模板字符串:render_template_string('<h1>渲染模板字符串</h1>')
      • 设置模板文件自动加载:app.config['TEMPLATES_AUTO_RELOAD'] = True,调试模式会自动加载
    • 使用变量

      • 需要解析的变量需要放在{{ }}
      • 渲染模板文件时需要传递相关变量:render_template('var.html', name='goudan')
      • 注释写在{# #}
    • 使用过滤器

      • 说明:过滤器就是对要解析的变量进行特定的处理,然后再输出。
      • 使用:{{ 变量|过滤器 }},如:{{ name|upper }},就是将name转换为全大写输出
      • 常用过滤器:
      过滤器说明
      upper 全大写
      lower 全小写
      title 每个单词首字母大写
      capitalize 首字母大写
      trim 去掉两边的空白
      striptags 过滤HTML标签
      safe 渲染时不转义(默认全部转义),只能使用在信任的变量渲染
      • 动态开启关闭渲染转义
      {# 动态开启关闭转义 #}
      {% autoescape False %}
      <div>{{ user }}</div>
      {% endautoescape %}
      
    • 流程控制

      {% if name %}
          <h1>Hello {{ name }}!</h1>
      {% else %}
          <h1>Hello World!</h1>
      {% endif %}
      
      <ol>
          {% for i in range(5) %}
              <li>{{ i }}</li>
          {% endfor %}
      </ol>
      
    • 文件包含

      • 说明:

        当有多处相同的显示效果出现时,将内容单独提取出来,需要的地方直接包含进来即可。包含另一个文件,相当将其中的内容直接粘贴过来,避免了大量重复书写(复制粘贴)

      • 使用:{% include 'include2.html' %}

    • 宏的使用

      • 定义宏:{% macro 宏名(参数) %}宏内容{% endmacro %}
      • 调用宏:{{ 宏名(参数) }}
      • 导入宏:{% from '宏所在文件' import 宏名 %}
      • 说明:宏采用了类似于python中的函数进行定义和调用,可以减少代码的重复书写,而且比较灵活。
    • 模板继承

      • 说明:当一个网站的多个页面都很相似,只有细微的差别,可以通过模板继承减少重复书写。

      • 使用:

        • parents.html
        <html>
        <head>
            <meta charset="UTF-8">
            <title>{% block title %}基础模板标题{% endblock %}</title>
        </head>
        <body>
            {% block body %}<div>默认内容</div>{% endblock %}
        </body>
        </html>
        
        • children.html
        {# 继承自另一个模板 #}
        {% extends 'parents.html' %}
        
        {# 根据block可以修改原有的block内容 #}
        {% block title %}子模板标题{% endblock %}
        
        {% block body %}
            {# 保留基础模板中的内容 #}
            {{ super() }}
            <div>新加的内容</div>
        {% endblock %}
        
      • 提醒:若在子模板重写了一个block,原来的显示效果全丢了,八成的原因是忘记书写{{ super() }}

  • 相关阅读:
    第三方接口开发规范
    项目经理、技术经理、team leader
    ibatis #和$符号的区别,传入字符串而不加引号
    WindowManager.LayoutParams详解
    AIDL 编译报can be an out parameter, so you must declare it as in, out or inout原因探究
    map里的keyset()和entryset()方法.
    android 使用代码实现 RelativeLayout布局
    Android中的Selector
    intentfilter 之 data 「scheme, host, port, mimeType, path, pathPrefix, pathPattern」
    找信息的方法
  • 原文地址:https://www.cnblogs.com/swjblog/p/9726698.html
Copyright © 2020-2023  润新知