首页 > 其他分享 >Django框架之Cookie和Session

Django框架之Cookie和Session

时间:2024-03-25 18:12:38浏览次数:17  
标签:cookie obj Session request Django session Cookie return page

【一】Cookie与Session介绍

【1】早期的网站

  • 早期的很多网站可能都没有保存用户功能的需求,所有用户访问的返回结果都是一样的,如新闻,博客文章等等...
  • 但是互联网发展至今,已经有绝大多数网站,在你登录后反馈的页面和不登录反馈的页面已经是不一样的了,这些网站就用到了保存用户登录信息的技术

【2】Cookie

  • 服务器保存在客户端浏览器上的信息都可以称之为Cookie
  • 指代服务端希望客户端保存起来的数据、
  • 它的表现形式一般都是K:V键值对,可以有多个

【3】Session

  • 保存在服务器上的信息都可以称之为Session
  • 他指代服务端保存的跟用户信息相关的数据
  • 他的表现形式也是KV键值对,键和值都会会以加密的形式存储到一张表里

【4】总结

  • cookie就是保存在客户端浏览器上的信息
  • session就是保存在服务端上的信息
  • session是基于cookie工作的(其实大部分的保存用户状态的操作都需要使用cookie)

【二】Django操作Cookie

  • cookie是服务端希望浏览器保存下来的内容,但是浏览器也有权利不保存,
  • 这样浏览器就无法保存用户登录信息

【1】视图返回值变形

  • 为了方便对Cookie的方便,需要将视图函数的返回值进行小变形
obj = HttpResponse()
return obj

obj1 = render()
return obj1

obj2 = redirect()
return obj2

【2】设置cookie

obj = HttpResponse()
obj.set_cookie(key,value)
return obj

【3】获取cookie值

COOKIES.get()

request.COOKIES.get(key)

【4】设置过期时间

  • 以秒为单位
obj = HttpResponse()
obj.set_cookie(key,value,max_age=5)
# 设置超时时间 5s 到期
return obj

【5】注销cookie

obj = HttpResponse()
obj.delete_cookie(key)
return obj

【6】登录功能小案例

# 登录认证装饰器
# tag_url是获取当前用户想要进入的页面
def login_auth(func):
    def inner(request, *args, **kwargs):
        if not request.COOKIES:
            tag_url = request.get_full_path()
            return redirect(to=f'/app1/login/?next={tag_url}')
        res = func(request, *args, **kwargs)
        return res

    return inner

# 登录函数
# 这里通过重定向到tag_url就可以进入到用户想要的界面
def login(request):
    from .lib.Form import LoginForm
    form_obj = LoginForm()
    if request.method == 'POST':
        form_obj = LoginForm(request.POST)
        if form_obj.is_valid():
            tag_url = request.GET.get('next')
            print(tag_url)
            username = form_obj.cleaned_data.get('username')
            obj = redirect(to=tag_url)
            obj.set_cookie(key='username', value=username)
            return obj
    return render(request, 'login.html', locals())

# 装上装饰器的函数
@login_auth
def show_book(request):
    from utils.page import Pagination
    book_obj = models.Book.objects.all()
    current_page = request.GET.get('page', 1)
    all_count = book_obj.count()
    page_obj = Pagination(current_page=current_page, all_count=all_count, per_page_num=3)
    page_queryset = book_obj[page_obj.start:page_obj.end]
    return render(request, 'book.html', locals())

【三】Django操作Session

  • session数据是保存在服务端的,给客户端返回的是一个随机的字符串
  • sessionid:随机字符串

【1】设置session

request.session['key'] = value

# 内部发生的事情
1.产生一个随机的字符串
2.在某个地方存储字符串与加密数据的对应关系
3.将产生的随机字符串也发给浏览器一份,并且让它保存

【2】获取session

request.session.get('key')

# 内部发生的事情
1.获取浏览器保存的随机字符串
2.将获取到的随机字符串与数据库中的字符串进行比对
3.如果有对应的数据,就将其以字典的形式封装到request.session中,没有就是None

