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) 收藏 举报
浙公网安备 33010602011771号