Django之会话技术

1、会话技术

在B/S(浏览器/服务器)的互联网架构中,保持在一定周期内,浏览器与服务器间会话数据的一种技术
典型的实现方式有两种:
cookie 和 session
其中cookie是根本,Session是高级实现(session也是基于cookie)

之所有要有会话技术,因为b/s架构是无状态的,任何的请求间都没有丝毫联系!

其目的:
1、在同一个浏览器的多次请求将,可以存储数据。
2、严格区分浏览器。

2、cookie、session、token

cookie: 客户端浏览器上的键值对
session: 存在服务端的键值对
token: 加密的键值对,如果放在客户端浏览器上,它就叫cookie,服务端签发的加密字符串,如果在app上就叫token

3、cookie

3.1、定义
cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息
当前网站在浏览器上cookie个数和大小有限制
cookie大小上限为4KB
一个服务器最多在客户端浏览器上保存20个cookie
一个浏览器最多保存300个cookie
3.2、基本原理
服务器端脚本在浏览器端存储数据的一种技术
1、cookie会话数据存储在浏览器端
2、浏览器在每次请求服务器程序时,会将该服务器所存储的cookie,携带到服务器端
3、究竟存储那些数据由服务器决定
3.3、django中cookie的简单使用
3.3.1、设置cookie
def cookie_set(request):
    # 浏览器向我这个地址发一个请求,就在浏览器写入 name = allen
    obj = HttpResponse('设置cookie')
    obj.set_cookie('name','allen')  # 写入到浏览器了,在http响应头里: cookie: name=allen
    obj.set_cookie('age','19')  # 写入到浏览器了,在http响应头里:cookie: age=19
    return obj

# 设置cookie的其他参数
max_age: 传数字,以秒计,过期时间,有默认值(5天后过期:60*60*24*5)
expires: 传时间对象,date=datetime.timedelta()
path: 默认/表示当前域下的所有路径  http://127.0.0.1:8000/allen/xxx/
domain: 在那个域下有效
secure: 是否Https传输cookie
httponly: cookie只支持http传输
3.3.2、获取cookie
def cookie_get(request):
    print(request.COOKIES)
    print(request.COOKIES.get('name'))
    return HttpResponse('获取cookie')
3.3.3、删除cookie
def cookie_delete(request):
    obj = HttpResponse('删除指定cookie ')
    obj.delete_cookie('name')
    return obj
3.4、cookie常用操作总结
# django中操作cookie: obj.set_cookie('key','value'): obj.delete_cookie('key')  # 设置过期: request.COOKIES.get('key'): obj.set_cookie('key','value1')

# 带签名的cookie(加盐,加密): obj.set_signed_cookie('key','value','密钥'): obj.delete_cookie('key')  # 设置过期: request.get_signed_cookie('key',salt='密钥'): obj.set_signed_cookie('key','value1','密钥')
3.5、cookie版登录校验
3.5.1、路由
# cookie版登录
path('login/', views.login),
path('order/', views.order),
path('logout/', views.logout),
path('userinfo/', views.userinfo),
3.5.2、视图函数
# 登录认证装饰器
def login_auth(func):
    def inner(request, *args, **kwargs):
        # 登录校验
        name = request.COOKIES.get('name')
        if name:
            res = func(request, *args, **kwargs)
            return res
        else:
            path = request.get_full_path()
            return redirect('/login/?returnUrl=%s' % path)
    return inner

# cookie版登录
def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        name = request.POST.get('name')
        password = request.POST.get('password')
        if name == 'allen' and password == '123':
            # 写入cookie
            # 登录成功,重定向
            path = request.GET.get('returnUrl')
            if path:
                obj = redirect(path)
            else:
                obj = redirect('/index/')
            obj.set_cookie('name', name)
            return obj
        else:
            return HttpResponse('用户名或密码错误')
            
# 未加装饰器版本
def order(request):
    name = request.COOKIES.get('name')
    if name:
        return render(request,'order.html')
    else:
        return redirect('/login')

## 装饰器版本(只要加了装饰器,一旦进入这个视图函数,就表明登录成功了)
@login_auth
def order(request):
    return render(request, 'order.html')

@login_auth
def userinfo(request):
    return render(request, 'userinfo.html')

def logout(request):
    obj = HttpResponse('退出登录成功')
    obj.delete_cookie('name')
    return obj
3.5.3、模板
3.5.3.1、login.html
<form action="" method="post">
    <p>用户名:<input type="text" name="name"></p>
    <p>密码:<input type="password" name="password"></p>
    <p><input type="submit" value="提交"></p>
</form>
3.5.3.2、order.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="/logout/">点我退出</a>
</body>
</html>
3.5.3.3、userinfo.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>用户信息页面</h1>
</body>
</html>

4、session

4.1、定义
1、存在于服务端的键值对
2、同一个浏览器不允许登录多个账户,不同浏览器可以登录同一个账户
4.2、django中session的使用
重要: 必须迁移数据库!!!

增: request.session['key']=value
查: request.session['key']: request.session['key']=value1
删: del request.session['key']
设置过期时间: request.session.set_expiry(10)
    
# session的其它使用
# 以下6个用法跟字典使用方法一样
request.session.setdefault('key',value)
request.session.get('key',None)
del request.session['key']
request.session.keys()
request.session.values()
request.session.items()

request.session.session_key  # 获取那个随机字符串,django_session表中session_key字段
request.session.clear_expired()  # 清除过期的session
request.session.exists("session_key")  # 判断这个随机字符串(session_key字段)有没有数据
request.session.delete()  # 删除所有的值,django_session表中删除当前登录者的这条记录
request.session.flush()   # 删除所有的值,django_session表中删除当前登录者的这条记录,并把cookie设置为过期
4.3、django中session的配置
1、数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # 引擎(默认)

2、缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

3、文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 

4、缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

5、加密cookie session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

其他公用设置项:
SESSION_COOKIE_AGE = 1209600                             # session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得session过期(默认)
SESSION_COOKIE_NAME = "sessionid"                       # session的cookie保存在浏览器上时的key,即: sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"                               # session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None                             # session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True                           # 是否session的cookie只支持http传输(默认)

SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值