1.1 cookies

- 初识cookie
a.cookie是保留在浏览器端的键值对
b.服务端可以向客户端写cookie
c.客户端每次发送请求,会携带cookie一起发送过去,而且cookie是存放在消息头cookie字段 应用:
a. 投票
b. 用户登录 深入cookie
-- 登录页面处理:
obj = redirect('/classes/')
obj.set_cookies('crsf','lzp', max-age=, expires=value)
return obj -- classes页面
cookies = request.COOKIES
if not cookies: # 这里只是简单判断是否有cookie,并没有判断cookie是否正确
redirect('/login/')

1.2 设置cookies

-- 设置cookie
obj.set_cookies(key, value, max-age=None, expires=None, path='/', ...)
- 参数
a. key
b. value
c. max-age=None
# mag-age=10表示当超过10s,浏览器会自动清除该cookie
d. expires=None
# expires也是cookie的保存时间,不过是日期类型,而不是整数
# expires 和 max-age只要一个就好,推荐max-age(因为设置expires,最后还是转换成max-age) e. path='/’
#表示只有访问path路径的时候才能拿到cookies
#当path='/'表示所有路径(url)都可以拿到cookies f. domain=None,默认是当前域名 h. secure=False,
secure=True,https传输 i. httponly=False 只能http传输 - set_cookie后会在响应头里面增加一个Set-cookie字段,这个字段的值是一个字典 key为set_cookie里面的kye,value为set_cookie里面的value
obj.set_cookie('ticket3', '')
之前的key,value也会保存在浏览器中
obj.set_cookie('ticket4', '') - 下次访问的时候,会将浏览器保存的cookie存放在消息头Cookie上
Cookie:ticket3=; ticket4=

1.3 设置签名cookies

    -- 签名设置cookie(加盐)
a. 设置签名cookie:
# obj.set_signed_cookie('tt1','',salt='ddddd')
得到一个cookie: 'tt': '33:1e8HKP:CiklYZU3LtBdztFrCWB7PfEvBbM'
b. 获取签名
request.get_signed_cookie('tt1',salt='ddddd')

1.4 cookies实现登录验证

-- 装饰器,实现登录验证
# views
def login(request):
if request.method == "GET":
return render(request, "login.html")
else:
username = request.POST.get('username')
pwd = request.POST.get('password')
remember = request.POST.get('remember')
# username:root,pwd:;remember:on
if username == 'root' and pwd == '':
# 设置一个cookie,返回给客户端,然后这个cookie会随着请求一起
obj = redirect('/classes/')
obj.set_cookie('ticket', 'lzp')
return obj
else:
return redirect('/login/') # 装饰器(登录状态验证)
def auth(func):
def wrapper(request):
ticket = request.COOKIES.get('ticket')
print(ticket)
if not ticket:
return redirect('/login/')
else:
return func(request) return wrapper # 使用装饰器登录验证(不能直接方法/classes/ 必须先登录才能访问/classes/
@auth
def classes(request):
# 先要判断用户是否成功,通过cookie, cookie是一个字典, ticket是自己设置的一个key
# ticket = request.COOKIES.get('ticket')
# print(ticket)
# if not ticket:
# return redirect('/login/')
# pymysql操作数据库
print('ddddd')
conn = pymysql.connect(host='127.0.0.1', port=, user='root', passwd='', db='django_student', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("select id,title from class")
class_list = cursor.fetchall()
cursor.close()
conn.close() return render(request, "classes.html", {"class_list": class_list})

2.1 session

    - session定义
cookie:
保存在客户端的键值对, 依赖cookie,用来保持会话,记住登录状态;敏感信息不会直接给用户
session:
保存在服务端的数据(本质上是键值对)
session原理:
每一个用户登录成功后,服务端生成一个属于该用户的随机字符串,
并把这个随机字符串作为字典的Key,
往这个key添加该用户的敏感信息; 并将该随机字符串作为response_cookies 中sessionid返回给客户端。
客户发送下一个请求的时候,携带该随机字符串,服务端在字典找到该随机字符串,就会记得该用户的登录状态。
好处:敏感信息没有给客户端; 依赖cookie,保持会话

2.2 session使用

- session使用
获取:
request.session.get('k1',None)
request.session['k1'] 设置:
request.session['k1'] = ''
request.session.setdefault('k1','') # 存在则不设置 删除:
del request.session['k1'] 获取当前用户所有键值对
request.session.keys()
request.session.values()
request.session.items() 获取当前用户随机字符串:
request.session.session_key 删除当前用户的session
request.session.delete(request.session.session_key) 检查用户的随机字符串是否在数据库中
request.session.exist(request.session.session_key) 将数据库中所有的session,有效时间(django_session中的expire_date字段)小于当前时间的数据删除
request.session.clear_expired()
# 客户端中cookie中sessionid默认是保存两周
# django_session中expire_date默认也是两周 设置session超时时间(同时设置客户端session和服务端session)
request.session.set_expiry(value)
# 如果value是个整数,session会在些秒数后失效。
# 如果value是个datatime或timedelta,session就会在这个时间后失效。
# 如果value是0,用户关闭浏览器session就会失效。
# 如果value是None,session会依赖全局session失效策略。

2.3 session服务端保存位置设置

- 配置session(session默认是保存数据库表django_session)

         数据库session
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认) 缓存session
a. 设置settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 文件session
a. 设置settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()

