cookie

http请求时无状态的,一个客户端第一次,第二次,第n次访问同一个服务器都是一样的,服务器都会按照一个新的连接处理。但是,有时候客户端需要服务器记住客户端的登录状态,譬如离开一会,回来之后,仍然保持着之前的登录状态。这时候就需要cookie和session。

cookie: 是服务器发送的保存在客户端的一个字符串,浏览器每次请求是都会带上cookie,例如,把用户名和密码保存在cookie中,只要cookie没有过期,以后用户每次登录都可以自动登录,不需要再输入用户名和密码。

session: 是保存在服务器端的一个大的字典,浏览器第一次访问服务器的时候,服务器把sessionid传到浏览器,然后浏览器把sessionid保存在lcookie中,每次访问时,带上这个标识,服务器就可以标识这个请求来自哪个用户。

cookie与session的详细介绍可以查看,cookie与session

一个简单的实例来说明cookie的用法:

django写两个页面,一个登录页面,登录成功之后跳转到另一个页面:

模板html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    {% block title %}{% endblock %}
    <style>
        .pg-header{
            position: fixed;
            right: 0;
            left: 0;
            top: 0;
            height: 48px;
            background-color: #2459a2;
        }
        .pg2{
            color: white;
            display: inline-block;
            padding: 0 10px 0 10px;
            text-decoration:none;
        }
        .pg2:hover{
            background-color: blue;
        }
        .body_css{
            margin-top: 50px;
        }
    </style>
</head>
<body>
    <div class="pg-header">
        <div style="width: 980px; margin: 0 auto; line-height: 48px;">
            <a class="pg2" href="https://www.feidai.com">LOGO</a>
            <a class="pg2" href="https://www.feidai.com">论坛</a>
            <a class="pg2" href="https://www.feidai.com">天下</a>
            <a class="pg2">UFO</a>
        </div>
    </div>
    <div class="body_css">
        {% block content %}
        {% endblock %}
    </div>
</body>
</html>

master.html模板文件

登录页面如下,

{% extends "master.html" %}

{% block title %}
    <title>登录</title>
{% endblock %}

{% block content %}
    <form action="/login" method="post">
        <input type="text"  name="username" placeholder="用户名">
        <input type="password" name="pwd" placeholder="密码" >
        <input type="submit" value="登录">
    </form>
{% endblock %}

login.html

登录成功之后,跳转的页面如下:

{% extends "master.html" %}
{% block title %}
    测试继承
{% endblock %}

{% block content %}
    <h1>东周列国志</h1>
    <textarea name="dzlgz" id="" cols="30" rows="10" style="width: 260px">
        道德三皇五帝,功名夏后商周。
        英雄五霸闹春秋,顷刻兴亡过手。
        青史几行名姓,北郊无数荒丘。
        前人田地后人收,说甚龙争虎斗。
    </textarea>
    <h1>欢迎登录{{ current_user }}</h1>
{% endblock %}

index.html页面

各个页面对应的视图函数如下:因为只是为了验证,代码中使用字典存储了两个用户的信息。

def index(request):
    v = request.COOKIES.get("username22")
    if v:
        return render(request, "one.html", {"current_user": v})
    else:
        return HttpResponse("GUN")

user_dict = {"wangxz": {"passwd": "123123"},
             "lfy": {"passwd": "kkkkk"}
             }

def login(request):
    if request.method == "GET":
        return render(request, "login.html")
    elif request.method == "POST":
        u = request.POST.get("username")
        p = request.POST.get("pwd")
        user = user_dict.get(u)
        if not user:
            return render(request, "login.html")

        if user["passwd"] == p:
            res = redirect("/index")
            # 这只cookie关闭浏览器就失效
            res.set_cookie("username22", u)
            return res
        else:
            return HttpResponse("用户名或密码错误")

对应的视图函数

在login函数中,我们使用了django自带的set_cookie函数来设置了cookie。

然后运行django,验证一下设置的cookie,在上面的index视图函数中加入打印语句,print(v);

在浏览器输入http://127.0.0.1:8000/login然后输入用户名和密码;点击登录可以看到如下,请求过程。

  1. 首先请求login页面,服务器会把cookie作为响应的一部分,传入到浏览器,然后浏览器把cookie存储到本地。
  2. 点击登录后,页面跳转到index,浏览器会把cookie作为请求的一部分传入到服务器,服务器会收到浏览器的请求。

查看logni的响应部分如下:

index的请求报文如下:

服务端print语句得到的结果如下:

这样默认的设置,cookie的有效期为浏览器关闭之后,cookie即失效,我们可以对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获取(不是绝对,底层抓包可以获取到也可以被覆盖)
  • 设置cookie的有效期为5s:  res.set_cookie("username22", u, max_age=5),

这样设置cookie的有效期,cookie是从第一次登陆界面开始计算,正常是,cookie有效期是从,最后一次登陆开始,可以这样设置,如下:

current_time = datetime.datetime.utcnow()
current_data = current_time + datetime.timedelta(seconds=10)
response.set_cookie('key','value',expires=current_data)

上面的cookie我们使用的明文传输,还可以使用加密的方式传输。

cookie 将字符串进行salt加解密,写法如下:
obj = HttpResponse('s')
obj.set_signed_cookie('username','jack',salt='adfadf') # 通过salt进行加密
request.get_signed_cookie('username',salt='adfadf') # 通过原来的salt进行解密

cookie的应用之二:

在访问有许多类似excel表格的页面时,我们希望,可以改变每个页面输出的数据的条目数量,这个数量从前端到后端的传输,我们可以使用cookie来处理,如下:

cookie是存储在客户端的,session是存储在服务器端的。

session

django中默认支持session,其中提供了5种方式来存储session。

  • 数据库(默认的)
  • 缓存
  • 文件
  • 缓存+数据库
  • 加密cookie

