博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django 中 cookie的使用
阅读量:6632 次
发布时间:2019-06-25

本文共 3696 字,大约阅读时间需要 12 分钟。

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

    
    
    

欢迎登录:{
{ current_user }}

login.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    @authdef 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这个路径里面

    
    
    
    
            {% for item in li %}            {% include 'li.html' %}        {% endfor %}    
    
        
            
10            
30            
50            
100            
    
        {
{ page_str }}        
    
    

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})

转载地址:http://tofvo.baihongyu.com/

你可能感兴趣的文章
Redis配置文件redis.conf详解学习笔记八
查看>>
c++ qt 组播总结
查看>>
RobotFramework BuiltIn关键字笔记
查看>>
Spring整合JMS(四)——事务管理
查看>>
自己封装的golang 操作数据库方法
查看>>
Spring IOC启动流程学习(一)
查看>>
python tornado
查看>>
Android 自动换行的LinearLayout
查看>>
MacBook Pro电池校正
查看>>
初级python学习记录
查看>>
Scrapy爬虫 -- 02
查看>>
使用Kendo UI Web创建自定义组件(基础篇)
查看>>
GuozhongCrawler git地址
查看>>
我来了
查看>>
前端js正则的一个实例:过滤“rm -rf /”
查看>>
DOS窗口TELNET登陆终端批量执行命令
查看>>
Linux 线程实现机制分析
查看>>
转:Android世界的15款开源的游戏开发引擎
查看>>
多线程访问同一个可变变量,需增加同步机制
查看>>
apdplat 多表查询属性设置
查看>>