cookie:
1. 网站它是不用保存用户的信息,最早期的时候,网站都是一些静态网站
eg:新闻网站 博客
2. 随着技术发展,诞生了很多需要登录的网站
eg: 淘宝 京东 支付宝...登录:解决了在网站中,网站可以识别出你是谁
以登录为例,当用户第一次登录网站的时候,用户输入用户名和密码,如果不保存下来,拿用户就每次都需要登录,很麻烦所以我们使用了cookie
当用户第一次登录成功网站的时候,服务端告诉浏览器把用户名和密码都给用户的浏览器,然后,用户浏览器把用户名和密码保存在本地,之后,用户在每次访问网站的时候,会自动把之前保存的用户名和密码都传给服务端,服务端接收浏览器传过来的用户名和密码在进行验证.
缺点就是数据在浏览器上不安全
cookie的存储方式:使用K:V键值对的方式存储
session
session的诞生:session是把数据保存在服务端的,但是session会随机生成一个字符串 ,然后在服务端做随机字符串和用户信息的对应关系,简单来说就是把用户信息保存在数据表中。
session的保存方式:首先生成一个随机字符串对应一个用户信息
随机字符串:用户信息
随机字符串1:用户信息1
随机字符串2:用户信息2
session所做的流程
- 首先生成一个字符串
- 把随机生成的字符串和用户信息的对应关系保存在数据表中
- 把随机字符串返回给浏览器,让浏览器随机的字符串保存下来
- 当用户访问网站时,会把随机字符串一并提交过来,服务端在拿着随机的字符串去数据库中去查询,如果查询到了,说明登录成功了,如果查不到就说明没有登录,或者失效了
cookie的执行流程图
当我们在浏览需要登录的网页时,再浏览器中设置禁言cookie,那么以后再这个浏览器中都将无法登陆需要登录的页面
例如:
登录淘宝
登录之后,我们关闭cookie
使用obj = 三板斧来进行cookie的操作
obj = HttpRedponse
obj = redirect
obj = render
设置cookie
obj.set_cookie(‘key’,‘value’)
获取cookie
print(request.COOKIES.get('key))
def login(request, *args, **kwargs):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user_obj = models.Userinfo.objects.filter(pk=1).first()
# 判断用户名与密码是否正确
if username == user_obj.username and password == user_obj.password:
print('登录成功')
# 登录成功后应该保存用户信息,使用cookie保存用户信息
obj = redirect('/home/')
obj.set_cookie('username', 'kk')
return obj
return render(request, 'login.html')
def home(request):
if request.COOKIES.get('username'):
return HttpResponse('这是登录页面')
return redirect('/login/')
def login_auth(func):
def inner(request, *args, **kwargs):
# 判断:如果登录成功了就正常执行,登录失败则跳转到登录页面
if request.COOKIES.get('username'):
res = func(request, *args, **kwargs)
return res
else:
return redirect('/login/')
return inner
@login_auth
def index(request):
return HttpResponse('这是登录的页面')
如果不加过期时间则永久生效
设置过期时间的两个方法:
完整的语法为:
obj.set_cookie('key值','value值',max_age=‘过期时间,秒数’,path=‘路径’)
def logout(request):# 用在退出功能或者注销功能时,使用
res=redirect('/login/')
res.delete_cookie('user) # 删除用户浏览器上之前设置的cookie值
key |
data |
随机字符串 |
用户信息 |
设置session
def set_session(request):
request.session['username']='kk'
return HttpResponse('set_session')
设置session所发生的事情:
获取session
def get_session(request):
print(request.session['usernmae'])
print(request.session.get('username'))
return HttpResponse
获取session发生的事情:
from django.views import View
from django.utils.decorators import method_decorator
@method_decorator(login_auth, name='post') # 方式1
@method_decorator(login_auth) # 方式2 使所class对象下的所有属性都添加装饰器
class loh(View):
def dispatch(self, request, *args, **kwargs):
return super(loh, self).dispatch(request, *args, **kwargs)
@method_decorator(login_auth) # 方式3
def get(self, request):
return HttpResponse('get')
def post(self, request):
return HttpResponse('post')
在项目的根目录下新建一个包(文件),在包中自定义一个py文件,在里面自定义一个中间件
class mymd(object):
def __init__(self,get_response):
self.get_response = get_response
def __call__(self, request):
# 数据进入
response = self.get_response(request)
# 数据离开
return response
使用函数自定义中间件
from django.shortcuts import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class Myexception(MiddlewareMixin):
def process_request(self, request): # 执行视图函数之前被调用
print('自定义的process_request')
return request
def process_view(self, request, callback, callback_args, callback_kwargs):
print('自定义的process_view') # 执行视图函数之后被调用
return None
def process_template_response(self, request, response):
print('自定义的process_template') # 执行视图函数完毕之后被调用
return response
def process_response(self, request, response): # 响应返回浏览器之前被调用
print('自定义的process_response')
return response
def process_exception(self, request, exception): # 视图函数抛出异常时调用
print('自定义的process_exception')
return HttpResponse(exception)