Django 中 cookie的使用

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

获取Cookie:


1

2

3

4

5

6

request.COOKIES[‘key‘]

request.get_signed_cookie(key, default=RAISE_ERROR, salt=‘‘, max_age=None)

    参数:

        default: 默认值

        salt: 加密盐

        max_age: 后台控制过期时间

设置Cookie:


1

2

3

4

5

6

7

8

9

10

11

12

13

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


1

2

3

4

5

6

def index(reqeust):

    # 获取当前已经登录的用户

    = 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


1

2

3

4

5

6

7

8

9

10

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title></title>

</head>

<body>

    <h1>欢迎登录:{{ current_user }}</h1>

</body>

</html>

login.html


1

2

3

4

5

6

7

8

9

10

11

12

13

14

<!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改一下


1

2

3

4

5

6

7

8

9

10

11

12

13

def auth(func):

    def inner(reqeust,*args,**kwargs):

        = reqeust.COOKIES.get(‘username111‘)

        if not v:

            return redirect(‘/login/‘)

        return func(reqeust, *args,**kwargs)

    return inner

    

@auth

def index(reqeust):

    # 获取当前已经登录的用户

    = reqeust.COOKIES.get(‘username111‘)

    return render(reqeust,‘index.html‘,{‘current_user‘: v})

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

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

views.py


1

2

3

4

5

6

7

8

9

10

11

12

@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):

        = reqeust.COOKIES.get(‘username111‘)

        return render(reqeust,‘index.html‘,{‘current_user‘: v})

    def post(self,reqeust):

        = reqeust.COOKIES.get(‘username111‘)

        return render(reqeust,‘index.html‘,{‘current_user‘: v})

urls.py


1

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

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

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

<!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;

            papayawhip;

            margin: 5px;

        }

        .pagination .page.active{

            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  从前端获取每页行数,实例化的时候传递给我们的分页类


1

2

3

4

5

6

7

8

9

10

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

时间: 2024-11-10 07:30:04

Django 中 cookie的使用的相关文章

Django中Cookie和Session的基本配置以及设置

Cookie 1.获取Cookie: request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) 参数: default: 默认值 salt: 加密盐 max_age: 后台控制过期时间 2.设置Cookie: rep = HttpResponse(...) 或 rep = render(request, ...) rep.set_cookie(key,valu

Django中cookie和session

cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况. 一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的. 状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留.会话中产生的数据又是我们需要保存的,也就是说要"保持状态".因此cookie就是在这样一个场景

Django中cookie和session的使用

Sesson必须依赖于Cookie  因为cookie是存储在客户端的 存session: 1.在服务器端生成随机字符串 2.生成一个和字符串对应的大字典,来保存用户的数据   字典存储在服务器端 3.随机字符串作为cookie,以键值对的形式返回给客户端 取session: 1.从浏览器携带的cookie中找到随机的字符串 2.拿着字符串 去session中找对应的大字典 3.从字典里按key取值,得到用户保存的数据 session 优点:比cookie存的数据多,安全性好,数据都保存在服务器

[py][mx]django的cookie和session操作

这玩意可以实现7天免登录等功能. session和cookie机制原理和交互过程 交互过程 ① 客户端访问,无服务端写入的Cookie ② 服务端的Cookie写入浏览器 ③ 浏览器解析Cookie,保存至浏览器文件 ④ 客户端访问,有服务端写入的Cookie ⑤ 服务器获取 django请求中的cookie 第一次访问服务端会给一个csrf的cookie 登录完成后,默认给一个为期半个月的cookie 用于访问别的也没使用. django中cookie与session的实现原理 app默认注册

Django中的cookie与session

cookie与session的实现原理 HTTP被设计为”无状态”,每次请求都处于相同的空间中. 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来自同一人的连续请求.上图很明显的展示了Django的session与cookie的实现原理.服务器会生成两份相同的cookie字符串,一份保存在本地,一份发向求情的浏览器.浏览器将收到的cookie字符串保存下来,当下次再请求时,会将这段cookie发送到服务器,服务器得到这段cookie会与本地保

对Django框架中Cookie的简单理解

概念的理解:首先Cookie和Session一样,是django中用于视图保持状态的方案之一.为什么要进行视图保留呢,这是因为浏览器在向服务器发出请求时,服务器不会像人一样,有记忆,服务器像鱼一样,在你一次请求结束后她会很快忘掉你的,对她来说你的每一次请求都是新鲜的,这要是爱情就好了哈,可以爱情保鲜!闲话不多说,这种状态就是所谓的 "浏览器请求服务器是无状态",根本原因就复杂一些了,需要简单了解些网络编程中套接字Socket的通信方式,简单来说就是,浏览器和服务器进行通信需要使用Soc

django 中的cookie和session

cookie: 1,cookie是什么? cookie是服务器让浏览器保存在浏览器上的一组键值对 2,为什么要有cookie? http 是无状态,每次请求之间没有任何关系,无法保持状态 3,cookie的特点: 1,服务器让浏览器设置的 2,设置之后每次访问相同的页面带上cookie 4,django中的操作cookie 1,设置cookie rep = redirect('/idnex/') rep.set_cookie(key,value,max_age=1000) rep.set_sig

Django中的session和cookie

session和cookie 一. 概念理解 你可能有留意到当你浏览网页时,会有一些推送消息,大多数是你最近留意过的同类东西,比如你想买桌子,上淘宝搜了一下,结果连着几天会有各种各样的桌子的链接.这是因为 你浏览某个网页的时候,WEB 服务器会先送一些资料放在你的计算机上,类似于你打的文字,选的一些东西什么的,Cookie 会帮你都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie里的内容来判断使用者,送出特定的网页内

{Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 xxx 八 xxx 一 会话跟踪 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器了.从双方接通电话那一刻起,会话就开始了,到某一方挂断电话表示会话结束.在通话过程中,你会向10086发出多个请求,那么这多个请