会话控制原理

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

cookie

  • 说明:

    由于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() }}

Flask—02-Flask会话控制与模板引擎的更多相关文章

  1. Flask从入门到精通之Jinja2模板引擎

    我们使用一个简单的例子切入到Jinja2模板引擎,形式最简单的Jinja2模板引擎就是一个包含响应文本的文件,实例如下: <h1>Hello World!</h1> 最简单的包 ...

  2. 02 flask 请求钩子、异常捕获、上下文、Flask-Script 扩展、jinja2 模板引擎、csrf防范

    一 请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个 ...

  3. Flask之项目创建,路由以及会话控制

    Flask Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架. Flask 本身相当于一个内核,其他几乎 ...

  4. 【 Python】模块学习之Flask模板引擎:jinja2

    原文链接:https://www.cnblogs.com/dachenzi/p/8242713.html 模板的概念 要了解jinja2,那么需要先理解模板的概念.模板在Python的web开发中广泛 ...

  5. Python Flask Jinja2模板引擎

    模板 简介 模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请 求的上下文中才能知道. 渲染 使用真实值替换变量,再返回最终得到的响应字符串,这一过程 称为渲染.为了渲染模 ...

  6. flask框架下的jinja2模板引擎(1)(模板渲染)

    #转载请留言联系 模板是什么? 在 flask 框架中,视图函数有两个作用:处理业务逻辑和返回响应内容.在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本.模板作用即是承担视图函 ...

  7. day94:flask:Jinjia2模板引擎&flask中的CSRF攻击&Flask-SQLAlchemy的创建模型类和基本的增删改查

    目录 1.Jinjia2模板引擎 1.Jinjia2加载模板并传递数据到模板中 2.Jinjia2的模板语句 3.模板中特有的变量和函数 4.模板中内置的过滤器 5.自定义过滤器 6.模板继承 2.在 ...

  8. Flask 框架下 Jinja2 模板引擎高层 API 类——Environment

    Environment 类版本: 本文所描述的 Environment 类对应于 Jinja2-2.7 版本.   Environment 类功能: Environment 是 Jinja2 中的一个 ...

  9. flask的模板引擎jinja入门教程 包含一个通过网络实时传输Video视频流的示例

    本文首发于个人博客https://kezunlin.me/post/1e37a6/,欢迎阅读最新内容! tutorial to use python flask jinja templates and ...

随机推荐

  1. Windows的任务管理器怎么显示进程的图标

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Windows的任务管理器怎么显示进程的图标.

  2. Distinct 去掉重复 order by

    语法: select distinct user from book select * from sdudant order by sex asc,sNo 从表sdudant查找已性别升序排序,性别相 ...

  3. Mysql自动更新字段时间

    Mysql中更新某天数据可设置该条数据中的某个字段自动更新 ALTER TABLE `表名` MODIFY `字段名` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON U ...

  4. 移动H5页面,Android手机下,input获取焦点弹出系统虚拟键盘时,挡住input解决方法

    最近在写移动端页面的时候,遇到一个问题,在Android手机下,虚拟键盘会将input框遮挡住,具体情况如下图所示: 正常页面显示  IOS端显示情况 Android端显示情况 解决方式: <t ...

  5. pythion的定义函数和传递实参

    1.定义函数 例子: def greet_user(): """显示简单的问候语""" print("Hello!")g ...

  6. 【网络编程】Socket套接字网络编程模型

    一.Linux网络模型 -- Socket套接字编程 图片:Socket 抽象层 Socket编程--不同协议,统一接口 Socket的实质就是一个接口, 利用该接口,用户在使用不同的网络协议时,操作 ...

  7. LDA概率图模型之贝叶斯理解

    贝叶斯.概率分布与机器学习 转自:http://www.cnblogs.com/LeftNotEasy/archive/2010/09/27/1837163.html  本文由LeftNotEasy原 ...

  8. log4j2单独的配置与使用&log4j2+slf4j的结合的配置与使用

    转载自:https://github.com/iamyong 一.log4j2单独的配置与使用 所用jar文件 log4j-api-2.8.2.jar log4j-core-2.8.2.jar 配置文 ...

  9. Cloud Foundry和微服务Meetup重磅来袭

    CF 同学们: Cloud Foundry 2016 上海 Meetup 将在10月22日在上海港汇广场进行! 想要参会的小伙伴,请直戳  ~ 在过去的一年,CF 的技术有很多进展,微服务也是2016 ...

  10. C# WinForm 程序免安装 .NET Framework(XP/win7/win10环境运行)

    前文 首先感谢群里的大神宇内流云 提供的anyexec for windows版本. 经过本人搭建虚拟机在xp环境 使用anyexec运行winfrom程序后,测试通过,如下是用的xp运行winfro ...