Django_cookie+session

 一、cookie和session介绍

cookie

  由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取。

  可在浏览器捕获明文cookie:csrftoken=NvUTqOiwD5nvxWxh8lhfy5Xx24pGoq7ebBePlJaIONiuxgzeeHgVb1KQnk3wIunM; key=value; mycookie=123;

session

  由于cookie会把所有的信息都保存在客户端,也就是浏览器上,这样会导致不安全,所以引用了session,但是只是单单的session也不好用,必须session和cookie配合这去用。

  session支持更多的字节,session会把信息保存在服务端。,有较高的安全性。

  服务器端随机生成一个字符串(sessionid),一份存在服务器,一份存在客户浏览器。见后面图。

 

 二、cookie使用

1、用法

===================python===================
获取cookie
request.COOKIES.get("islogin",None)  #如果有就获取,没有就默认为none


设置cookie
 obj = redirect("/index/")
 obj.set_cookie("key","value")  #设置cookie值,注意这里的参数,一个是键,一个是值
 obj.set_cookie("mycookie","123",expires=60)  #20代表过期时间


删除cookie
obj.delete_cookie("cookie_key",path="/",domain=None)



===================html===================
    {#方法1,需进行后续切割处理#}
    <script>
        document.write(document.cookie)
    </script>

    {#方法2#}
    <script src="/static/plugins/jquery-3.3.1.js"></script>
    <script src="/static/plugins/jquery.cookie.js"></script>
    <script>
        $.cookie("cookie_name")  # 获取名为cookie_name的cookie,结果是明文字符串
        $("body").append($.cookie('key')); // value
        $("body").append($.cookie('mycookie'));  // 123
        $("body").append($.cookie('userinfo'));  // {"username": "abc"\054 "nickname": "\u5c31\u8981\u5403\u8089"}
    </script>
cookie用法

2、示例

urlpatterns = [
    # path('admin/', admin.site.urls),
    path("cookie.html",views.cookie),
    path("session.html",views.session),
    path("index.html",views.index),
]
urls.py
======================== views.py ========================

from django.shortcuts import render,redirect
import json


def cookie(request):
    print(request.COOKIES)  # {'csrftoken': 'NvUTqOiwD5nvxWxh8lhfy5Xx24pGoq7ebBePlJaIONiuxgzeeHgVb1KQnk3wIunM', 'sessionid': '0hpm33x27gdvbs5kqhbzc37bentq20cb'}
    obj = redirect("/index.html")
    obj.set_cookie("key","value")  # 参数分别是键、值、超时时间
    obj.set_cookie("mycookie","123",expires=60)
    obj.set_cookie("userinfo",json.dumps({"username":"abc","nickname":"就要吃肉"}))  # cookie只支持str
    return obj

def index(request):
    print(request.COOKIES.get("key"))  # value
    print(request.COOKIES.get("mycookie"))  # 123
    print(json.loads(request.COOKIES.get("userinfo")))  # {'username': 'abc', 'nickname': '就要吃肉'}
    return render(request,"index.html")
views.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>index页面</h1>
    
    {#方法1,需进行后续切割处理#}
    <script>
        document.write(document.cookie)
    </script>

    {#方法2#}
    <script src="/static/plugins/jquery-3.3.1.js"></script>
    <script src="/static/plugins/jquery.cookie.js"></script>
    <script>
        $("body").append("<hr>");
        $("body").append($.cookie('key')); // value
        $("body").append("<hr>");
        $("body").append($.cookie('mycookie'));  // 123
        $("body").append("<hr>");
        $("body").append($.cookie('userinfo'));  // {"username": "abc"\054 "nickname": "\u5c31\u8981\u5403\u8089"}
    </script>
</body>
</html>
index.html

浏览器查看cookie

 

html页面显示结果

<script src="/static/plugins/jquery-3.3.1.js"></script>
<script src="/static/plugins/jquery.cookie.js"></script>
$.cookie('key')

 

 

三、session使用

1、用法

使用方法

1、设置session值
    request.session["session_name"]="admin"
2、获取session值
    session_name = request.session.get("session_name")
3、删除session值
    del request.session["session_name"]  删除一组键值对
    request.session.flush()   删除一条记录,删除会话的Cookie
4、检测是否操作session值
    if "session_name"  is request.session:

5、get(key, default=None)
 
fav_color = request.session.get('fav_color', 'red')
 
6、pop(key)
 
fav_color = request.session.pop('fav_color')
 
7、keys()
 
8、items()
 
9、setdefault()
 
10、flush() 删除当前的会话数据并删除会话的Cookie。
            这用于确保前面的会话数据不可以再次被用户的浏览器访问
            例如,django.contrib.auth.logout() 函数中就会调用它。
用户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用法
session用法

session存储的相关配置

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,默认修改之后才保存(默认)
默认的是数据库配置
setting.py
  
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
  
  
    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,默认修改之后才保存
缓存配置
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()        
    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,默认修改之后才保存
文件配置

2、实验:登录、登出

登录:

from django.shortcuts import render,redirect, HttpResponse
import json


def login(request):
    if request.method == "GET":
        return render(request,"login.html")
    else:
        username = request.POST.get("username")
        password = request.POST.get("password")
        if username == "abc" and password == "123":  # 结合数据库,这里只做简单比对
            request.session["islogin"] = True
            request.session["userinfo"] = {"username":username}
            request.session["for_flush"] = "flush"
            return redirect("/index.html")
        else:
            return HttpResponse("账号或密码错误")

def index(request):
    print(request.session.session_key)
    print(request.session.get("islogin"))  # True
    print(request.session.get("userinfo"))  # {'username': 'abc'}
    print(request.session.get("for_flush"))  # flush

    # 删除for_flush字段
    del request.session["for_flush"]  # 删除服务器端session的某个字段
    # request.session.flush()  # 删除该用户浏览器上所有session数据

    if request.session.get("islogin"):
        return render(request,"index.html")
    else:
        return redirect("/login.html")
views.py
from django.urls import path
from app01 import views

urlpatterns = [
    path("login.html",views.login),
    path("index.html",views.index),
]
urls.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="POST" action="">
        {% csrf_token %}
        <p>用户名 <input type="text" name="username"></p>
        <p>密码 <input type="password" name="password"></p>
        <p><input type="submit"></p>
    </form>

</body>
</html>
login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>index页面</h1>
    <h2>欢迎登录,{{ request.session.userinfo.username }}</h2>

</body>
</html>
index.html

登出:

def logout(request):
    del request.session["userinfo"]
    request.session.delete("session_key")
    return redirect("/")
views.py

 

1)首次进入登录页面,填入账号密码并提交

2)服务器随机生成sessionid,一份存在数据库(或缓存、文件),一份发给浏览器

数据库的sessionid

浏览器上的sessionid

 

(3)登录成功后,带着sessionid去访问index.html

 

  

posted @ 2018-03-08 17:14  fat39  阅读(197)  评论(0编辑  收藏  举报