django的Cookie Session
Cookie
初识cookie的设置和获取 示例
from django.shortcuts import render, redirect
from django.shortcuts import HttpResponse
from django.views import View from app02 import models
from django.utils.safestring import mark_safe
# Create your views here. user = {
'username': 'zmd',
'password': '123'
}
class Login(View):
def get(self,request):
return render(request,'app02_cookie_login.html') def post(self,request):
u = request.POST.get('username')
p = request.POST.get('pwd')
if u != user.get('username'):
return render(request,'app02_cookie_login.html')
if p == user.get('password'):
res = redirect('/database_study/index/')
res.set_cookie('username',u)
return (res)
else:
return render(request,'app02_cookie_login.html')
class Index(View):
def get(self,request):
current_user = request.COOKIES.get('username')
if not current_user:
return redirect('/database_study/login/')
else:
return render(request,'app02_cookie_index.html', {'current_user':current_user})
一、设置Cookie
1、将要返回给客户端的内容自定义变量---使用 render或redirect 或HttpResponse
response = redirect('/database_study/index/')
response = render(request,'app02_cookie_index.html')
response = HttpResponse('xxxxx')
2、自定义变量.set_cookie('cookie_key','value')
response.set_cookie('username',u)
可以设置的内容有
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获取,即document.cookie(不是绝对,底层抓包可以获取到也可以被覆盖)
expires超时时间设置:
import datetime
current_time = datetime.datetime.now()
expire_time = current_time + datetime.timedelta(seconds=5)
print(current_time)
print(expire_time)
response.set_cookie('username', u, expires=expire_time)
httponly=True 测试js获取cookie
response.set_cookie('username', u, expires=expire_time)
response.set_cookie('usertype', 'admin', httponly=True)
js获取没有获取到cookie 中usertype
document.cookie
"csrftoken=EsHHdjGDkXypo8L7VEVJq2rrGqn4o5YsWjwIk9ivtDLmaearYlbxnxa7SECRiRCo; username=zmd"
3、案例:设置每页显示数据数量[xx条/页],设置cookie。后台获取设置值,查询指定范围的数据量
前端js设置cookie
<select id="page_size" onchange="changePageSize(this)">
<option value="10">10条/页</option>
<option value="30">30条/页</option>
<option value="50">50条/页</option>
</select>
<script src="/static/jquery-2.2.3.min.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script>
{# 获取每页显示数量设置cookie #}
function changePageSize(ths) {
let per_page_count = $(ths).val();
$.cookie('per_page_count',per_page_count);
console.log(per_page_count)
} {# 当页面加载完成后,获取cookie中设置的每页显示数量,选中当前设置的值 #}
$(function () {
let per_page_count = $.cookie('per_page_count');
$("#page_size").val(per_page_count)
})
</script>
后端获取cookie
page_size = int(request.COOKIES.get('per_page_count'))
4、设置/获取加密Cookie :
设置:response.set_signed_cookie('signed_username', u, salt='加密用字符串')
获取:request.get_signed_cookie('signed_username', salt='加密用字符串')
# 设置加密Cookie
response.set_signed_cookie('signed_username', u, salt='Wyf@1314') # 获取加密Cookie
signed_username = request.get_signed_cookie('signed_username', salt='Wyf@1314')
基于cookie用户登录身份认证应用示例
1、FBV 函数方式
自己手写认证装饰器
from django.shortcuts import render, redirect from app02 import models
from django.utils.safestring import mark_safe
# Create your views here. user = {
'username': 'zmd',
'password': '123'
}
class Login(View):
def get(self,request):
...
def post(self,request):
...
# 自己手写用户身份认证装饰器,未认证直接跳到登录页面,已认证就执行传进来的函数
def auth(func):
def inner(request,*args, **kwargs):
v = request.get_signed_cookie('signed_username', salt='Wyf@1314')
if not v:
return redirect('/database_study/login/')
return func(request, *args, **kwargs)
return inner from django.utils.decorators import method_decorator @auth
def index(request):
if request.method == 'GET':
signed_username = request.get_signed_cookie('signed_username', salt='Wyf@1314')
return render(request, 'app02_cookie_index.html', {'current_user': signed_username})
2、CBV方式 from django.utils.decorators import method_decorator
使用方法:@method_decorator(装饰器函数, name='要被装饰的函数名')
将装饰器装饰到dispatch函数上,对于该类所有http请求方法都加了认证(dispatch函数在所有函数执行前执行)
from django.utils.decorators import method_decorator @auth
def index(request):
if request.method == 'GET':
signed_username = request.get_signed_cookie('signed_username', salt='Wyf@1314')
return render(request, 'app02_cookie_index.html', {'current_user': signed_username}) # 装饰器装饰到dispatch函数上,对于该类所有http请求方法都加了认证(dispatch函数在所有函数执行前执行)
@method_decorator(auth, name='dispatch')
class Index(View):
def get(self,request):
# current_user = request.COOKIES.get('username')
signed_username = request.get_signed_cookie('signed_username', salt='Wyf@1314')
# print('signed_username', signed_username)
# if not current_user:
# return redirect('/database_study/login/')
# else:
return render(request,'app02_cookie_index.html', {'current_user':signed_username})
Session
服务器端存储Session + Cookie中存储 sessionid
Session 不存在敏感信息。一个Session ID对应一个用户登录信息。用户登录信息只在服务端存储。
语法:request.session['xxxx'] = xxxx
解析:session做了如下事儿
1、生成随机字符串
2、作为sessionid的值写入Cookie
3、将sessionid 和对应的 值(自定义的数据内容加密后)保存到django的数据库中
示例:views.py
from django.shortcuts import render, redirect
from django.views import View
# Create your views here. user = {
'username': 'zmd',
'password': '123'
} class SessionLogin(View):
def get(self, request):
return render(request, 'session_login.html') def post(self, request):
u = request.POST.get('username')
p = request.POST.get('pwd')
if u != user.get('username'):
return render(request,'session_login.html')
if p == user.get('password'):
request.session['current_user'] = u
return redirect('/session_index/')
else:
return render(request, 'session_login.html') class SessionIndex(View):
def get(self,request):
current_user = request.session.get('current_user')
print(current_user)
if current_user:
return render(request, 'session_index.html', {'current_user':current_user })
else:
return redirect('/session_login/')
前端html
session_login.html
<form action="/session_login/" method="post">
<input type="text" name="username">
<input type="password" name="pwd">
<input type="submit" value="登录">
</form>
session_index.html
<h2> 欢迎登陆 : {{ current_user }}</h2>
<h2> 欢迎登陆:{{ request.session.current_user }} </h2>
查看数据库中存储的session示例
1、session常用方法
# Django Session 的使用方法
def index(request):
# 获取、设置、删除Session中数据
session_key = request.session.session_key # ---> 用户session的随机字符串
request.session['k1'] = 'xxxx' # ---> 设置Session中数据
k1 = request.session['k1'] # ---> 获取Session中数据, 不存在会报错
request.session.get('k1') # ---> 不存在返回None
request.session['k1'] = 123 # ---> 设置session中存储的信息
request.session.setdefault('k1', 123) # ---> 存在则不设置
del request.session['k1'] # ---> 删除本次请求sessionid 对应session中对应的指定数据
request.session.delete("session_key") # ---> 删除当前用户的所有Session数据
request.session.clear() # ---> 注销:删除当前用户的所有Session数据 == request.session.delete(request.session.session_key)
request.session.clear_expired() # ---> 将所有Session失效日期小于当前日期的数据删除
request.session.exists("session_key") # ---> 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key") # ---> 检查 用户session的随机字符串 在数据库中是否存在
request.session.set_expiry(value=0) # ---> 设置过期时间秒
# *如果value是个整数,session会在些秒数后失效。
# *如果value是个datatime或timedelta,session就会在这个时间后失效。
# *如果value是0, 用户关闭浏览器session就会失效。
# *如果value是None, session会依赖全局session失效策略。 # 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
2、基于session的登录、注销示例
class SessionLogout(View):
def get(self,request):
request.session.clear()
return redirect('/session_login/')
class SessionLogin(View):
def get(self, request):
return render(request, 'session_login.html') def post(self, request):
u = request.POST.get('username')
p = request.POST.get('pwd')
if u != user.get('username'):
return render(request,'session_login.html')
if p == user.get('password'):
request.session['current_user'] = u
return redirect('/session_index/')
else:
return render(request, 'session_login.html') class SessionIndex(View):
def get(self,request):
current_user = request.session.get('current_user')
print(current_user)
if current_user:
return render(request, 'session_index.html')
else:
return redirect('/session_login/')
html示例:
模板渲染中可以直接使用request对象,获取对象中的值 {{ request.session.current_user }}
session_index.html
<h2> 欢迎登陆 : {{ request.session.current_user }}</h2>
<a href="/session_logout/">注销</a>
session_login.html
<body>
<form action="/session_login/" method="post">
<input type="text" name="username">
<input type="password" name="pwd">
<input type="submit" value="登录">
</form>
</body>
3、session 默认配置
常用设置:
SESSION_SAVE_EVERY_REQUEST = False # 每次请求都更新Session (更新过期时间) 默认为False,不更新。
详细一览:
# Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session表中。
#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,默认修改之后才保存(默认)
3.1缓存session
默认在内存中,django内部默认只支持memcached
# 缓存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,默认修改之后才保存 CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
'1.1.1.1:11211',
'2.2.2.2:11211'
]
}
}
3.2 文件session
需要指定存储session的文件
# 文件session
# settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None
# 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
3.3 缓存 + 数据库session
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
3.4 加密session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
django的Cookie Session的更多相关文章
- day09 Django: 组件cookie session
day09 Django: 组件cookie session 一.cookie和session都是会话跟踪技术 1.什么是会话 可以理解为客户端和服务端之间的一次会 ...
- django - 总结 - cookie|session
Cookie是通过HTTP请求和响应头在客户端和服务器端传递的. 在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术. --------------------- ...
- python框架之Django(7)-Cookie&Session使用
Cookie 添加 response.set_cookie 添加明文cookie response.set_cookie(key, value='', max_age=None, expires=No ...
- python 全栈开发,Day76(Django组件-cookie,session)
昨日内容回顾 1 json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() ...
- Django中cookie&session的实现
1.什么叫Cookie Cookie翻译成中文是小甜点,小饼干的意思.在HTTP中它表示服务器送给客户端浏览器的小甜点.其实Cookie是key-value结构,类似于一个python中的字典.随着服 ...
- Django之cookie+session
前言 HTTP协议 是短连接.且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态: cook是来自服务端,保存在浏览器的键值对,主要应用于用户登录 ...
- Django之cookie&session
cookie Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式.Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息 ...
- Django实现cookie&session以及认证系统
COOKIE&SESSION 知识储备 由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie的工作原理是:由服务器产生内 ...
- django框架--cookie/session
目录 一.http协议无状态问题 二.会话跟踪技术--cookie 1.对cookie的理解 2.cookie的使用接口 3.cookie的属性 4.使用cookie的问题 三.会话跟踪技术--ses ...
- Django组件-cookie,session
昨日内容回顾: json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() 反 ...
随机推荐
- 直接插入100w数据报错
### Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (77,600 ...
- spring rest小马哥
幂等 PUT 初始状态:0 修改状态:1 * N 最终状态:1 DELETE 初始状态:1 修改状态:0 * N 最终状态:0 非幂等 POST 初始状态:1 修改状态:1 + 1 =2 N次修改: ...
- 32、最长有效括号 | 算法(leetode,附思维导图 + 全部解法)300题
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(32)最长有效括号 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: // 方案1 "滑动窗 ...
- CF513G3 Inversions problem
考虑记\(f_{i,j,k}\)为\(k\)次操作后,\(i,j\)位置被调换的概率. 那么我们考虑枚举我们要算的答案即\((x,y)\). 那么有\(\frac{n * (n + 1)}{2}\)种 ...
- Codeforces 1446D2 - Frequency Problem (Hard Version)(根分)
Codeforces 题面传送门 & 洛谷题面传送门 人菜结论题做不动/kk 首先考虑此题一个非常关键的结论:我们设整个数列的众数为 \(G\),那么在最优子段中,\(G\) 一定是该子段的众 ...
- Codeforces 708E - Student's Camp(前缀和优化 dp)
Codeforces 题目传送门 & 洛谷题目传送门 神仙 *3100,%%% 首先容易注意到 \(\forall i\in[1,m]\),第 \(i\) 行剩余的砖块一定构成一个区间,设其为 ...
- Codeforces 985G - Team Players(三元环)
Codeforces 题目传送门 & 洛谷题目传送门 真·ycx 做啥题我就做啥题 考虑枚举 \(j\),我们预处理出 \(c1_i\) 表示与 \(i\) 相连的编号 \(<i\) 的 ...
- php导出pdf,dompdf中文字体乱码解决办法(特别是代码迁移引起的乱码)
dompdf\lib\fonts\dompdf_font_family_cache.php记住这个文件里面存放的是字体生成的缓存,迁移时如果覆盖了这个文件会导致乱码而且很难找到出错的地方,相信我... ...
- LightningChart JS v.3.3.0全新版本现已发布!
LightningChart JS v.3.3.0已经发布啦!!! 欢迎了解更多关于最新的性能改进.新的用户界面功能和新的图表类型的信息! WebGL兼容性和新的UI功能 WebGL是Lightnin ...
- binlog真的是银弹吗?有些时候也让人头疼
大家好,我是架构摆渡人.这是实践经验系列的第三篇文章,这个系列会给大家分享很多在实际工作中有用的经验,如果有收获,还请分享给更多的朋友. binlog 用于记录用户对数据库操作的SQL语句信息,同时主 ...