【简介】
(cookie)
""" 回忆:HTTP协议四大特性 1.基于请求响应 2.基于TCP、IP作用于应用层之上的协议 3.无状态:不保存客户端的状态 4.无连接 """ -------------------------------------------------------- 最开始的网站都不需要用户注册,所有人来访问获取到的数据都是一样的 随着互联网的发展,很多网站需要知道当前用户的状态 --------------------------------------------------------- cookie 保存在客户端与用户状态相关的信息(类似于字典的KV键值对) session 保存在服务端与用户状态相关的信息 ps:session的工作需要依赖于cookie
token
服务端不再保存数据,登录成功智慧,将一段信息进行加密处理 补充:浏览器有资格拒绝保存服务端发送过来的cookie数据 Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。
客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。
客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。Session对象是在客户端第一次请求服务器的时候创建的。 如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。
Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
。
。
【django操作cookie】
设置cookie
obj.set_cookie(k,v)
获取cookie
request.COOKIES.get(k)
设置cookie的超时时间
max_age=3
uels.py urlpatterns = [ path('admin/', admin.site.urls), # cookie登录功能 path('login/', views.login), # 登录成功以后跳转的页面 path('home/',views.home), path('index/',views.index), path('func/',views.func), # 注销功能 path('logout/',views.logout) ]
views.py from django.shortcuts import render, HttpResponse, redirect # Create your views here. # 校验用户登录的装饰器 ''' 在没有登录的情况下想访问一个需要登录的页面 那么先跳转到登录页面,当输入正确的信息以后 应该跳转到我真正想要访问的页面去 ''' def login_auth(func): def inner(request, *args, **kwargs): target_url = request.get_full_path() if request.COOKIES.get('name'): return func(request, *args, **kwargs) else: return redirect('/login/?next=%s' % target_url) return inner def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'jason' and password == '123': # 获取用户上一次想要访问的url target_url = request.GET.get('next') if target_url: obj = redirect(target_url) else: # 保存用户登录状态 obj = redirect('/home/') # 让浏览器记录cookie数据 obj.set_cookie('name', username, max_age=5) # max_age=5 表示cookie数据在浏览器中保存5秒 ''' 浏览器不单单会帮我们存数据 而且后面每次访问都会带着它过来 ''' # 跳转到一个需要用户登录以后才能看到的页面 return obj return render(request, 'login.html') @login_auth # 登录以后跳转到的页面 def home(request): # 获取cookie信息 # if request.COOKIES.get('username') == 'tank666': # return HttpResponse('我的home页,只有登录以后才能看到我哦!') # 没有登录应该跳转到登录页面 # return redirect('/login/') # 上述如果需要跳转的页面很多的话,会显得代码很冗余,用登录装饰器 return HttpResponse('我的home页,只有登录以后才能看到我哦!') @login_auth def index(request): return HttpResponse('index页面') @login_auth def func(request): return HttpResponse('func页面') @login_auth # 注销功能 def logout(request): # 删除cookie信息 obj = redirect('/login/') obj.delete_cookie('name') return obj
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/bootstrap-3.4.1-dist/js/bootstrap.min.js"></script> <link rel="stylesheet" href="/static/bootstrap-3.4.1-dist/css/bootstrap.min.css"> {% block css %} {% endblock %} </head> <body> <form action="" method="post"> <p>username: <input type="text" name="username"> </p> <p>password: <input type="password" name="password"> </p> <input type="submit" value="登录"> </form> </body> </html>
。
。
。
【django操作session】
1 session数据是保存在服务端的,给客户端返回的是一个随机字符串:sessionid:随机字符串 2 3 设置session 4 request.session['key']=value 5 6 获取session 7 request.session.get('key')
(设置值)
(获取值)
(删除值)
cookie中设置超时时间的方式
max_age=None, cookie需要延续时间(以秒为单位)如果参数是None,那么cookie会延续到浏览器关闭为止
expires=None 超时时间(IErequires expires,so set it if hasn't been already)
path='/', cookie生效的路径,/表示根路径
request.session.set_expiry() # 可放整型,日期,0,或是不写
。
。
【CBV加装饰器】
views.py # CBV加装饰器 from django.views import View # 使用装饰器需要导入的模块 from django.utils.decorators import method_decorator # @method_decorator(login_auth, name='post') # 方式2,指名道姓的加装饰器,可以叠加多个, class MyLogin(View): @method_decorator(login_auth) # 方式3,给dispatch方法加装饰器,它会直接作用于当前类的所有方法 def dispatch(self, request, *args, **kwargs): ... # @method_decorator(login_auth) # 方式1 def get(self, request): return HttpResponse('get请求') def post(self, request): return HttpResponse('post请求')