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的更多相关文章

  1. day09 Django: 组件cookie session

    day09 Django: 组件cookie session   一.cookie和session都是会话跟踪技术     1.什么是会话             可以理解为客户端和服务端之间的一次会 ...

  2. django - 总结 - cookie|session

    Cookie是通过HTTP请求和响应头在客户端和服务器端传递的. 在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术. --------------------- ...

  3. python框架之Django(7)-Cookie&Session使用

    Cookie 添加 response.set_cookie 添加明文cookie response.set_cookie(key, value='', max_age=None, expires=No ...

  4. python 全栈开发,Day76(Django组件-cookie,session)

    昨日内容回顾 1 json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() ...

  5. Django中cookie&session的实现

    1.什么叫Cookie Cookie翻译成中文是小甜点,小饼干的意思.在HTTP中它表示服务器送给客户端浏览器的小甜点.其实Cookie是key-value结构,类似于一个python中的字典.随着服 ...

  6. Django之cookie+session

    前言 HTTP协议 是短连接.且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态: cook是来自服务端,保存在浏览器的键值对,主要应用于用户登录 ...

  7. Django之cookie&session

    cookie Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式.Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息 ...

  8. Django实现cookie&session以及认证系统

    COOKIE&SESSION 知识储备 由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie的工作原理是:由服务器产生内 ...

  9. django框架--cookie/session

    目录 一.http协议无状态问题 二.会话跟踪技术--cookie 1.对cookie的理解 2.cookie的使用接口 3.cookie的属性 4.使用cookie的问题 三.会话跟踪技术--ses ...

  10. Django组件-cookie,session

    昨日内容回顾: json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() 反 ...

随机推荐

  1. 干掉idea视图黄色警告

    最近在写jsp代码黄色很烦人,安装codeglance插件小地图感觉也是很不舒服 ,百度了一下可以取消警告: https://blog.csdn.net/qq_40634961/article/det ...

  2. Maven的pom.xml的格式与约束

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  3. [SVN] Branch and Tag

    在 SVN 中,如何建立分支以及如何标记Tag. 右键要处理的文件夹,选择 "TortoiseSVN" - "Branch/tag...",进入下面界面: To ...

  4. 全面了解一致性哈希算法及PHP代码实现

    在设计一个分布式系统的架构时,为了提高系统的负载能力,需要把不同的数据分发到不同的服务节点上.因此这里就需要一种分发的机制,其实就是一种算法,来实现这种功能.这里我们就用到了Consistent Ha ...

  5. NFLSOJ 1060 - 【2021 六校联合训练 NOI #40】白玉楼今天的饭(子集 ln)

    由于 NFLSOJ 题面上啥也没有就把题意贴这儿了( 没事儿,反正是上赛季的题,你们非六校学生看了就看了,况且看了你们也没地方交就是了 题意: 给你一张 \(n\) 个点 \(m\) 条边的图 \(G ...

  6. 架构B/S和C/S的区别

    CS = Client - Server = 客戶端 - 服務器.例子: QQ,迅雷,快播,暴風影音,各種網絡遊戲等等.只要有和服務器通訊的都算. CS(Client/Server):客户端----服 ...

  7. C语言 自定义函数按行读入文件2

    再改进下上次的读入一行函数,利用zlib库的gzgtec函数读取文件,动态分配内存,最后没有多出空行. 1 #include <stdio.h> 2 #include <stdlib ...

  8. 如何使用csapp文件

    深入理解操作系统中有个csapp.h的头文件 以下来介绍下如何使用它: 该头文件下载地址为http://download.csdn.net/detail/tzasd89812/4206284 在Ubu ...

  9. 11.13python第一周周末练习

    2.请输出你的基本个人信息 3.结合逻辑判断,写一个不同学生分数,输出良好,优秀,分数不及格 循环输出 字符串的替换. 以什么开头startwith 以什么结尾endwith 列表转为字符串 字符串转 ...

  10. MYSQL(3)

    加载C盘下的目录 全表查询 查询部分字段 查询总数 条件过滤 and or 包含 范围检查 between and 否定结果not 匹配任意字符    like 以什么开始^   rlike 以什么结 ...