【3】设置/获取多个session值

  • 当同一个IP地址且同一个浏览器给session设置多个值时,存在数据库中的数据仍然只有一条
  • 但是在取session的时候,可以通过request.session对象获取到设置的多组键值对

【4】设置过期时间

# 设置过期时间
request.session.set_expiry(value)

# 如果value是个整数,session会在些秒数后失效。
# 如果value是个datatime或timedelta,session就会在这个时间后失效。
# 如果value是0,用户关闭浏览器session就会失效。
# 如果value是None,session会依赖全局session失效策略。
# 默认的过期时间为14天

【5】情况session

  • 在用户注销的时候会用到
# 只删除服务端的
request.session.delete()

# 客户端 服务端都删除的
request.session.flush()

标签:cookie,obj,Session,request,Django,session,Cookie,return,page
From: https://www.cnblogs.com/Hqqqq/p/18095006

相关文章

  • Django框架之csrf跨站请求
    【一】跨站请求伪造介绍【1】引入CSRF(Cross-SiteRequestForgery)跨站请求伪造是一种常见的网络攻击方式。攻击者通过诱导受害者访问恶意网站或点击恶意链接将恶意请求发送到目标网站上利用受害者在目标网站中已登录的身份来执行某些操作从而达到攻击的目的。【2】举......
  • Django框架之中间件思想
    【一】引入我们在Django的配置文件中,里面的中间件配置文件虽然使用逗号分开,但是可以直接映入到某个模块MIDDLEWARE=['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.C......
  • Django框架之auth模块
    【一】Auth模块引入auth模块是django自带的用户认证模块当我们开发一个网站的时候,无可避免的需要设计实现网站的用户登陆系统。此时我们需要实现包括用户的注册,登录,全局登录认证,注销,修改密码等等,如果要靠自己一点点敲代码完成,那实在是太繁琐了Django为我们提供的Auth模块......
  • Django框架静态文件
    【一】静态文件配置说明【1】模板文件通常html文件都会放在templates文件夹下【2】资源文件资源文件也就是jQuery,bootstrap这些前端框架这些都统称为静态文件,通常默认是放在static文件夹里面的static内部又通常分为以下三部分cssjssimgplugins【二】静态文件配......
  • Django框架之ORM操作
    【一】配置数据库【1】默认数据库在settings.py文件中的DATABASES字典就是用来配置数据库的默认的数据库是django自带的数据库是sqlite3DATABASES={'default':{'ENGINE':'django.db.backends.sqlite3','NAME':BASE_DIR/'db.sqlite3',......
  • Django框架之requests对象
    【一】requests对象引入【1】提交GET请求前端form表单中action属性,如果不写的话,默认就是向当前路由请求form表单中的method属性,如果不写默认就是GET请求<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title>{%lo......
  • Django框架之视图层
    【一】视图层三板斧HttpResponse非常重要,因为三板斧的三个方法返回的都是HttpResponse对象通过看源码可以发现各种各样的类,最终都是由HttpResponse这个类继承而来的【1】HttpResponseHttpResponse是Django中用于创建HTTP响应的一个类,它可以方便的把一些自定义的文本内容或......
  • Django框架之路由层
    【一】Django的路由系统【1】什么是URL配置URL调度器|Django文档|Django(djangoproject.com)URL配置的本质就是让URL与视图函数之间有对应的关系当在浏览器输入对应的URL,django就能通过URL配置去找对应的视图函数【2】基本格式##Django1.x版本语法fromdjango.co......
  • Django框架之模板层
    【一】模板语法的传取值模板语法需要记两组符号,分别是{{}}和{%%}{{}}通常是与变量相关的{%%}通常是与逻辑相关的【1】传值模板语法可以传递python所有的数据类型,包括函数和类,以及类实例化的对象传递函数的时候,函数需要有返回值,要不然在页面显示的结果就是None模板语法......
  • Django 分页器代码
    分页器代码:在使用到非Django内置的第三方功能或者组件代码的时候,一般情况下会创建你一个名为utils文件夹,在该文件夹对模块进行功能性划分。utils可以创建在每个应用下。classPagination(object):def__init__(self,current_page,all_count,per_page_num=2,pager_coun......