cookie

客户端浏览器上的一个文件,以键值对的形式存储,如{“user”:“dacehgnzi”}

入门:实现一个简单的登录功能

views.py:

 user_info = {
'dachengzi':{'pwd':''},
'root':{'pwd':''},
}
def login(request):
if request.method == 'GET':
return render(request,'login.html')
elif request.method == 'POST':
name = request.POST.get('username')
passwd = request.POST.get('passwd')
dic = user_info[name]
if not dic:
return render(request,'login.html')
elif dic['pwd'] == passwd:
res = redirect('/index/')
16 res.set_cookie('username',name)
return res
else:
return render(request, 'login.html')
def index(request):
#获取当前已经登录的用户
v = request.COOKIES.get('username')
if not v:
return redirect('/login/') return render(request,'index.html',{'current_user':v})

想要往浏览器中添加cookie值,在跳转的时候set_cookie,想要获取cookie时就用request.COOKIE.get(''),

获取cookie值:

  • request.COOKIES获得所有的cookie
  • request.COOKIES['cookie名称']
  • request.COOKIES.get('cookie名称')

往浏览器中写cookie:在给用户返回内容的时候不仅要把内容返回给用户,还要把cookie返回给用户

  1.用一个变量,把要跳转赋值过去:response = render(requset,'返回的html')/redirect('返回的url')

  2.设置cookie值:response = set_cookie('key','value')设置cookie,关闭浏览器失效

  3.返回response:return response

我们来看一下set_cookie函数:

set_cookie(key,value,...)
参数:
key, 键
value='', 值
max_age=None, 超时时间,多少秒之后失效
      
expires=None, 超时时间(IE requires expires, so set it if hasn't been already.),具体到某一个时间
  import datetime
       current_date = datetime.datetime.utcnow()
       current_date = current_date + datetime.timedelta(seconds=5)
       response.set_cookie('username',name,expires = current_date)
     path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
domain=None, Cookie生效的域名
secure=False, https传输
httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)document.cookie:js中获取cookie

案例:分页(通过cookie值设置每页显示多少条数据)

我们先下载一个jquery cookie这个js,这样就可以通过jQuery获得cookie值,和设置cookie:

html代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.pagination .page{
display: inline-block;
padding:5px;
background-color: seashell;
margin:5px;
}
.pagination .active{
background-color: coral;
}
</style>
</head>
<body>
<ul>
{% for item in li %}
{% include 'li.html' %}
{% endfor %}
</ul>
<div>
<select id="page_size" onchange="changePageSize(this)">
<option value="">10</option>
<option value="">20</option>
<option value="">30</option>
</select>
</div>
<div class="pagination">
{{ page_str|safe }}
</div>
<script src="/static/jquery-1.12.4.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script>
$(function () {
v = $.cookie('per_page_count')获取cookie的值
if(v == undefined){
v = 10
}
$("#page_size").val(v);
});
function changePageSize(ths){
var v = $(ths).val()
$.cookie('per_page_count',v);设置cookie的值
location.reload()
}
</script>
</body>
</html>

当然在这里面,我们也可以通过和django中cookie的一样的参数去设置url和过期时间

我们是上面的cookie值都是明文的,那我们如果用密文呢?

在django中有一个方法set_signed_cookie()方法,使用了这个方法设置出来的cookie值就是加密的:

#加密,基于salt加密
request.get_signed_cookie('username','kangbazi', default=RAISE_ERROR, salt='asdfasd', max_age=None)
参数:
default: 默认值
salt: 加密盐
max_age: 后台控制过期时间
#解密
request.get_signed_cookie('username',salt='asdfasd')

salt的值要对应上才能解密

Session

cookie的缺点:

  我们js可以获取然后修改,这时候我们用户再访问就登录不上了

  如果我们把一些敏感信息放在cookie中,人家就可以看到。就会造成信息泄露

所以基于Cookie做用户验证的时候不建议把敏感信息存储在cookie中

cookie的优点:

  把存储数据的压力放在每个人的电脑上,减轻了服务器的压力

1.Session原理

cookie是保存在用户浏览器端的键值对

session是保存在服务器端的键值对,session 依赖于 cookie。

  用户来请求,登录之后给他生成一个随机字符串,在服务器上保存,放置一个字典保存当前用户的信息

入门:

views.py:

 from django.shortcuts import render,HttpResponse,redirect

 # Create your views here.
def login(request):
if request.method == 'GET':
return render(request,'login.html')
elif request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('passwd')
if user == 'root' and pwd == '':
#生成随机字符串
#写到用户浏览器cookie
#保存的到session中
#在随机字符串对应的字典中设置相关的内容
request.session['username'] = user
request.session['is_login'] =True
return redirect('/index/')
else:
return render(request,'login.html')
def index(request):
#获取当前用户的随机字符串
#根据随机字符串获取对应的信息
if request.session['is_login']:
return HttpResponse(request.session['username'])
else:
return HttpResponse('去登录去')

