Django之cookie、session、token

cookie 与session

目的:是为了保存客户端的状态

原因:因为HTTP协议是无状态的

由于http协议是无状态的 所以我们需要发明一些能够保存用户的技术

cookie:

​ cookie是保存在客户端浏览器上的键值对,是由服务端生成,然后发送给客户端浏览器保存的。因此,浏览器有权限禁止写入cookie,这个功能可以在浏览器中设置。

django如何操作cookie:

    obj = HttpResponse()  # 利用obj对象才能操作cookie
    return obj

    obj = render()
    return obj

    boj = redirect()
    return obj 

设置cookie:obj.set_cookie('k1','v1')

    obj.set_cookie('k1','v1')  # 告诉浏览器设置

获取cookie:request.COOKIES.get('k1')

request.COOKIES.get('k1')   # 获取浏览器携带过来的cookie值

设置超时时间:obj.set_cookie('k1','v1',max_age=3)

obj.set_cookie('k1','v1',max_age=3)  # 针对谷歌浏览器,用max_age
obj.set_cookie('k1','v1',expires=3)  # 针对IE浏览器,用expires

删除cookie(注销,退出登录),一般不会删除。

基于cookie实现用户登录校验

装饰器
    用户在没有登录之前如果访问了一个需要登录之后才能访问的页面
    那么会先跳转到登录页面 用户输入用户名和密码并正确的情况下
    再自动跳转到之前用户想要访问的页面
        1.request.path_info
        2.利用get请求携带参数的方法

session:

​ session是保存在服务端上面的键值对

​ session的工作机制是需要依赖于cookie的

设置session:request.session['k1'] = 'v1'

request.session['k1'] = 'v1'
#  第一次设置的时候会报错,是因为你没有执行数据库迁移命令 生成django需要用到的一些默认表(django_session)
# django默认的session失效时间是14天  2周
request.session['k1'] = 'v1'

"""
执行上面这一句代码会发生了哪些事儿
1.djang内部自动帮你调用算法生成一个随机的字符串
2.在django_session表中添加数据(数据也是加密处理)
随机字符串         加密之后的数据           失效时间
ashdjsad            jsadsada
3.将产生的随机字符串返回给客户端浏览器 让浏览器保存
sessionid:随机字符串
"""

获取session:request.session.get('k1')

request.session.get('k1')
"""
1.django内部会自动去请求头里面获取cookie
2.拿着sessionid所对应的随机字符串去django_sessoion表中一一比对
3.如果比对上了 会将随机字符串对应的数据获取出来 自动放入request.session中供程序员调用
如果没有就是一个空字典
"""

删除session:request.session.delete()

request.session.delete()
# 客户端和服务端全部删除  只会根据浏览器的不同删对应的数据

设置失效时间:request.session.set_expiry(value)

# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。

session版的登录校验:

from functools import wraps


def check_login(func):
    @wraps(func)
    def inner(request, *args, **kwargs):
        next_url = request.get_full_path()
        if request.session.get("user"):
            return func(request, *args, **kwargs)
        else:
            return redirect("/login/?next={}".format(next_url))
    return inner


def login(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")

        if user == "alex" and pwd == "alex1234":
            # 设置session
            request.session["user"] = user
            # 获取跳到登陆页面之前的URL
            next_url = request.GET.get("next")
            # 如果有,就跳转回登陆之前的URL
            if next_url:
                return redirect(next_url)
            # 否则默认跳转到index页面
            else:
                return redirect("/index/")
    return render(request, "login.html")


@check_login
def logout(request):
    # 删除所有当前请求相关的session
    request.session.delete()
    return redirect("/login/")


@check_login
def index(request):
    current_user = request.session.get("user", None)
    return render(request, "index.html", {"user": current_user})

Session版登录验证

django session在创建数据的时候是针对浏览器的

能够作为数据库的有如下几种:

数据库软件

文件

内存

token:加密字符串

用加密算法将字符串处理成密文字符

django中间件

django中间件简介

在django项目文件中的settings.py文件中,有一列表MIDDLEWARE就是中间件,默认有7项:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

只要你想要做一些网站的全局性功能 你都应该考虑使用django的中间件
1.全局的用户登录校验
2.全局的用户访问频率校验
3.全局的用户权限校验() 20行代码 100+ RBAC

据说:在所有框架中,django的中间件是最完善的

5个自定义方法

django支持用户自定义中间件,给出了5个可以自定义的方法:

1、process_request

请求来的时候会按照从上往下的顺序 依次执行settings配置文件中每一个中间件内部定义的process_request方法,如果中间件内部没有该方法 直接跳过执行下一个中间件.

任意中间件一旦返回了HttpResponse对象,name请求会立即停止前进,然后原路返回

2、process_response

2.1 响应走的时候会按照从下往上的顺序,依次执行settings配置文件中每一个中间件内部定义的process_response方法。
2.2 该方法必须有两个形参, 并且必须返回response形参,不返回就会报错
2.3 该方法返回什么(HttpResponsed对象) 前端获得的就是什么

注意:当process_request方法直接返回HttpResponse对象之后 会直接从当前中间件里面的process_respone往回走,没有执行的中间件都不会再执行

3、process_view(self, request, view_name, *args, **kwargs)

3.1 路由匹配成功之后执行视图函数之前触发
3.2 如果该方法返回了HttpResponse对象 那么会从下往上一次经过每一个中间件里面的process_response方法

4、process_template_respose

1.当你返回的对象中含有render属性指向的是一个render方法的时候才会触发 从下往上的顺序

def mdzz(request):
    print('我是视图函数mdzz')
    def render():
        return HttpResponse('你好呀 我是奇葩')
    obj = HttpResponse('我很好 好的像个傻逼一样')
    obj.render = render
    return obj

5、process_exception

当视图函数中出现错误,会自动触发 ,顺序是从下往上。发

CRM 客户关系管理系统

Customer Relationship Managment

猜你喜欢

转载自www.cnblogs.com/allenchen168/p/11991118.html