Django Cookie和Session

本文深入解析了Cookie与Session的工作原理及使用方法,包括Cookie的创建、获取与删除,以及Session的依赖关系、创建、获取、删除和超时设置。同时,通过示例展示了如何在Django框架中实现简单的登录功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Cookie

1、产生的原因

HTTP请求无状态,每一次请求都是独立的

2、Cookie的实质

服务端(响应)创建Cookie(键值对或字典),并保存到浏览器

3、创建

rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='', ...)
重要参数:slat 加盐
            
注意:设置cookie要在响应中

4、获取

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=,)
    重要参数:default是,没有此值时返回的值
  max_age 单位秒,Cookie失效

5、删除

rep.delete_cookie("key")
    key为自定义的cookie key

二、Session

1、产生原因

Cookie不安全,并且数据量有限

2、重点

session依赖cookie,把键值对传递保存在服务端

3、过程

存session

a、服务端,创建一个随机字符串

b、创建一个字典,用于保存数据

c、将随机字符串发送给浏览器作为cookie

取session

a、通过cookie获取随机字符串

b、通过字符串获取大字典

c、通过key获取value

4、创建session(和字典相似)

request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置

5、获取session

request.session['k1']
request.session.get('k1',None)

6、删除

del request.session['k1'] 
# 删除当前会话的所有Session数据
request.session.delete()
# 删除当前的会话数据并删除会话的Cookie,最常用
request.session.flush()

7、其它重要的方法

# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。
request.session.clear_expired()
# 清除过期的Session

# 在setting.py文件中添加
SESSION_SAVE_EVERY_REQUEST = True
# 每次请求都保存Session

 8、注意:Session是存放的数据库django_session里的,别忘记makegriations 和migrate

三、总结

1、Cookie是Session的依赖

2、Cookie的存在浏览器

3、Session存在服务端(数据库)

session实现的简单的登录

from django.shortcuts import render, redirect
from app01 import models
# Create your views here.


# 登录
def login(request):
    if request.method == "POST":
        u = request.POST.get("username")
        pwd = request.POST.get("pwd")
        user_obj = models.UserInfo.objects.filter(name=u, pwd=pwd).first()
        # 用户存在
        if user_obj:
            # next_url存在,说明是从其它页面进入login页面的
            # /login/?next=/index/
            # 若存在登录后,返回原来的页面,若不存在,跳转到index页面
            next_url = request.GET.get("next")
            request.session["user_id"] = user_obj.pk
            if next_url:
                return redirect(next_url)
            else:
                return redirect("/index/")
    return render(request, "login.html")


# 主页
def index(request):
    # 若果用户已登录,进入index,否侧返回login,并在login后面添加参数
    user_id = request.session.get("user_id")
    if user_id:
        return render(request, "index.html")
    else:
        nex_url = request.path_info
        return redirect("/login/?next={}".format(nex_url))


# 注销
def logout(request):
    request.session.delete()
    return redirect("/login/")
原始
from django.shortcuts import render, redirect
from app01 import models



# 登录
def login(request):
    if request.method == "POST":
        u = request.POST.get("username")
        pwd = request.POST.get("pwd")
        user_obj = models.UserInfo.objects.filter(name=u, pwd=pwd).first()
        # 用户存在
        if user_obj:
            # next_url存在,说明是从其它页面进入login页面的
            # /login/?next=/index/
            # 若存在登录后,返回原来的页面,若不存在,跳转到index页面
            next_url = request.GET.get("next")
            request.session["user_id"] = user_obj.pk
            if next_url:
                return redirect(next_url)
            else:
                return redirect("/index/")
    return render(request, "login.html")


# 主页
# @check_login
def index(request):

    return render(request, "index.html")


# 注销
# @check_login
def logout(request):
    request.session.delete()
    return redirect("/login/")
基于中间件视图的代码

 

import re
from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin


class LoginMiddleware(MiddlewareMixin):
    def process_request(self, request):
        current_url = request.path_info
        # 设置白名单
        valid_list = ['/login/', '/logout/', '/admin/.*']
        for url in valid_list:
            ret = re.search(url, current_url)
            if ret:
                return None
        user_id = request.session.get("user_id")
        if user_id:
            return None
        else:
            return redirect("/login/?next={}".format(current_url))
中间件

 

from django.shortcuts import render, redirect
from app01 import models
from functools import wraps
# Create your views here.


# 装饰器
def check_login(f):
    @wraps(f)
    def inner(request, *args, **kwargs):
        user_id = request.session.get("user_id")
        if user_id:
            return f(request, *args, **kwargs)
        else:
            nex_url = request.path_info
            return redirect("/login/?next={}".format(nex_url))
    return inner


# 登录
def login(request):
    if request.method == "POST":
        u = request.POST.get("username")
        pwd = request.POST.get("pwd")
        user_obj = models.UserInfo.objects.filter(name=u, pwd=pwd).first()
        # 用户存在
        if user_obj:
            # next_url存在,说明是从其它页面进入login页面的
            # /login/?next=/index/
            # 若存在登录后,返回原来的页面,若不存在,跳转到index页面
            next_url = request.GET.get("next")
            request.session["user_id"] = user_obj.pk
            if next_url:
                return redirect(next_url)
            else:
                return redirect("/index/")
    return render(request, "login.html")


# 主页
@check_login
def index(request):

    return render(request, "index.html")


# 注销
@check_login
def logout(request):
    request.session.delete()
    return redirect("/login/")
装饰器

 

转载于:https://www.cnblogs.com/wt7018/p/11284177.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值