首先我们运行的时候要先生成数据库,makemigrations,migrate,然后再去执行,因为session是存储在数据库中的

session操作:

    # 获取、设置、删除Session中数据
request.session['k1']没有就报错
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1']删除k1 # 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems() # 用户session的随机字符串
request.session.session_key # 将所有Session失效日期小于当前日期的数据删除,把数据库中超过超时时间的数据都删除
request.session.clear_expired() # 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key") # 删除当前用户的所有Session数据
request.session.delete("session_key")
     # 当登录的用户点注销的时候就可以用这句 
     request.session.clear()就相当于reqeust.session.delete(request.session.session_key)
    # 在django中默认的超时时间为两周,我们可以通过下面的重新设置超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。

settings.py:

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 = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)

上面我们的 session 是放置在数据库中,在django中,还可以把session存放在其他的地方:

  • 数据库(默认)
  • 缓存
  • 文件
  • 缓存+数据库
  • 加密cookie

放在缓存中:

settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

放在文件中:

SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T

缓存+数据库Session

数据库用于做持久化,缓存用于提高效率

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

加密cookie Session

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

Django学习---cookie和session的更多相关文章

  1. Django之Cookie、Session、CSRF、Admin

    Django之Cookie.Session.CSRF.Admin   Cookie 1.获取Cookie: 1 2 3 4 5 6 request.COOKIES['key'] request.get ...

  2. [py][mx]django的cookie和session操作-7天免登录

    浏览器同源策略(same-origin policy) csrf攻击防御核心点总结 django的cookie和session操作-7天免登录 flask操作cookie&django的see ...

  3. Django基础cookie和session

    Django基础cookie和session 1.会话跟踪 ​ 什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如给10086打个电话,你就是客户端, ...

  4. django的cookie和session以及内置信号、缓存

    cookie和session cookie和session的作用: cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话.两者最大的区别是cookie的信息是存放在浏览 ...

  5. django的cookie 和session

    Cookie 1.获取cookie: request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt=' ...

  6. Django组件-cookie与session

    一.会话跟踪技术 1.什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而 ...

  7. web框架开发-Django组件cookie与session

    http协议的每一次都是无保存状态的请求,这会带来很多的不方便,比如,一刷新网页,或者进入该网页的其他页面,无法保存之前的登录状态.为了解决类似这样的问题,引入了会话跟踪 会话跟踪技术 1 什么是会话 ...

  8. Django 之 cookie和session

    一. Cookie 1.Cookie的由来 因为HTTP协议是无状态的,无状态的意思就是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,也不会受前后请求响应情况直接影响.简 ...

  9. django之COOKIE 与 SESSION

    COOKIE 与 SESSION 概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie ...

随机推荐

  1. python 之头像上传,预览

    上传头像 我们需要实现的效果是:当我们点击默认头像,用户可以进行选择要上传的头像文件,其原理就是头像的img标签与文件input(file类型)框重合或者关联,可以通过如下两种方式进行实现: 方法一l ...

  2. java中的Reference

    这两天又重新学习了一下Reference,根据网上的资源做了汇总. Java中的引用主要有4种: 强引用 StrongReference: Object obj = new Object(); obj ...

  3. 每天一个linux命令(权限):【转载】chgrp命令

    在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...

  4. 每天一个linux命令(文件操作):【转载】find 命令概览

    Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时 ...

  5. TLS支持版本检测

    今天有开发同事询问“生产环境的TLS版本是多少”,这个问题还真没太关注过,首先想到的是通过Chrome浏览器的开发者工具查看一下,访问https页面查看如下: 这太概是说使用了TLS1.2,于是截图给 ...

  6. Create A .NET Core Development Environment Using Visual Studio Code

    https://www.c-sharpcorner.com/article/create-a-net-core-development-environment-using-visual-studio- ...

  7. python笔记-12 redis缓存

    一.redis引入 1.简要概括redis 1.1 redis默认端口:6379 1.2 redis实现的效果:资源共享 1.3 redis实现的基本原理:不同的进程和一个公共的进程之间建立socke ...

  8. linux vi详解

    刚开始学着用linux,对vi命令不是很熟,在网上转接了一篇. vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指 ...

  9. ubuntu换系统下载路径源

    ubuntn默认下载路径的源是国外的下载很慢换成国内的下载路径会好很多 在ubuntu应用搜索框(左上脚那个)中输入software 1.software&Updates 应用点击softwa ...

  10. nginx 启用http2 https 无法访问的问题

    原因:   1. openssl  版本过低     解决方法:进行升级   yum  update openssl   2.ssl_ciphers 配置有问题    解决方法:修改为  ssl_ci ...