Django cookie-session

Cookie

1、获取Cookie
request.COOKIES.get("islogin",None)  #如果有就获取,没有就默认为none
2、设置Cookie
  obj = redirect("/index/")
  obj.set_cookie("islogin",True)  #设置cookie值,注意这里的参数,一个是键,一个是值
  obj.set_cookie("haiyan","344",20)  #20代表过期时间
  obj.set_cookie("username", username)
  
  return obj # 设置完毕后把该cookie返回
3、删除Cookie
obj.delete_cookie("cookie_key",path="/",domain=name)

Session

1、基本操作(需要掌握的)

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

 
  1. 其他操作

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() 函数中就会调用它。
 
 
11 用户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失效策略。

Cookie、Session分析过程

代码
views.py

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

from cookie_session.models import *
# Create your views here.

def login(request):
    print('session',request.session)
    print('cookie',request.COOKIES)
    print('login-----session---username',request.session.get('username'))

    print("haslogined",request.COOKIES.get('haslogined',None))
    print("islogined",request.COOKIES.get('islogined',None))

    if request.method == 'POST':
        name = request.POST.get('user')
        pwd = request.POST.get('pwd')

        ret = User.objects.filter(name=name,pwd=pwd)
        print('ret',ret)
        if ret.exists():
            # cookie_set =  redirect("/cs/index/")
            # cookie_set.set_cookie("username",name)
            # cookie_set.set_cookie("pwd",pwd)
            # cookie_set.set_cookie("haslogined",True)

            # 设置session内部的字典内容,该部分内容会存入django_session数据库
            request.session['islogined'] = True
            request.session['username'] = name

            return redirect("/cs/index/")
    return render(request, "CS/login.html")

def index(request):
    print('index------session', request.session)
    print('index------cookie', request.COOKIES)
    print("index-----islogined",request.session.get('islogined',False))
    print('index-----session---username',request.session.get('username'))

    if request.session.get('islogined',False):
        # 获取字典的内容并传入页面文件
        cookie_content = request.COOKIES
        session_content = request.session
        username = request.session['username']

        return render(request, 'CS/index.html', locals())


    return redirect("/cs/login/")

def logout(request):
    try:
        # del request.session['islogined']
        request.session.flush()  # 删除django-session表中的对应一行记录
    except KeyError as e:
        print('KeyError异常')
        pass
    return redirect('/cs/login/')

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    {% load staticfiles %}
    <script src={% static "jquery-3.3.1.js" %}></script>
    <title>Title</title>

    <style>
        * {
            margin: 0;
            padding: 0
        }


    </style>
</head>
<body>


<form action="/cs/login/" method="post"> {% csrf_token %}
    <p>姓名<input type="text" name="user"></p>
    <p>密码<input type="password" name="pwd"></p>
    <p><input type="submit"></p>
</form>


</body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    {% load staticfiles %}
{#    <script src="jquery-3.1.1.js"></script>#}
    <script src={% static "jquery-3.3.1.js" %}></script>
    <title>Title</title>

    <style>
        * {
            margin: 0;
            padding: 0
        }


    </style>
</head>
<body>

<h1>hello {{ username }}</h1>
<a href="/cs/logout/">注销</a>
</body>
</html>
过程分析
1.我们打开login登录界面,填写好用户名和密码,这个时候当我们点击提交
  • 在login方法中首先验证用户名密码
  • 验证通过,给服务端设置session并重定向
 # 设置session内部的字典内容,该部分内容会存入django_session数据库
            request.session['islogined'] = True
            request.session['username'] = name

            return redirect("/cs/index/")

这几步非常重要,Django会默认执行一下操作

1、创建随机字符串。假如s=“sdgsdfg4565dfgsdfgsdf”

2、 在django-session表中,添加一条记录

django-session有三个字段,分别是:session_key,session_data,expire_data

SQL: 语句: insert into django-session values (s,"{“IS_LOGON”:True,“USER”:egon}",12321)

3、给浏览器设置sessionID: obj.set_cookie(“sessionID”,s)

所有,重定向后会像数据库中添加一条Session记录,并向request.Cookie中添加一个sessionID字段(用于找到session记录),然后会将该Request传递给index方法或者直接返回给浏览器

然后进入到index方法
  • 读取sesion中的字段值islogined
    if request.session.get('islogined',False):

我猜测,这里Djano先是会根据传入过来的Cookie中的sessionID,找到Django-session表中对应的那一条Session记录

如果islogined没有在该条记录中,则不能通过重定向到login界面

通过islogined存在且为True,则通过验证,并从找到的sesion中取出username传递给浏览器

   # 获取字典的内容并传入页面文件
        cookie_content = request.COOKIES
        session_content = request.session
        username = request.session['username']

        return render(request, 'CS/index.html', locals())
总结

重点是必须在登录成功后设置session的内容,然后重定向

然后在index方法中,验证上面所设置的内容信息,如islogined等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值