Cookie是浏览器在客户端留下的一段记录,这段记录可以保留在内存或者硬盘上。因为Http请求是无状态的,通过读取cookie的记录,服务器或者客户端可以维持会话中的状态。比如一个常见的应用场景就是登录状态。Django里面,对cookie的读取和设置很简单。Cookie本身的格式类似字典,因此可以通过request的key或者get获取;然后他的设置则是通过response对象的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 设置一个login登录界面,一个index登录成功之后的跳转界面,如果没有登录那么自动跳转到登录界面
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的超时时间有2种方式,一个是直接指定max_age(N秒后超时),一个是指定expires后面跟一个具体的时间对象
httponly可以禁止JavaScript获取这个值,但是实际上没有什么鸟用,chrome或者抓包都能轻松获取所有的cookie
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,比如在前面分页的代码基础上,我们增加一个自定义显示行数的功能。
user_list.html 这里下了一个JQuery的插件,这样读取设置cookie比较容易;而且,我们还限制了cookie的使用范围,不是默认的所有范围,而是仅仅局限于/user_list这个路径里面
<!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})
总结
以上所述是小编给大家介绍的Django 中 cookie的使用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# django
# cookie
# 使用
# Django利用cookie保存用户登录信息的简单实现方法
# Django框架设置cookies与获取cookies操作详解
# django框架之cookie/session的使用示例(小结)
# Django中cookie的基本使用方法示例
# 详解Python的Django框架中的Cookie相关处理
# Python Django Cookie 简单用法解析
# 分页
# 小编
# 客户端
# 行数
# 就行了
# 还可以
# 在此
# 基础上
# 都能
# 则是
# 也能
# 给我们
# 下了
# 这段
# 每页
# 就行
# 可以通过
# 给大家
# 很简单
# 如果没有
相关文章:
如何通过二级域名建站提升品牌影响力?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
无锡营销型网站制作公司,无锡网选车牌流程?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
音响网站制作视频教程,隆霸音响官方网站?
如何安全更换建站之星模板并保留数据?
制作企业网站建设方案,怎样建设一个公司网站?
详解jQuery中基本的动画方法
宝塔面板如何快速创建新站点?
建站之星后台密码遗忘如何找回?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
宿州网站制作公司兴策,安徽省低保查询网站?
制作国外网站的软件,国外有哪些比较优质的网站推荐?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
在线教育网站制作平台,山西立德教育官网?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
,怎么在广州志愿者网站注册?
如何在Windows虚拟主机上快速搭建网站?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
头像制作网站在线制作软件,dw网页背景图像怎么设置?
如何在阿里云通过域名搭建网站?
建站主机是否属于云主机类型?
重庆市网站制作公司,重庆招聘网站哪个好?
如何在VPS电脑上快速搭建网站?
如何通过云梦建站系统实现SEO快速优化?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
网站制作壁纸教程视频,电脑壁纸网站?
如何用免费手机建站系统零基础打造专业网站?
南平网站制作公司,2025年南平市事业单位报名时间?
微信推文制作网站有哪些,怎么做微信推文,急?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
Swift中swift中的switch 语句
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
网站制作难吗安全吗,做一个网站需要多久时间?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
建站168自助建站系统:快速模板定制与SEO优化指南
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
网站制作的步骤包括,正确网址格式怎么写?
常州自助建站:操作简便模板丰富,企业个人快速搭建网站
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
C#怎么使用委托和事件 C# delegate与event编程方法
如何高效完成独享虚拟主机建站?
建站之星后台管理:高效配置与模板优化提升用户体验
如何通过建站之星自助学习解决操作问题?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
制作网页的网站有哪些,电脑上怎么做网页?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
公司网站制作价格怎么算,公司办个官网需要多少钱?
建站之星各版本价格是多少?
*请认真填写需求信息,我们会在24小时内与您取得联系。