首页 > 其他分享 >Django-cookie和session

Django-cookie和session

时间:2022-12-22 20:22:13浏览次数:36  
标签:return request Django session cookie login def

1.cookies与session简介

1.最早期的互联网不需要保存用户信息,所有用户哪怕之前成功登陆每次用户登录也要重新输入账号和密码。

2.cookie:保存在客户端与用户状态相关的数据,cookie是类似字典的K:V键值对。
"""
比如用户每登陆成功一次浏览器会提醒用户是否要保存用户名和密码。保存成功之后每次浏览器客户端向服务端发送用户数据,但是单纯的记录用户名和密码安全性并不高,所以早期的cookie并不好用。

而现在正在使用的是每当用户成功登陆一次,客户端都会向浏览器服务端发送一个随机字符串,每一个随机字符串对应一个用户。以后再登陆客户端只需要拿该字符串和服务端进行对比即可。
"""
3.2.session:保存在服务端与用户状态相关的数据。session需要依赖于cookie工作。

2.Django操作cookie

1.编写一个真正的用户登录系统(用户名和密码暂时写死):
def home(request):
    if request.COOKIES.get('name'):
        return HttpResponse('欢迎来到主页')
    else:
        return redirect('/login/')

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'max' and password == '123':
'''return返回该对象和返回重定向效果一样,此处返回对象是因为需要生成对象来传递cookie'''
            obj = redirect('/home/')
            obj.set_cookie('name',username)
            return obj  # 相当于 return redirect('/home/')
    return render(request,'login.html')
此时我们哪怕直接访问路由/home/也不需要登录,因为cookie保存了我们的数据,如果删掉cookie那么需要重新登陆。

2.当前方法实现了cookie保存数据的方式,但是扩展性不强,每新增一个需要登录的功能都需要重新添加条件判断,接下来我们用装饰器来让校验功能更便捷:
def login_auth(func):
    def inner(request, *args, **kwargs):
        if request.COOKIES.get('name'):
'''request属于*args,可以单独拿出来,穿的时候如果只传了request首先会被形参request接收'''
            res = func(request, *args, **kwargs)
            return res
        else:
            return redirect('/login/')

    return inner

@login_auth
def home1(request):
    return HttpResponse('欢迎来到主页1')

@login_auth
def home2(request):
    return HttpResponse('欢迎来到主页2')

@login_auth
def home(request):
    return HttpResponse('欢迎来到主页')


def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'max' and password == '123':
            obj = redirect('/home/')
            obj.set_cookie('name', username)
            return obj
    return render(request, 'login.html')

3.当前方法我们实现了多视图函数的cookie校验,但是任然有一个功能缺陷:
if username == 'max' and password == '123':
            obj = redirect('/home/')
以上两行代码决定了我们不管是从哪个页面跳转过来的,登录过后我们只能跳转到/home/页面,这并不符合日常逻辑。我们采用在路由的?后面添加字符串的方式来解决该问题:        
      
def login_auth(func):
    def inner(request, *args, **kwargs):
'''request.path和request.path_info都能拿到请求页面的路由,这样我们就能记录下是哪个页面想服务端发送了请求'''
        target_path = request.path_info
        if request.COOKIES.get('name'):
            res = func(request, *args, **kwargs)
            return res
        else:
'''将路由拼接在/login/?的后面,在登录界面可以将路由拿到并进行跳转'''
            return redirect('/login/?next=%s'%target_path)

    return inner

@login_auth
def home1(request):
    return HttpResponse('欢迎来到主页1')

@login_auth
def home2(request):
    return HttpResponse('欢迎来到主页2')

@login_auth
def home(request):
    return HttpResponse('欢迎来到主页')


def login(request):
    target_path = request.GET.get('next') # <QueryDict: {'next': ['/home1/']}>
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'max' and password == '123':
            if target_path:
                obj = redirect(target_path)
            else:
                obj = redirect('/login/')
            obj.set_cookie('name', username)
            return obj
    return render(request, 'login.html')

3.Django操作session

