Django之cookie 和 session

Stella981
• 阅读 693

一、

1、cookie的由来!!!

    由于HTTP协议是无状态的,既每一次的请求都是独立的,他不会因为你之前来过,就记住你,所以每次浏览器去访问服务器的时候,都是一个全新的过程,之前的数据也不会保留,所以为了解决这个问题,cookie诞生了。

2、什么是cookie?

    Cookie具体指的是一段小信息,他是服务器发送出来存储在浏览器一组键值对,下次访问浏览器时会自动携带这些键值对,以便服务器提取信息。简单来说就是,Cookie会在你访问服务器时给你一个标记,下一次你再来访问只要携带这个标记,就能够访问了。所以他只认标记,不认用户。用的最普遍的就是做登录系统。

3、Cookie的工作原理。

    原理:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断是谁了。

4、查看cookie

Django之cookie 和 session

    Name 和 Value就是键值对

二、Djangoz中操作Cookie

  1、获取cookie   

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

  参数:

    default:默认值

    salt:加密盐

    max_age:生命周期

  2、设置cookie

ret = render (request,'html文件')
ret.set_cookie('key','value')
return ret

    通过set_cookie,这样就对ret 设置了cookie。

   参数:

      key:键

      value:值

      max_age=None,超时时间

      expires = None,超时时间,用于IE浏览器的

      path='/':Cookie生效的路径,/表示根路径,他比较特殊。根路径的cookie可以被任何url页面访问。

      domain = None,cookie生效的域名

      secure= False:https传输

      httponly = False:只能http协议传输,无法被JavaScript获取。(不是绝对的,底层抓包可以获取到,也可以被覆盖)

  3、删除cookie

def logout(request):
    rep = redirect("/login/")
    rep.delete_cookie("key")  # 删除用户浏览器上之前设置的cookie
    return rep

  4、Cookie版登录校验的示例

from django.shortcuts import render, redirect, HttpResponse

# 这是一个装饰器,封装了一个匹配cookie的功能
def login_required(fn):
    def inner(request, *args, **kwargs):
        if not request.COOKIES.get('is_login') == '1':          # 获取cookie的键'is_login',判断它的值是不是1,如果不是就获通过path_info获取到域名之后的路径next
            next = request.path_info                            # cookie匹配不上,就跳转到登录界面,不过这个登录界面拼接了路径。/login/?next={}'.format(next),
                                                                # 拼接的后缀就是为了能够确保,从哪个页面失败人后进入的登录界面,登陆成功后跳回对应的页面
           return redirect('/login/?next={}'.format(next))                                                                
        ret = fn(request, *args, **kwargs)                        # 如果匹配成功,就跳转到被装饰得页面。

        return ret

    return inner

# 这是一个登录函数
def login(request):
    if request.method == 'POST':                    # 判断请求方法,是POST方法,执行下面的操作
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == 'alex' and pwd == 'alexdsb':        # 如果用户名和密码匹配成功了
            next = request.GET.get('next')            # 通过GET方法,获取next。

            if next:                                # 如果next有值,说明不是直接进的登录界面,而是访问其他路径,没有成功,通过装饰器拼接了next跳转过来的
                ret = redirect(next)                # next有值,就跳到next这个路径下
            else:                                    # 如果next没有值,说明是直接进入的登录界面,登陆成功后,直接跳转到'/index/'界面
                ret = redirect('/index/')            

            ret.set_cookie('is_login', '1', max_age=5)        # 设置cookie值cookie('键','值','最大死亡时间')
            return ret                                

    return render(request, 'login.html')


@login_required                                        
def home(request):                                    # 被装饰器装饰的函数,
    return HttpResponse('这是home页面')


@login_required
def index(request):
    return render(request, 'index.html')

# 注销函数
def logout(request):
    ret = redirect('/login/')

    ret.delete_cookie('is_login')                    # 删除cookie之后,跳转回登录页面

    return ret

三、Session

  1、Session的由来

    由于Cookie是存在浏览器上的,所以很不安全,随时可能被拦截和窃取,同时Cookie最大支持4096个字节,多了就没法存储了。这时,为了解决这个问题,提高cookie的安全性,有了Session。它能够支持更多的字节,并且把保存在服务器上,有较高的安全性。  

     由于HTTP是无状态的,所以服务器也不知道是谁再访问,所以就需要Cookie做桥接。给每个客户端的Cookie分配一个唯一的ID,这样用户在访问时,通过Cookie,服务器就知道来的认识谁。

   2、Django中Session的用法

    1、

# 获取、设置、删除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的key
request.session.session_key

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

# 检查会话session的key在数据库中是否存在
request.session.exists("session_key")

# 删除当前会话的所有Session数据
request.session.delete()
  
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush() 
    这用于确保前面的会话数据不可以再次被用户的浏览器访问
    例如,django.contrib.auth.logout() 函数中就会调用它。

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

  3、Session流程解析

Django之cookie 和 session

  3、Session版登录验证

Django之cookie 和 session Django之cookie 和 session

from functools import wraps


def check_login(func):
    @wraps(func)
    def inner(request, *args, **kwargs):
        next_url = request.get_full_path()
        if request.session.get("user"):
            return func(request, *args, **kwargs)
        else:
            return redirect("/login/?next={}".format(next_url))
    return inner


def login(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")

        if user == "alex" and pwd == "alex1234":
            # 设置session
            request.session["user"] = user
            # 获取跳到登陆页面之前的URL
            next_url = request.GET.get("next")
            # 如果有,就跳转回登陆之前的URL
            if next_url:
                return redirect(next_url)
            # 否则默认跳转到index页面
            else:
                return redirect("/index/")
    return render(request, "login.html")


@check_login
def logout(request):
    # 删除所有当前请求相关的session
    request.session.delete()
    return redirect("/login/")


@check_login
def index(request):
    current_user = request.session.get("user", None)
    return render(request, "index.html", {"user": current_user})

Session版登录验证

Session 版登录验证

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Easter79 Easter79
3年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Django组件——cookie与session
Django组件——cookie与session<fontcolor00bff一、会话跟踪技术</font<fontcolorff7f501、什么是会话跟踪技术</font先了解一下什么是会话。可以把
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这