42 views

关于Django 中 cookie的使用

By | 2019年8月4日

cookie是浏览器在客户端留下的记录,可以保存在内存或硬盘中。因为HTTP请求是无状态的,所以服务器或客户机可以通过读取cookie记录来维护会话的状态。例如,一个常见的应用程序场景是登录状态。在Django中,读取和设置cookie很简单。cookie的格式与字典的格式类似,因此可以通过请求的key或get来检索它;然后通过响应对象的set_cookie来设置它的设置;如果要取消cookie,请将过期时间设置为当前时间。

获取Cookie:
request.COOKIES[‘key’]
request.get_signed_cookie(key, default=RAISE_ERROR, salt=”, max_age=None)
参数:
default: 默认值
salt: 加密盐
max_age: 后台控制过期时间

设置Cookie:

rep = HttpResponse(…) 或 rep = render(request, …)

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获取(不是绝对,底层抓包可以获取到也可以被覆盖)

例1 设置登录登录界面,索引登录成功后跳转界面,如果没有登录,则自动跳转到登录界面

views.py

def index(reqeust):
# 获取当前已经登录的用户
v = reqeust.COOKIES.get(‘username111’)
if not v:
return redirect(‘/login/’)
return render(reqeust,’index.html’,{‘current_user’: v})
请注意,cookie的超时可以通过两种方式完成,一种是直接指定最长使用时间(n秒后超时),另一种是指定过期,然后指定特定的时间对象。

httpOnly可以禁止javascript获取这个值,但实际上没有人关注它。铬或抓取一个包可以很容易地得到所有的饼干。

index.html

<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”UTF-8″>
<title></title>
</head>
<body>
<h1>欢迎登录:{{ current_user }}</h1>
</body>
</html>

login.html

<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”UTF-8″>
<title></title>
</head>
<body>
<form action=”/login/” method=”POST”>
<input type=”text” name=”username” placeholder=”用户名” />
<input type=”password” name=”pwd” placeholder=”密码” />
<input type=”submit” />
</form>
</body>
</html>

例2:
现实生活中,一般是把这个验证cookie的功能写成装饰器,这样直接在其他函数上面调用就行了

把例1改一下

def auth(func):
def inner(reqeust,*args,**kwargs):
v = reqeust.COOKIES.get(‘username111’)
if not v:
return redirect(‘/login/’)
return func(reqeust, *args,**kwargs)
return inner

@auth
def index(reqeust):
# 获取当前已经登录的用户
v = reqeust.COOKIES.get(‘username111′)
return render(reqeust,’index.html’,{‘current_user’: v})

例3: 我们知道可以使用fbv或者cbv来路由函数。例2使用了fbv的方式,用cbv也能实现

cbv里面,如果只打算装饰一个方法,那么直接在方法前面加个@method_decorator就行;如果打算装饰这个类里面所有的方法,那么在整个类的最上面进行装饰

views.py

@method_decorator(auth,name=’dispatch’)
class Order(views.View):
# @method_decorator(auth)
# def dispatch(self, request, *args, **kwargs):
# return super(Order,self).dispatch(request, *args, **kwargs)
# @method_decorator(auth)
def get(self,reqeust):
v = reqeust.COOKIES.get(‘username111′)
return render(reqeust,’index.html’,{‘current_user’: v})
def post(self,reqeust):
v = reqeust.COOKIES.get(‘username111′)
return render(reqeust,’index.html’,{‘current_user’: v})

urls.py

url(r’^order/’, views.Order.as_view()),

例4 我们还可以使用javascript或jquery来设置cookie,例如根据前面的分页代码添加行的自定义显示。

使用列表。HTML有一个jquery插件,这使得读取和设置cookie更容易;此外,我们限制了cookie的范围,不是所有的默认范围,而是只在/user_列表的路径中。

<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”UTF-8″>
<title></title>
<style>
.go{
width:20px;
border: solid 1px;
color: #66512c;
display: inline-block;
padding: 5px;
}
.pagination .page{
border: solid 1px;
color: #66512c;
display: inline-block;
padding: 5px;
background-color: papayawhip;
margin: 5px;
}
.pagination .page.active{
background-color: brown;
color: white;
}
</style>
</head>
<body>
<ul>
{% for item in li %}
{% include ‘li.html’ %}
{% endfor %}
</ul>
<div>
<select id=”ps” onchange=”changePageSize(this)”>
<option value=”10″>10</option>
<option value=”30″>30</option>
<option value=”50″>50</option>
<option value=”100″>100</option>
</select>
</div>
<div class=”pagination”>
{{ page_str }}
</div>
<script src=”/static/jquery-1.12.4.js”></script>
<script src=”/static/jquery.cookie.js”></script>
<script>
$(function(){
var v = $.cookie(‘per_page_count’, {‘path’: “/user_list/`”});
console.log(v)
$(‘#ps’).val(v);
});
function changePageSize(ths){
var v = $(ths).val();
console.log(v);
$.cookie(‘per_page_count’,v, {‘path’: “/user_list/”});
location.reload();
}
</script>
</body>
</html>

views.py 从前端获取每页行数,实例化的时候传递给我们的分页类

def user_list(request):
current_page = request.GET.get(‘p’, 1)
current_page = int(current_page)
val = request.COOKIES.get(‘per_page_count’,10)
val = int(val)
page_obj = pagination.Page(current_page,len(LIST),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})

本文编辑于2019年08月4日,属于云漫网络原创内容,由特约作者(网站防护技术员)首发在win-man.com,云漫网络每日更新发布行业原创内容,转载请注明出处。否则属侵权行为一定追究责任。

作者:网站防护技术员
本文转载于:http://win-man.com
本文关键词:香港服务器,高防服务器,韩国服务器,新加坡服务器

发表评论

电子邮件地址不会被公开。 必填项已用*标注