1.由于session是保存在服务端上面的数据,就应该有个地方能够存储,就需要我们提前创好一张表(可以用sqlite3,也可以用mysql),但是内置的表中已经有django_session,所以我们只需要执行数据库迁移命令即可。

2.创好表之后我们继续在视图层创好相应的函数,函数体代码增加一个session数据,刷新django_session发现里面有一条加密的数据:
语法结构:request.session['key']=value
def session_func(request):
    request.session['session的键'] = '今天周四,又是疯狂星期四'
    return HttpResponse('session_func')

3.存数据底层发生原理:
	3.1当执行request.session['key']=value之后,首先生成一个随机字符串,就是session_key
	3.2对value做加密处理,django会存储session_key以及session_data的对应关系。session_data对应的就是我们添加的值'今天周四,又是疯狂星期四'。
	3.3将随机字符串session_key发一份给cookie。
    此后登陆服务端session会校验用户是否有该字符串,如果有的话在一定时间内就可以不用登录。

4.从session中拿数据:
语法结构:request.session.get('key')
def session_get(request):
    print(request.session.get('session的键'))
    return HttpResponse('session_get')  # 今天周四,又是疯狂星期四

5.取数据底层发生原理:
	6.1自动获取分发的随机字符串
	6.2去django_session表中根据字符串获取加密的数据
	6.3自动解密数据并处理到request.session.get()中
    
6.expire是失效时间,django默认的失效时间是两周(pycharm默认是utc时间)。超过该时间用户需要重新登陆。request.session.set_expiry(时间)。时间以秒为单位。

标签:return,request,Django,session,cookie,login,def
From: https://www.cnblogs.com/zkz0206/p/16999514.html

相关文章

  • 12月22日内容总结——django中间件的三个了解要求的方法、基于django中间件的功能设计
    目录一、django中间件三个了解的方法二、django中间件五个方法的执行流程详解三、基于django中间件的功能设计功能设计介绍如何利用字符串导入模块功能模拟四、cookie与ses......
  • django中的orm
    fromdjango.dbimportmodels#Createyourmodelshere."""1.定义模型类2.模型迁移2.1先生成迁移文件(不会在数据库中生成表,只会创建一个数据表和模型的对应关系)......
  • django之cookie与session
    目录cookie与session简介django操作cookiedjango操作sessioncookie与session简介"""回忆:HTTP协议四大特性 1.基于请求响应 2.基于TCP、IP作用于应用层之上的协议 3.......
  • django之中间件(middleware)
    django之中间件(middleware)在之前一篇博文中,有关django的请求流程中,我们关于中间件这一层并没有详细的介绍,在这张图中,我们将中间层定义为django网关层和路由层的过渡层,那么......
  • django中间件三个了解的方法、 基于django中间件的功能设计、 cookie与session简介、
    目录django中间件三个了解的方法基于django中间件的功能设计cookie与session简介django操作cookiedjango操作cookiedjango操作sessiondjango中间件三个了解的方法1.proc......
  • session实现servlet数据共享
    为了满足老师考试要求,要实现数据共享,要实现顾客登录的功能,登录后进行增删改查要对该顾客进行操作,所以需要将该顾客的一些信息共享给其他操作,找了一些资料,来通过session实现......
  • javaweb总结5-自定义Session
    Session在存储安全性要求较高的会话信息方面是必不可少的,Session当然绝对不是用来存储用户登录状态的,但类似验证码等敏感信息却必须存储在Session中。对于分布式Web应用自......
  • Session的简单应用进行传值
    session可以看做是一个hashmap:存取值的原理同java中的HashMap的键值对相同session.setAttribute("key",value);是session存值的方法,session.getAttribute(key);是sess......
  • Django增删改查
    增删改查。配置对应路由,函数,视图。报错注意看控制台。添加取到前台传来的参数,后端给予验证。入库编辑,取到当前编辑得id,在后台查到对应数据。重新update删除,取到当前点......
  • 第二章:Django的基础操作及配置
    Python三大主流后端框架"""Django 特点:大而全,自带的功能特别多 缺点:有时候过于笨重flask 特点:小而精,自带的功能特别少 但是第三方模块非常的多,如果将flask第三......