python全栈开发day69-cookie、session
一、ORM回顾
1. 内容回顾
1. Django中使用ORM连接MySQL的步骤:
1. 创建数据库
2. 告诉Django连接哪个数据库
在settings.py中设置数据库相关的链接信息
3. 告诉Django使用pymysql代替MySQLdb来连接数据库
在和setting.py同级的__init__.py中写上
import pynmysql
pymysql.install_as_MySQLdb()
4. 在models.py中定义类
5. 执行两个命令
1. python manage.py makemigrations --> 将model.py中的变更记录 登记在小本本上,对应的是app/migrations/xxx.py
2. python manage.py migrate --> 将上一步得到的变更记录翻译成SQL语句去数据库执行 2. ORM一对一(OneToOneField):
1. 完全可以存在一张表里 2. 为什么要拆分呢?
当一张表里字段比较多,
并且当某一部分字段的查询需求比另外一些要高很多的时候 3. ORM查询练习:
详见今日代码:周末ORM作业.py 4. ORM 单表操作:
1. create
2. get
3. delete
4. 修改
1. update() --> 只更新指定字段
2. obj.属性 = 值 --> 所有字段都更新
obj.save()
5. ORM外键操作
1. 外键应该设置在哪一张表里 --> 通常放在多的那一边
2. 正向查 .属性
3. 反向查 表名_set.all()
6. 多对多字段
1. 多对多字段应该设置在哪一张表?
2. 多对多的方法
1. add
2. set
3. clear
4. remove
7. ORM进阶
1. 聚合和分组
aggregate
annotate
2. F和Q
1. F:字段与字段之间作比较的时候用F/使用原来字段的值做更新的时候
2. Q: 对查询做并集操作时
3. 事务
import os if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings") import django django.setup() # ORM查询练习
from app01 import models # 查询书名里老男孩的书
# ret = models.Book.objects.filter(title__contains='老男孩')
# print(ret) # 查找出版日期是2017年的书
# ret = models.Book.objects.filter(publish_date__year=2017)
# print(ret) # 查找出版日期是2017年的书名
# ret = models.Book.objects.filter(publish_date__year=2017).values("title")
# print(ret) # 查找价格大于10元的书
# ret = models.Book.objects.filter(price__gt=10)
# print(ret) # 查找价格大于10元的书名和价格
# ret = models.Book.objects.filter(price__gt=10).values_list("title", "price")
# print(ret) # 查找memo字段是空的书
# ret = models.Book.objects.filter(memo__isnull=True)
# print(ret) # 查找名字以沙河开头的出版社
# ret = models.Publisher.objects.filter(name__startswith="沙河")
# print(ret) # 跨表查询
# 查找书名是“跟Alex送外卖”的书的出版社
# 1. 基于对象的查询
# book_obj = models.Book.objects.filter(title='跟Alex送外卖').first()
# book_obj.publisher # 和我这本书关联的出版社对象
# ret = book_obj.publisher.name
# print(ret)
# 2. 基于字段的查询
# ret = models.Publisher.objects.filter(book__title='跟Alex送外卖')
# print(ret) # 查找书名是“跟老男孩学Linux”的书的所有作者
# 1. 基于对象的查询
# book_obj = models.Book.objects.filter(title='跟老男孩学Linux').first()
# ret = book_obj.author.all() # 反向查询是表名_set
# print(ret)
# 2. 基于字段的查询
# ret = models.Author.objects.filter(book__title='跟老男孩学Linux')
# print(ret) # 查找书名是“跟老男孩学Linux”的书的作者的邮箱
# 1. 基于对象的查询
# book_obj = models.Book.objects.filter(title='跟老男孩学Linux').first()
# author_objs = book_obj.author.all()
# for author in author_objs:
# print(author.detail.email)
# 2. 基于字段的查询
# ret = models.Author.objects.filter(book__title='跟老男孩学Linux').values("detail__email")
# print(ret) # update和直接属性修改的区别
# 1. update
# models.Book.objects.filter(id=1).update(price=999.99) # 2. obj.price = 99.99
# book_obj = models.Book.objects.filter(id=1).first()
# book_obj.price = 99.99
# book_obj.save() # 求所有书的平均价格
from django.db.models import Avg
# ret = models.Book.objects.all().aggregate(xx=Avg("price"))
# print(ret) # 求每个作者出版的书的平均价格
# ret = models.Author.objects.annotate(xx=Avg("book__price")).values("name", "xx")
# print(ret) # 查询出版日期是2017年或者价格小于100块的书
# from django.db.models import Q
# # ret = models.Book.objects.filter(publish_date__year=2017, price__lt=100)
# ret = models.Book.objects.filter(Q(publish_date__year=2017) | Q(price__lt=100))
# print(ret) # 事务
# from django.db import transaction
#
# try:
# with transaction.atomic():
# # 先创建一个出版社
# publish_obj = models.Publisher.objects.create(name='腹疼出版社', city="沙河")
# # 把新创建的出版社和第一本书关联
# models.Book.objects.get(id=100).publisher = publish_obj
# except Exception as e:
# print(str(e)) # 不使用事务方式
try:
# 先创建一个出版社
publish_obj = models.Publisher.objects.create(name='腹疼出版社', city="沙河")
# 把新创建的出版社和第一本书关联
models.Book.objects.get(id=100).publisher = publish_obj
except Exception as e:
print(str(e))
常用ORM查询练习
from functools import wraps def wrapper(func):
@wraps(func) # 伏笔:Flask中会用到这个!!!
def inner(*args, **kwargs):
print("装饰器工作中...")
func(*args, **kwargs)
return inner @wrapper
def f1(arg):
"""
这是一个测试装饰器修复技术的函数
:param arg: 随便传
:return: 没有
"""
print(arg) f1('呵呵')
print(f1.__doc__)
装饰器修复技术
二、cookie session
0. 登录的例子
无法判断用户是否登陆!! 1. Cookie
1. Cookie是什么?
就是保存在浏览器上的特殊的键值对
2. Cookie的特点
1. 服务端返回响应的时候 告诉浏览器要保存的键值对,浏览器可以设置不让服务端记录cookie
2. 浏览器每次访问同一个网站的时候会携带着当前这个网站保存在浏览器端的键值对 3. Cookie能做什么?
1. 做登录 *****
2. 记录用户的浏览习惯
3. 简单的访问限制
4. Cookie其它配置项
1. 超时时间: max_age = 5 单位是秒;不设置超时时间的话默认是关闭浏览器就失效
2. 加密的Cookie
5. 需要掌握的是:
django操作Cookie的方法
1)获取cookie
request.COOKIES['key']
request.get_signed_cookie(key,default=RAISE_ERROR,salt='',max_age=None)
2)设置cookie
rep = HttpResponse(...)
rep = render(request, ...)
rep.set_cookie(key,value,....)
rep.set_signed_cookie(key,value,salt='加密盐',。。。。。。)
---------------------------------------------------------------------------------------------
参数:
key, 键
value='', 值
max_age=None, 超时时间
expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
domain=None, Cookie生效的域名
secure=False, https传输
httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
----------------------------------------------------------------------------------------
3)删除cookie
rep.delete_cookie("user") # 删除用户浏览器上之前设置的usercookie 2. Session
1. 接收请求返回响应
2. 返回响应时,生成一个特殊的字符串
3. 在后端开一块空间保存你这个请求的相关数据
4. 返回响应 下一次请求:
1. 你带着 我之前给你的字符串
2. 拿着你的字符串去找你对应的箱子
3. 在箱子中根据key取值
session方法:
# 获取、设置、删除Session中数据
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1'] # 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems() # 会话session的key
request.session.session_key # 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired() # 检查会话session的key在数据库中是否存在
request.session.exists("session_key") # 删除当前会话的所有Session数据
request.session.delete()
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush()
这用于确保前面的会话数据不可以再次被用户的浏览器访问
例如,django.contrib.auth.logout() 函数中就会调用它。 # 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
三、预习和扩展
1.回顾
from django.utils.decorators import method_decorator # 不会将get post等对象方法的self传入装饰器的*args等中
@wraper修饰的区别 直接装饰的会
python全栈开发day69-cookie、session的更多相关文章
- python全栈开发目录
python全栈开发目录 Linux系列 python基础 前端~HTML~CSS~JavaScript~JQuery~Vue web框架们~Django~Flask~Tornado 数据库们~MyS ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- Python全栈开发【面向对象】
Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...
- Python全栈开发【模块】
Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...
- Python全栈开发【基础四】
Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...
- Python全栈开发【基础三】
Python全栈开发[基础三] 本节内容: 函数(全局与局部变量) 递归 内置函数 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 def 函数名(参数): ... 函数体 . ...
- Python全栈开发【基础二】
Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...
- Python全栈开发【基础一】
Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与wh ...
- python 全栈开发之路 day1
python 全栈开发之路 day1 本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...
随机推荐
- ionic配置
这个问题在升级ionic2的时候可能会遇到,不一定是windows,但是解决办法都是一样的,其实很简单,就是sass不支持当前的环境,那么在当前环境重新安装一下就好了 先卸载: npm uninsta ...
- Linq与Lambda常用查询语法
1.查询全部 2.按条件查询全部 3.去除重复 4.连接查询 between and 5.排序 6.分组
- linux shell中 if else以及大于、小于、等于逻辑表达式
在linux shell编程中,大多数情况下,可以使用测试命令来对条件进行测试,这里简单的介绍下,方便需要的朋友 比如比较字符串.判断文件是否存在及是否可读等,通常用"[]"来表示 ...
- awk简单用法-(1)
一.awk基本操作 awk指定多个分割符,分隔符中有:和空格,还有:和空格的组合,这个时候需要指定多个分隔符 -F'[ :]+',[ :]表示分隔符为:和空格,一个或者多个+号表示空格和:的组合也为一 ...
- 【进阶3-1期】JavaScript深入之史上最全--5种this绑定全面解析(转)
这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://github.com/yygmind/blog/issues/20 this的绑定规则总共有下面5种. 1.默认绑定(严格/非严 ...
- 机器学习之SVD分解
一.SVD奇异值分解的定义 假设是一个的矩阵,如果存在一个分解: 其中为的酉矩阵,为的半正定对角矩阵,为的共轭转置矩阵,且为的酉矩阵.这样的分解称为的奇异值分解,对角线上的元素称为奇异值,称为左奇异矩 ...
- Vmware Workstation _linux yum 仓库搭建
0:检查 vm虚拟机光盘是否已经连接 1. 检测yum 仓库是否已经配置好 [root@oracle ~]# yum list all 如果输入这条指令可以正确显示出rpm 包的列表,则说明yum 仓 ...
- yolov3 安装训练
https://blog.csdn.net/helloworld1213800/article/details/79749359 https://blog.csdn.net/lilai619/arti ...
- 理解call及apply
转载自:http://www.zhihu.com/question/20289071 //call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改 ...
- LeetCode(75):分类颜色
Medium! 题目描述: 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 ...