数据库

Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。

a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)

    SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
    SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
    SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
    SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

b. 使用

    def index(request):
        # 获取、设置、删除Session中数据
        request.session['k1']
        request.session.get('k1',None)
        request.session['k1'] = 123
        request.session.setdefault('k1',123) # 存在则不设置
        del request.session['k1']

        # 所有 键、值、键值对
        request.session.keys()
        request.session.values()
        request.session.items()
        request.session.iterkeys()
        request.session.itervalues()
        request.session.iteritems()

        # 用户session的随机字符串
        request.session.session_key

        # 将所有Session失效日期小于当前日期的数据删除
        request.session.clear_expired()

        # 检查 用户session的随机字符串 在数据库中是否
        request.session.exists("session_key")

        # 删除当前用户的所有Session数据
        request.session.delete("session_key")

        request.session.set_expiry(value)
            * 如果value是个整数,session会在些秒数后失效。
            * 如果value是个datatime或timedelta,session就会在这个时间后失效。
            * 如果value是0,用户关闭浏览器session就会失效。
            * 如果value是None,session会依赖全局session失效策略。

数据库存储session

html页面和上面的一样,需要更改的是视图函数,视图函数如下:

def login(request):
    if request.method == "GET":
        return render(request, "login.html")
    if request.method == "POST":
        user = request.POST.get("user", None)
        pwd = request.POST.get("pwd", None)
        ":
            request.session["username"] = user
            request.session.set_expiry(10)
            return redirect("/index")
        else:
            return render(request, "login.html")

def index(request):
    ses = request.session.get("username", None)
    print(ses)
    if ses:
        return HttpResponse("OK")
    else:
        return HttpResponse("gun")

session存储数据库

上面代码设置了session存储在数据库中,有效期为10s,django默认使用sqlite存储,因此,启动之前需要使用如下两个命令,创建对应的表。

python manage.py  makemigrations
python manage.py migrate 

访问页面输入密码,可以在数据库中发现对应的session数据:

Django框架介绍之cookie与session的更多相关文章

  1. Django框架中的Cookie和Session

    学习内容: (1)cookie (2)session Web是基于请求/响应模式,HTTP协议是无状态的,但是基于 Internet的各种服务系统应运而生,建立商业站点或者功能比较完善的个人站点,常常 ...

  2. django框架中的cookie与session

    cookie因为http是一个无状态协议,无法记录用户上一步的操作,所以需要状态保持.cookie和session的区别:1.cookie是保存在浏览器本地的,所以相对不安全.cookie是4k的大小 ...

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

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

  4. Python的Django框架中的Cookie相关处理

    Python的Django框架中的Cookie相关处理 浏览器的开发人员在非常早的时候就已经意识到. HTTP's 的无状态会对Web开发人员带来非常大的问题,于是(cookies)应运而生. coo ...

  5. day 62.3 Django基础八之cookie和session

    Django基础八之cookie和session   本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx ...

  6. day 73 Django基础八之cookie和session

      Django基础八之cookie和session   本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 x ...

  7. Django基础六之cookie和session

    Django基础六之cookie和session 目录 Django基础六之cookie和session 1. cookie和session介绍 1.1 cookie 简介 1.2 cookie的缺陷 ...

  8. Django 框架介绍

    Django 框架介绍 MVC框架和MTV框架 简单了解一下什么是MVC框架.MVC(Model View Controller),是模型(model)-视图(view)-控制器(controller ...

  9. 第三百零三节,Django框架介绍——用pycharm创建Django项目

    Django框架介绍 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内 ...

随机推荐

  1. Yii2 使用json 和设置component 中'format' => yii\web\Response::FORMAT_JSON 的区别

    在Yii2中如果设置了 'response' => [  'format' => yii\web\Response::FORMAT_JSON,  'charset' => 'UTF- ...

  2. kernel中文件的读写操作可以使用vfs_read()和vfs_write

    需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据.在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有: filp_open() fil ...

  3. poj1001 Exponentiation【java大数】

    Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 183034   Accepted: 44062 ...

  4. hadoop第一部分-安装、测试

    一.hadoop安装(本地模式及伪分布式安装) hadoop历史版本下载网站:http://archive.apache.org/dist/运行模式:    本地模式    yarn模式 hadoop ...

  5. Git:从github上克隆、修改和更新项目

    一.在本地新建一个文件夹,作为本地仓库,如“BigProjet”.在该文件夹打开git bash,进入到该文件夹目录下 二.将本地仓库初始化 $ git init 三.将项目从github或者服务器上 ...

  6. Indexes (also called “keys” in MySQL)

    High Performance MySQL, Third Edition by Baron Schwartz, Peter Zaitsev, and Vadim Tkachenko   Is an ...

  7. createrepo local http yum

    https://www.jianshu.com/p/59ca879584a1   repodata作为软件的仓库,其目录下有四个必要文件:filelists.xml.[gz],other.xml.[g ...

  8. django模板语言转义处理

    模板变量的内容,如果含html的话,django的模板系统默认会对输出进行转义,比如把<p>转义成了<p> ,然后再显示出来的时候就如实地显示为<p>.要解决这个问 ...

  9. easyui DataGrid表体单元格跨列rowspan

    最近做项目用到了jquery easyui,其中一组DataGrid做的报表是给客户大领导看的,客户要求报表样式跟他们原有系统的一模一样(如下图1). DataGrid样式好调,只是城市名称单元格跨行 ...

  10. tomcatserver解析(五)-- Poller

    在前面的分析中介绍过,Acceptor的作用是控制与tomcat建立连接的数量,但Acceptor仅仅负责建立连接.socket内容的读写是通过Poller来实现的.   Poller使用java n ...