2.4 基于session登录验证

    - 基于session的登录验证
a. views
def login(request):
if request.method == 'GET':
return render(request, 'app02_login.html') else:
username = request.POST.get('username')
pwd = request.POST.get('pwd')
models.User.objects.filter()
obj = models.User.objects.filter(name=username,password=pwd).first()
if obj:
#1 生成随机字符串
#2 返回随机字符串给客户端(通过cookie)
#3 服务端保存该随机字符串()
#4 服务端保存形式:
# {
# '随机字符串':{'username': 'root', 'email': 'root1234@qq.com'}
# }django是保存在数据库表django_session中
request.session['username'] = obj.name
request.session['email'] = obj.email
return redirect('/app02/index.html')
# 客户端得到session(随机字符串)后,后面的请求都会携带在cookie中sessionid中
else:
return render(request, 'app02_login.html', {'msg': '用户名或密码错误'}) def index(request):
# 获取cookie中的sessionid(即随机字符串)
# 在数据库表django_session查找是否有随机字符串
# 如果在数据库表中,判断username该列是否有值(如果有值代表登录成功)
v = request.session.get('username')
if v:
return HttpResponse('登录成功:%s'% v)
else:
redirect('/app02/login.html') b. 模板
<body>
<h3>用户登录</h3>
<form action="/app02/login.html" method="POST">
{% csrf_token %}
<p><input type="text" placeholder="username" name="username"></p>
<p><input type="password" placeholder="password" name="pwd"></p>
<p><input type="submit" value="login"></p>
<p style="color:red">{{ msg }}</p>
</form>
</body>

3.1 cookies 与session比较

    - session 和cookie 比较
同: cookie和session都是用来记住登录状态
异:
cookie是将用户的唯一标识是保存在客户端中,不安全;
cookie有添加一个签名,将唯一标识进行加密;但是可以破解,仍然不是很安全 session:只给客户端发送一个字符串,并不包含任何标识用户的内容
在服务端内存保存一个键值对,
{'随机字符串': {'name': '于浩'}}
当客户端发送下一个请求,并携带随机字符串,服务端获取字符串,并在内存中判断
唯一标识来判断用户是否已经登录了

