【简介】

(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请求')

 

posted on 2024-03-05 21:44  认真的六六  阅读(3)  评论(0编辑  收藏  举报