Django中 cookies and session的使用
-
http协议
- 两个特性:
- 无连接:一次请求一次响应就断开。
- 无状态:不记住上次连接的信息,每次连接都是新的连接。
- 后面出现:短连接(keep-alive)
- 两个特性:
-
cookie:会话跟踪(解决http协议无状态)
-
what:首先来讲,cookie是浏览器的技术,Cookie具体指的是一段小信息,它是服务器发送出来存储在浏 览器上的一组组键值对,可以理解为服务端给客户端的一个小甜点,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。
-
规范:
- 大小上限为4kb
- 一个服务器最多在客户端浏览器上保存20个cookie
- 一个浏览器最多保存300个cookie,因为浏览器可以访问多个服务器。
- 一个用户:一个浏览器:一个服务端
-
Django中使用:ret.set_cookie('k1','v1')
from django.shortcuts import render,HttpResponse,redirect def wraper(f): def inner(request, *args, **kwargs): is_login = request.COOKIES.get('is_login') if is_login == 'True': ret = f(request, *args, **kwargs) return ret else: # return redirect('login') return HttpResponse('滚犊子') return inner @wraper def index(request): return render(request, 'index.html') def login(request): if request.method == 'GET': return render(request, 'login.html') else: username = request.POST.get('username') password = request.POST.get('password') print(username, password) if username == 'hqq' and password == '123': ret = redirect('index') ret.set_cookie('is_login', 'True') return ret else: return redirect('login')
-
-
session
table:django_session session_key 123ssfjasld session_data {'username':'hqq'}加密后数据
from django.shortcuts import render,HttpResponse,redirect def login_decorator(f): def inner(request, *args, **kwargs): if request.session.get('is_login') == True: ret = f(request, *args, **kwargs) return ret else: return redirect('login') return inner def login(request): if request.method == 'GET': return render(request, 'login.html') else: username = request.POST.get('username') password = request.POST.get('password') print(username, password) if username == 'hqq' and password == '123': # from django.conf import settings # from django.conf import global_settings # settings.SESSION_COOKIE_NAME request.session['is_login'] = True request.session['username'] = 'chao' """ 1.生成了sessionid:随机字符串; 2.在cookie里面加上了一个键值对,session_id:zdfafdsf; 3.将用户的数据进行了加密,并保存到了django-session表里。 session_key session_data assdfsfds 用户数据加密后的字符串 """ return redirect('home') else: return redirect('login') @login_decorator def home(request): # print(request.session) # <django.contrib.sessions.backends.db.SessionStore object at 0x10d3b1e48> is_login = request.session.get('is_login') print(is_login) # bool值的True """ 1.从cookie里面拿出了session_id:xxx这个随机字符串 2.去django-session表里查询到对应的数据 3.反解加密的用户的数据,并获取用户需要的数据 """ return render(request, 'home.html')