• Flask (二) cookie 与 session 模型


    会话技术

    Cookie

    客户端端的会话技术
    cookie本身由浏览器保存,通过Responsecookie写到浏览器上,下一次访问,浏览器会根据不同的规则携带cookie过来
    特点:
        - 客户端会话技术,浏览器的会话技术
        - 数据全都是存储在客户端中
        - 存储使用的键值对结构进行的存储
        - 特性
            - 支持过期时间
            - 默认会自动携带本网站的所有cookie
            - 根据域名进行cookie存储
            - 不能跨域名
            - 不能跨浏览器
        - Cookie是通过服务器创建的Response来创建的
     
     设置cookie:
        response.set_cookie(key,value[,max_age=None,exprise=None)]
            max_age: 整数,指定cookie过期时间
            expries: 整数,指定过期时间,可以指定一个具体日期时间
            max_ageexpries两个选一个指定
     获取cookie:
        request.cookie.get(key)
     删除cookie
        response.delete_cookie(key)
     

    session

    服务器端会话技术,依赖于cookie
    特点:
        - 服务端的会话技术
        - 所有数据存储在服务器中
        - 默认存储在内存中
            - django是默认做了数据持久化(存在了数据库中)
        - 存储结构也是key-value形势,键值对
        - session 是离不开cookie
    常用操作:
        设置session
            session[key’] = value
            
        获取session
            session.get(key,default=None) 根据键获取会话的值
            
        删除session
            pop(key) 删除某一值  
            clear()   清除所有
           

    模板Template

    模板是呈现给用户的界面
    在MVT中充当T的角色,实现了VT的解耦,开发中VT有这N:M的关系,一个V可以调用任意T,一个T可以被任意V调用
    模板处理分为两个过程
      1. 加载
      2. 渲染
    模板代码包含两个部分
      1. 静态HTML
      2. 动态插入的代码段
     

    Jinja2

    Flask中使用Jinja2模板引擎
    Jinja2Flask作者开发
      一个现代化设计和友好的Python模板语言
      仿Django的模板引擎
    优点
      速度快,被广泛使用
      HTML设计和后端Python分离
      减少Python复杂度
      常灵活,快速和安全
      提供了控制,继承等高级功能

    模板语法

    模板语法主要分为两种
      变量
      
    模板中的变量  {{ var }}
      视图传递给模板的数据
      面定义出来的数据
      变量不存在,默认忽略
    模板中的标签  {% tag  %}
      控制逻辑
      使用外部表达式
      创建变量
      定义
     

    结构标签

    block 块操作
      父模板挖坑,子模板填坑 
      {% block xxx %}
      {% endblock %}
    extends 继承
      {% extends xxx%}
      
      继承后保留块中的内容
      {{ super() }}
    include
      包含,将其他html包含进来,体现的是由零到一的概念
      {% include xxx%}
    marco
      宏定义,可以在模板中定义函数,在其它地方调用
      {% marco hello(name) %}
          {{ name }}
      {% endmarco %}
      
    宏定义可导入
      {% from xxximport xxx %}
      
     

    循环

    for
      {% for item in cols %}
        AA  
      {% else %}
        BB
      {% endfor %}
    可以使用和Python一样的forelse
    也可以获取循环信息 loop
    loop.first
    loop.last
    loop.index  
    loop.index0
    loop.revindex  
    loop.revindex0
     

    过滤器

    语法  
      {{ 变量|过滤器|过滤器… }}
    capitalize
    lower
    upper
    title
    trim
    reverse
    striptags 渲染之前,将值中标签去掉
    safe
    default(1)
    last
    first
    length
    sum
    sort
    ...
     

    模型Model

    Flask模型

    Flask默认并没有提供任何数据库操作的API
    我们可以选择任何适合自己项目的数据库来使用
    Flask中可以自己的选择数据,用原生语句实现功能,也可以选择ORMSQLAlchemyMongoEngine
    原生SQL缺点
      代码利用率低,条件复杂代码语句越长,有很多相似语句
      SQL是在业务逻辑中拼出来的,修改需要了解业务逻辑
      直接写SQL容易忽视SQL问题
      
     

    ORM

    将对对象的操作转换为原生SQL
    优点
      易用性,可以有效减少重复SQL
      性能损耗少
      设计灵活,可以轻松实现复杂查询
      移植性好
    python的ORM(SQLAlchemy)
    针对于Flask的支持
      pip install flask-sqlalchemy
    数据库连接
        dialect+driver://username:password@host:port/database
    
    
    dialect: 数据库实现
    driver: 数据库的驱动
    username: 用户名 
    password: 密码
    host: 主机
    port: 端口
    database: 数据库
     

    连接SQLite

     
    连接数据库需要指定配置
        app.config[SQLALCHEMY_DATABASE_URI’] = DB_URI
        app.config[SQLALCHEMY_TRAKE_MODIFICATIONS’]=False 
        禁止对象追踪修改
    SQLite数据库连接不需要额外驱动,也不需要用户名和密码
    SQLite连接的URI
        DB_URI = sqlite:///sqlite3.db
    db = SQLAlchemy()
    db.init_app(app)
     

    连接MySQL

    USERNAME=root
    PASSWORD=root
    HOSTNAME = localhost
    PORT=3306
    DATABASE=HelloFlask
    DB_URI=mysql+pymsql://{}:{}@{}:{}/{}’.format(
      USERNAME,
      PASSWORD,
      HOSTNAME,
      PORT,
      DATABASE)
     

    创建模型

    class Person(db.Model):
        __tablename__=person
        id = db.Column(db.Integer,primary_key=True)
        name = db.Column(db.String(16),unique=True)
    
    
    字段类型
        Integer
        Float
        String
        
    常用约束
        primary_key
        autoincrement
        unique
        default
    数据操作
        创建数据库
            db.create_all()
        删除数据库
            db.drop_all()
        在事务中处理,数据插入
            db.session.add(object)
            db.session.commit()
        获取所有数据
            Person.query.all()
        
     
  • 相关阅读:
    protobuf 一个c++示例
    protobuf 之 MessageLite 接口摘录
    export setenv
    Centos java 安装
    C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用
    centos 安装tkdiff
    Redis 入门指南
    VB.NET+三层 机房收费系统之组合查询
    Android studio 插件之 GsonFormat (自己主动生成javabean)
    ubuntu14.04恢复系统默认中文字体
  • 原文地址:https://www.cnblogs.com/gugubeng/p/9722709.html
Copyright © 2020-2023  润新知