[oldboy-django][2深入django]cookies + session的更多相关文章

  1. django form组件 cookies,session

    django form组件 渲染标签  就是组件里面的字段在前端展示叫做渲染标签 校验数据  用户输入的数据提交给后端组件叫做校验数据 forms组件中定义的字段都是必须传值的(required=Tr ...

  2. django设置并获取cookie/session,文件上传,ajax接收文件,post/get请求及跨域请求等的方法

    django设置并获取cookie/session,文件上传,ajax接收文件等的方法: views.py文件: from django.shortcuts import render,HttpRes ...

  3. {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

  4. django(五):cookie和session

    一.Cookie 1.cookie机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确 ...

  5. Django框架 之 Cookie、Session整理补充

    Django框架 之 Cookie.Session整理补充 浏览目录 Django实现的Cookie Django实现的Session 一.Django实现的Cookie 1.获取Cookie 1 2 ...

  6. 【python】-- Django 分页 、cookie、Session、CSRF

    Django  分页 .cookie.Session.CSRF 一.分页 分页功能在每个网站都是必要的,下面主要介绍两种分页方式: 1.Django内置分页 from django.shortcuts ...

  7. Django框架 之 Cookie和Session初识

    Django框架 之 Cookie和Session初识 浏览目录 Cookie介绍 Django中的Cookie Session 一.Cookie介绍 1.Cookie产生的意义 众所周知,HTTP协 ...

  8. Django框架07 /cookie和session

    Django框架07 /cookie和session 目录 Django框架07 /cookie和session 1. django请求生命周期 2. cookie 3. session 4. 总结 ...

  9. 第六章:Django 综合篇 - 6:会话session

    因为因特网HTTP协议的特性,每一次来自于用户浏览器的请求(request)都是无状态的.独立的.通俗地说,就是无法保存用户状态,后台服务器根本就不知道当前请求和以前及以后请求是否来自同一用户.对于静 ...

  10. Django中的Cookie、Session、Token

    Cookie : 指望着为了辨别用户身份.进行会话跟踪而存储在用户本地的数据(通常经过加密),是由服务端生成,发送给客户端浏览器,浏览器会将Cookie以key/value保存,下一请求同一网站是就发 ...

随机推荐

  1. 博客系统-后台页面搭建:eazy

    业务分析:布局为四个模块上边是系统描述,左边是导航菜单,中间是每个窗口的内容,下边是版权信息 点击左边的导航按钮,在右边窗口显示 代码: <%@ page language="java ...

  2. ARM实验1 —— 流水灯实验

    实验内容: 编写GPIO模块程序,实现对FS_4412平台的上的led2,led3,led4 ,led5,的流水灯实现. 实验目的: 熟悉开发环境的使用. 掌握Exynos 4412处理器GPIO功能 ...

  3. pta 编程题14 Huffman Codes

    其它pta数据结构编程题请参见:pta 题目 题目给出一组字母和每个字母的频数,因为哈夫曼编码不唯一,然后给出几组编码,因为哈夫曼编码不唯一,所以让你判断这些编码是否符合是哈夫曼编码的一种. 解题思路 ...

  4. PHP:isset()-检测变量是否被设置

    isset()-检测变量是否被设置 bool isset(mixed $var [, mixed $...]),检查变量是否被设置,并且不是NULL.var,要检测的变量,...其他变量,允许有多个变 ...

  5. Spark的基本概念及工作原理

    Spark作业的基本概念 -Application:用户自定义的Spark程序,用户提交后,Spark为App分配资源将程序转换并执行. -Driver Program:运行Application的m ...

  6. 【洛谷5113】Sabbat of the witch(毒瘤分块)

    点此看题面 大致题意: 给你一个序列,要你支持三种操作:区间赋值,区间求和,撤回之前任一区间赋值操作. 分块 这道题应该是一道十分毒瘤的分块题. 这道题要用到的算法并不是很难,但是思维难度是真的高. ...

  7. day1总结

    print("hello world") name='王维是傻屌' print(name) age_of_王维是傻屌 = 18 # type:用于判断变量的类型 str1 ='he ...

  8. Bootstrap 按钮(Button)插件加载状态

    通过按钮(Button)插件,您可以添加进一些交互.比如控制按钮的状态.或者为其它组件(工具栏)创建按钮组. 加载状态 如需向按钮添加加载状态,只需要简单地向 button 元素添加 data-loa ...

  9. kindeditor 上传图片失败问题总结

    1.近段时间一直在处理kindeditor上传图片失败的问题,前期一直以为是前端的问题,利用谷歌控制台,打断点,修改方法,一直都找不到解决方案,直到查看服务器配置,才发现: WEB 1号服务器 /da ...

  10. window10启用administrator 和启用组策略编辑器

    1,启用administrator账户 net user administrator /active:yes 2,启用组策略编辑器    新建一个文本文件.把下面代码粘贴进去.修改后缀名为.cmd  ...