Django-website 程序案例系列-10 cookie 和 session的应用
cookie: 现在所有网站基本都要开启cookie
客户端浏览器上的一个文件
例如: {‘key’: 'sefwefqefwefw'} 是一个键值对
简单实现cookie认证:
user_in = {
'zhangjian': {'pwd': '123'},
'xiefengmei': {'pwd': '123'},
}
def log(request):
if request.method == 'GET':
return render(request, 'log.html')
if request.method == 'POST':
u = request.POST.get('username')
p = request.POST.get('pwd')
dic = user_in.get(u)
if not dic:
return render(request, 'log.html')
if dic['pwd'] == p:
res = redirect('/tpl/')
res.set_cookie('username', u)
return res
else:
return render(request, 'log.html')
def tpl(request):
v = request.COOKIES.get('username')
if not v:
return redirect(request, '/log/')
return render(request, 'tpl.html', {'current_user': v})
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ current_user }}</h1>
</body>
</html>
获取客户端的cookie:
request.COOKIES
request.COOKIES['username111']
request.COOKIES.get('username111')
设置用户cookie:
response = render(request, 'index.html')
response = redirect('/index/')
response.set_cookie('key',‘value’) #这种方式只能设置cookie, 关闭浏览器就会失效
return response
设置加密的cookie:
obj = HttpResponse('s')
obj.set_signed_cookie('username',"zhangjian",salt="wioahf2i3") #设置加密的cookie,salt是一个加密字符串
request.get_signed_cookie('username',salt="wiioahf2i3") #接收加密的cookie,利用salt解密
cookie参数:
超时时间:
1.response.set_cookie('key',‘value’,max_age=10) # max_age过期时间,cookie失效时间,多少秒之后失效
2. import datetime
current_date = datetime.datetime.utcnow() + datetime.timedelta(seconds=10)
response.set_cookie('key',‘value’,expires=current_date) # expires是到什么时间失效
路径:
response.set_cookie('key',‘value’,path=‘/’) #cookie生效的路径, ‘/’表示根路径,根路径的cookie可以被任何url访问
域名:
response.set_cookie('key',‘value’,domain=None) #cookie生效的域名
其他:
response.set_cookie('key',‘value’,secure=False) #如果是https的网站需要,改为True
response.set_cookie('key',‘value’,httponly=False) #表示只能使用http协议传输,无法使用javascript获取(document.cookie)
JS操作cookie:
def user_list(request):
current_page = request.GET.get('p', 1)
current_page = int(current_page)
val = request.COOKIES.get('per_page_count',10) #取出前端JS传来的cookie里面的 ‘per_page_count’ ,默认值设置为10
page_obj = Page(current_page, len(LIST), int(val)) data = LIST[page_obj.start: page_obj.end] page_str = page_obj.page_str("/user_list/")
return render(request, 'user_list.html', {'li': data, 'page_str': page_str})
HTML
<script src="/static/jquery.min.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script>
$(function() { #网页加载时运行
var v = $.cookie('per_page_count'); #加载网页时 取cookie里面‘per_page_count’的值v
$('#ps').val(v); #将值v设置到 id=ps 的标签里面
}); function changePageSize(ths) {
var v = $(ths).val(); #绑定 onchange事件得到值 v
$.cookie('per_page_count', v); #将 v 设置到 键为‘per_page_count’里面
location.reload(); #刷新网页
}; </script>
简单的用JS设置一个cookie:

基于cookie做用户验证时:敏感信息不适合放在cookie中
session原理:
cookie是保存在用户浏览器的键值对
session是保存在服务器端的键值对
例如: session = afhashebwf213@!#: {
'is_login': True,
'user': 'zhang'
'nid': ...
...
}
# 基于session做用户验证
def logi(request):
if request.method == "GET":
return render(request, 'logi.html')
elif request.method == "POST":
user = request.POST.get('user')
pwd = request.POST.get('pwd')
if user == 'root' and pwd == "123":
request.session['username'] = user # 给session中设置值
request.session['is_login'] = True # 给session中设置值
return redirect('/ind/')
else:
return render(request, 'logi.html') def ind(request):
if request.session['is_login']: # 获取session中的值
return HttpResponse(request.session['username'])
else:
return HttpResponse('请你登录')
# 获取、设置、删除Session中数据
request.session['k1'] #取k1的值 如果不存在报错request.session.get('k1',None) #取k1的值 如果不存在返回Nonerequest.session['k1'] = 123 #设置k1的值为123request.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.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。#注销时清空session
def logout(request):
request.session.clear()
return redirect('/login/')
#设置session来实现免登陆

