Django 中 cookie的使用

Cookie是浏览器在客户端留下的一段记录,这段记录可以保留在内存或者硬盘上。因为Http请求是无状态的,通过读取cookie的记录,服务器或者客户端可以维持会话中的状态。比如一个常见的应用场景就是登录状态。Django里面,对cookie的读取和设置很简单。Cookie本身的格式类似字典,因此可以通过request的key或者get获取;然后他的设置则是通过response对象的set_cookie设定; 如果要取消cookie,把过期时间设置为当前时间就行了。

获取Cookie:

rush:py;"> request.COOKIES['key'] request.get_signed_cookie(key,default=RAISE_ERROR,salt='',max_age=None) 参数: default: 认值 salt: 加密盐 max_age: 后台控制过期时间

设置Cookie:

rush:py;"> rep = HttpResponse(...) 或 rep = render(request,...) rep.set_cookie(key,value,...) rep.set_signed_cookie(key,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

rush: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

rush:py;"> <Meta charset="UTF-8">

欢迎登录:{{ current_user }}

login.html

rush:py;"> <Meta charset="UTF-8">

例2:

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

把例1改一下

rush:py;"> def auth(func): def inner(reqeust,*args,**kwargs): v = reqeust.COOKIES.get('username111') if not v: return redirect('/login/') return func(reqeust,**kwargs) return inner @auth def index(reqeust): # 获取当前已经登录用户 v = reqeust.COOKIES.get('username111') return render(reqeust,{'current_user': v})

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

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

views.py

rush:py;"> @method_decorator(auth,name='dispatch') class Order(views.View): # @method_decorator(auth) # def dispatch(self,request,**kwargs): # return super(Order,self).dispatch(request,**kwargs) # @method_decorator(auth) def get(self,reqeust): v = reqeust.COOKIES.get('username111') return render(reqeust,{'current_user': v}) def post(self,{'current_user': v}) urls.py url(r'^order/',views.Order.as_view()),

例4 我们还可以通过JavaScript或者JQuery来设置Cookie,比如在前面分页代码基础上,我们增加一个自定义显示行数的功能

user_list.html 这里下了一个JQuery的插件,这样读取设置cookie比较容易;而且,我们还限制了cookie的使用范围,不是认的所有范围,而是仅仅局限于/user_list这个路径里面

rush:py;"> <Meta charset="UTF-8">
    {% for item in li %} {% include 'li.html' %} {% endfor %}

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

rush: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的使用,希望对大家有所帮助。程序员遇到问题都会上(编程之家jb51.cc)查找问题解答方法!如果觉得站点还不错,随手转发给程序员朋友一下!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用
将字符重新排列以形成回文(如果可能)在C++中
掌握PHP8底层开发原理和新特性:创建高效可扩展的应用程序
服务器性能优化必学:掌握PHP8底层开发原理
PHP8新特性和底层开发原理详解:优化应用性能的终极指南
将 C/C++ 代码转换为汇编语言
深入研究PHP8底层开发原理:创建高效可扩展的应用程序
C++程序查找法向量和迹
PHP8底层开发原理实战指南:提升服务器效能
重排数组,使得当 i 为偶数时,arr[i] >= arr[j],当 i 为奇数时,arr[i] <= arr[j],其中 j < i,使用 C++ 语言实现
Golang的垃圾回收:为什么它可以减少开发人员的负担?
C++程序:将一个数组的所有元素复制到另一个数组中
Golang:构建智能系统的基石
为什么AI开发者应该关注Golang?
在C和C++中,逗号(comma)的用法是用来分隔表达式或语句
PHP8底层开发原理解析及新特性应用实例
利用PHP8底层开发原理解析新特性:如何构建出色的Web应用