Django

Django的Cookie And Session介绍

2021-06-10  本文已影响0人  Chris0Yang

Cookie

web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术


image.png image.png

Django中Cookie的语法

设置cookie

rep.set_cookie(key,value,...)
rep.set_migned_cookie(key,value,salt='加密',......)

获取cookie

request.COOKIES.get(key)

删除cookie

rep = HttpResponse || render || redirect
rep.delete_cookie(key)
image.png

简单验证Cookie方式

def login(request):
    if request.method == "GET":
        return render(request, "login.html")
    else:
        username = request.POST.get("username")
        pwd = request.POST.get("pwd")

        # 第一:固定的用户密码去连接数据库
        # if username == "admin" and pwd == "123":
        #     rep = redirect("/index/")  # redirect 是指定跳转页面
        #     rep.set_cookie("is_login", True)
        #     print(rep)
        #     return rep
        # else:
        #     return redirect("/login/")

        # 第二:进行数据库认证用户账号和密码
        models.User.objects.filter(name=username, pwd=pwd).first()
        rep = redirect("/index/")  # redirect 是指定跳转页面
        rep.set_cookie("is_login", "XXXXX")  # True是明文形式,建议是使用密文
        rep.set_signed_cookie("secret", "XXXX", "salt")
        print(rep)
        return rep


def index(request):
    # 收到浏览器的再次请求,判断浏览器携带的cookie,是不是登录成功的时候相应的cookie
    status = request.COOKIES.get("is_login")
    if not status:
        return redirect("/login/")
    return HttpResponse("index")


def logout(request):
    rep = redirect("/login/")  # redirect 是指定跳转页面
    rep.delete_cookie("is_login")
    return rep  # 点击注销后执行,删除cookie,不再保存用户状态,并弹到登录页面


def order(request):
    print(request.COOKIES.get("is_login"))
    status = request.COOKIES.get("is_login")
    if not status:
        return redirect("/login/")
    return render(request, "order.html")

Session

Cookie 和 Session有什么区别?

为啥会用Session,是因为cookie保存数据是有限制,默认的4096字节,而且将一些敏感数据保存到客服端是最不安全的。因此,我们需要将数据保存到服务端数据库中,这样数据长度不受限制,并且相对安全。

cookie弥补 HTTP 无状态的不足,让服务器知道来的人是 " 谁 ",但是cookie以文本的形式保存在浏览器也就是客户端,安全性较差,且最大只支持4096字节,所以只通过cookie识别不同的用户,然后,在对应的session里保存私密的信息,以及超过4096字节的文本。

session 原理

1)浏览器第一次请求获取登录页面login
2)浏览器输入账号密码第二次请求,若输入正确,服务器响应浏览器一个index页面和一个键为sessionid,值为随机字符串的cookie,即set_cookie("session",随机字符串)
3)服务器内部在django.session表中记录一条数据

4)浏览器第三次请求其他资源时,携带cookie:{ sessinoid:随机字符串 },服务器从django.session表中根据该随机字符串取出该用户的数据,供其使用(即保存状态)

注意:django.session表中保存的是浏览器信息,而不是每一个用户的信息。因此,同一浏览器多个用户请求只保存一条记录(后面覆盖前面),多个浏览器请求才保存多条记录。

session保存位置:djago-session表

1)保存在服务端,没有任何大小限制

2)可以在Redis保存Session

# Redis在django中的settings配置
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
            # "PASSWORD": "123",
        }
    }
}

# Session的存储配置
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'

# 设置Session失效时间,单位为秒
SESSION_COOKIE_AGE = 60*5

Django Session 使用方式

def login(request):
    if request.method == "GET":
        return render(request, "login.html")
    else:
        username = request.POST.get("username")
        pwd = request.POST.get("pwd")

        # Session验证登录
        if username == "admin" and pwd == "123":
            # request.session会向浏览器客户端写入cookie的值,键默认是sessionid,同时也会保存数据会到保存到session表中
            request.session["is_login"] = True
            request.session["user01"] = username
            return redirect("/index/")
        else:
            return redirect("/login/")


def index(request):
    # 收到浏览器的再次请求,判断浏览器携带的cookie,是不是登录成功的时候相应的cookie
    status = request.session.get("is_login")
    if not status:
        return redirect("/login/")
    return HttpResponse("index")


def logout(request):
    # request.session["is_login"] # 删除session_data里的一组键值对
    request.session.flush()  # 删除一条记录包括(session_key  session_data session_date)三个字段
    return redirect("/login/")

Django使用Redis保存Session

# Redis在Django中的配置
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
            # "PASSWORD": "123",
        }
    }
}

# session的存储配置
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'

# 设置session失效时间,单位为秒
SESSION_COOKIE_AGE = 60*5
上一篇 下一篇

猜你喜欢

热点阅读