<form action="/logi/" method="POST">
<input type="text" name="user"/>
<input type="text" name="pwd"/>
<input type="checkbox" name="rmb" value="1" /> 10秒免登陆
<input type="submit" value="提交"/>
</form>
def logi(request):
if request.method == "GET":
return render(request, 'logi.html')
elif request.method == "POST":
user = request.POST.get('user')
pwd = request.POST.get('pwd')
if user == 'root' and pwd == "123":
request.session['username'] = user
request.session['is_login'] = True
if request.POST.get('rmb',None) == '1':
request.session.set_expiry(10) # 超时时间
return redirect('/ind/')
else:
return render(request, 'logi.html')
#session配置文件及其参数:
settings.py里面配置管理
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 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,默认修改之后才保存(每次用户操作需不需要更新过期时间)# 引擎的配置Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
- 数据库(默认)
- 缓存
- 文件
- 缓存+数据库
- 加密cookie
1. 数据库:
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 表示把session放在数据库中
2. 缓存:
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 表示把session放在缓存中存储
SESSION_CACHE_ALIAS = 'memcache-1' CACHES = { # 例如memcache连接信息
'memcache-1': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
'172.19.26.240:11211',
'172.19.26.242:11211',
]
}
}
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 表示把session存储在临时文件中
SESSION_FILE_PATH = os.path.join(BASE_DIR,'cache') # 表示存储session的临时文件的文件路径SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'Django-website 程序案例系列-10 cookie 和 session的应用的更多相关文章
- Django学习系列之Cookie、Session
Cookie和Session介绍 cookie 保存在客户端 session 保存在服务端 session依赖于cookie,比如服务端想往客户端写东西的时候就把cookie写到客户端浏览器 djan ...
- Django学习笔记(5)——cookie和session
一,前言 1.1,什么是会话跟踪技术 在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束.在一个会话的多个请求中共享数据,这就是会话跟踪技术. 例如在一 ...
- django 2 ORM操作 ORM进阶 cookie和session 中间件
ORM操作 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...
- Django的Form、CSRF、cookie和session
Django是一个大而全的web框架,为我们提供了很多实用的功能,本文主要介绍Form.CSRF.cookie和session 一.Form 在web页面中form表单是重要的组成部分,为了数据安全和 ...
- Django(十三)状态保持 —— cookie与session+ajax异步请求+session记住登录状态+cookie记住登录名密码
一.状态保持的概述 http协议是无状态的.下一次去访问一个页面时并不知道上一次对这个页面做了什么.因此引入了cookie.session两种方式来配合解决此问题. Duplicate entry:重 ...
- Django之Form、CSRF、cookie和session
Django是一个大而全的web框架,为我们提供了很多实用的功能,本文主要介绍Form.CSRF.cookie和session 一.Form 在web页面中form表单是重要的组成部分,为了数据安全和 ...
- 关于django用户登录认证中的cookie和session
最近弄django的时候在用户登录这一块遇到了困难,网上的资料也都不完整或者存在缺陷. 写这篇文章的主要目的是对一些刚学django的新手朋友提供一些帮助.前提是你对django中的session和c ...
- PHP学习10——Cookie和Session技术
主要内容: Cookie技术 创建cookie 查看cookie 读取cookie 用cookie记录访问时间和次数 删除cookie cookie的生命周期 Session技术 session工作原 ...
- Django框架(十六)—— cookie和session组件
目录 cookie和session组件 一.cookie 1.cookie的由来 2.什么是cookie 3.cookie的原理 4.cookie的覆盖 5.在浏览器中查看cookie 6.cooki ...
随机推荐
- 关于window.onload()的加载问题
今天写了个js的demo,遇到了个小问题,后来发现是自己对window.onload()的具体用处不是太清楚,现在跟大家分享一下. <head> <meta http-equiv=& ...
- 九,ESP8266 判断是断电上电(强制硬件复位)之后运行的内部程序还是内部软件复位之后运行的程序(基于Lua脚本语言)
现在我有一个需求,WIFI模块控制一个继电器,我要做的是如果内部程序跑乱了,造成了内部程序复位重启,那么控制继电器的状态不能改变 如果是设备断电了,然后又来电了,我需要的是继电器一定要是断开才好.不能 ...
- python 取值方法:截取字符串
截取最后三位:aa=“TFR20171230001-1”cc=aa[-3]+aa[-2]+aa[-1] aa="1.36x36.8-ddr" bb=aa.split('x')[1] ...
- 在VS2017上使用C#调用非托管C++生成的DLL文件(图文讲解)
原文:在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解) 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就 ...
- 在asp.net web form项目中添加webapi接口
我有一个支付宝服务网关是ASP.NET WEB FORM项目,但是最近这个网关需要对外提供几个接口,想了下,使用web api比较合适,实现很简单,GO 1,首先添加一个文件夹名字叫App_Start ...
- Qt小项目之串口助手控制LED
Qt小项目之串口助手控制LED 前言 最近刚学了一点Qt开发上位机,尝试着做个小软件练练手.查找了很多资料,做了一个简单的串口助手,可以实现串口基本发送和接收功能,支持中文显示,还可以控制STM32开 ...
- item 4: 知道怎么去看推导的类型
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 对于推导类型结果的查看,根据不同的软件开发阶段,你想知道的信息的不 ...
- 天气提醒邮件服务器(python + scrapy + yagmail)
天气提醒邮件服务器(python + scrapy + yagmail) 项目地址: https://gitee.com/jerry323/weatherReporter 前段时间因为xxx上班有时候 ...
- Jenkins新建项目中源码管理Repository URL使用Git报错:Failed to connect to repository : Command "git ls-remote -h......
之前部署了Gitlab+Gerrit+Jenkins持续集成环境,但在Jenkins中新建项目的源码管理"Repository URL"中添加git地址环节出现了问题,信息为&qu ...
- jackson出现错误 Unrecognized field,几种处理方法
1.请求的JSON里面字段多余映射的实体类,可以通过在类的顶部添加@JsonIgnoreProperties,2.0版本引入 import org.codehaus.jackson.annotate. ...