Flask(5)

一、FLASK-SQLALCHEMY - 关系映射

1、一对多

   1、语法实现:
         1、在 "多" 实体中
                 增加一个列,引用自“一”表的主键列               
                 外键列名 = db.Column(db.Integer,db.ForeignKey('主表.主键'))
         2、在"一"的实体中   
                 增加关联属性以及反向引用关系
           ex:
               关联属性:
                     在 course 对象中,通过一个属性能够得到对应的所有的teacher们
                     关联属性,是应该加在 Course 的实体类中
               反向引用:
                     在 teacher 对象中,通过一个属性能够得到对应的course。
                     反向引用关系属性,是应该加在 Teacher 的实体类中
   2、增加关联属性和反向引用关系:
                 属性名=db.relationship('多表实体类名',关系选项)
               ex:属性名=db.relationship('多的实体类名',backref='属性名',lazy='dynamic')
         常用的关系选项:
                 选项名          说明
                backref       在关系的另一个模型中添加的反向引用属性名
                                   (准备在“多”的实体中增加对“一”的实体引用的属性名)
                lazy            指定如何加载当前的相关记录
                           select:       首次访问时加载记录
                           immediate: 源对象加载后马上加载相关记录
                           subquery:  效果同上,立即加载,但利用子查询方式加载记录
                           noload:      永不加载记录
                           dynamic:    默认不加载记录,但会提供加载记录的查询
                uselist         如果设置为False,表示不使用列表表示关联数据,而使用标量(变量)
                secondary    指定多对多关系映射中的关联表的名字

2、一对一

  1、什么是一对一
           A表中的一条记录只能与B表中的一条记录相关联
           B表中的一条记录只能与A表中的一条记录相关联
  2、在SQLAlchemy中的体现
           1、在任意一个类中增加
                 外键列名 = db.Column(db.Integer,db.ForeignKey('主键表.主键列'))
           2、在另外一个类中增加
                 关联属性 和 反向引用关系属性
                 属性=db.relationship('关联的实体类',backref='反向引用属性名',uselist=False)
         ex:class Wife(db.Model):
                 ... ...
                 teacher_id = db.Column(db.Integer,db.ForeignKey('teacher.id'))

                class Teacher(db.Model):
                 ...
                 wife = db.relationship('Wife',backref='teacher',lazy='dynamic',uselist=False)

3、多对多

   1、什么是多对多
           A表中的一条数据可以与B表中的任意多条数据关联
           B表中的一条数据可以与A表中的任意多条数据关联
   2、实现
             在数据库中使用第三张表来关联(关联表)
             在编程语言中,可以不编写对应的实体类       
       1、创建第三张表(并不需要实体类)
                 对象名=db.Table(
                     '关联名',#在数据库中的表名
                     db.Column('id',db.Integer,primary_key=True),#该表的主键
                     db.Column('外键列名',db.Integer,db.ForeignKey('主表.主键')),
                     db.Column('外键列名',db.Integer,db.ForeignKey('主表.主键')),
                 )
           例如:
             # 使用db.Table创建第三张关联表,不需要对应的实体类
             student_course = db.Table(
                 # 指定关联表的表名
                 'student_course',
                 # 指定关联表的主键
                 db.Column('id',db.Integer,primary_key=True),
                 # 指定外键,关联student表的主键
                 db.Column('student_id',db.Integer,db.ForeignKey('student.id')),
                 # 指定外键,关联course表的主键
                 db.Column('course_id',db.Integer,db.ForeignKey('course.id')),
             )

       2、增加关联属性 以及 反向引用关系:
                 在任意一个实体中:
                 关联属性名=db.relationship(
                     '关联的实体类',
                     secondary='关联的第三张表名',
                     lazy='dynamic',
                     backref=db.backref(
                     '反向引用属性名',
                     lazy='dynamic'
                     )
                 )
            ex:class Student(db.Model):
                     ... ...
                     courses=db.relationship(
                         'Course',
                         secondary='student_course',
                         lazy='dynamic',
                         backref=db.backref('students',lazy='dynamic')
                     )
          # 增加关联属性以及反向引用
              courses = db.relationship('Course',secondary='student_course',lazy = 'danamic',backref=db.backref('students',lazy='dynamic'))

二、cookies / cookie

1、什么是cookie

     cookie 是一种数据存储手段
     将一段文本保存在客户端(浏览器)的一种手段,并可以长时间保存

2、cookie的使用场合

     1、记住密码
     2、记住搜索关键词

3、Flask 中使用 cookies

   1、使用响应对象,将数据保存进cookies(客户端)
       1、响应对象:
         1.resp = make_response("响应字符串"|render_template())
         2.resp = redirect('地址')
             (响应状态码为302)
       2、cookies 的语法:
           响应对象.set_cookie(key,value,max_age)
           作用:保存cookie到客户端
           参数:key:保存的cookie的名称
                      value:保存的cookie的值
                      max_age:保存的时间,取值为数字,默认以 s 为单位
           取值:60:一分钟
                    60*60:一小时
                    60*60*24:一天
                    60*60*24*365:一年
   2、获取 cookie 的值
       1、每次向服务器发送请求时,都会把 cookie 中的数据封装到request中并带到服务器上。
           在flask中通过 request.cookies 获取所有的cookies的值
          (包含了当前站点对应的所有的cookies的值)
           ex: request.cookies['key']
                 request.cookies.get('key')
       2、判断数据是否在cookies中:
             if key in request.cookies:
                 数据存在cookies中
             else:
                 数据不在cookies中
   3、删除cookie的值
         响应对象.delete_cookie('key')

三、session - 会话

1、什么是session

     session是保存在服务器上,为每个浏览器所开辟的一段空间

2、session 在 Flask 中的实现

  1、配置 SECRET_KEY
         app.config['SECRET_KEY'] = "xieshadouxing"
         注意:“xieshadouxing”——的内容可以自己随便写
  2、使用session
         from flask import session
       1)向session中保存数据
             session['key'] = value
       2)从session中获取数据(取值)
             value = session['key']
             value = session.get('key','')
       3)从session中删除数据
             del session['key']

3.session  与  cookie 的异同:

  相同:都能够保存数据
  不同:
         1.保存地方不同
             session 是保存在服务器上的
             cookie  是保存在浏览器上的
         2.保存时长不同
             cookie  可以永久性保存
             session 临时性保存数据
         3.安全性问题
             session  安全级别较高
             cookie   安全级别较低

posted on 2018-11-08 21:14  破天荒的谎言、谈敷衍  阅读(247)  评论(0)    收藏  举报

导航