Django之会话技术

it2024-12-05  12

文章目录

1、会话技术2、cookie、session、token3、cookie3.1、定义3.2、基本原理3.3、django中cookie的简单使用3.3.1、设置cookie3.3.2、获取cookie3.3.3、删除cookie 3.4、cookie常用操作总结3.5、cookie版登录校验3.5.1、路由3.5.2、视图函数3.5.3、模板3.5.3.1、login.html3.5.3.2、order.html3.5.3.3、userinfo.html 4、session4.1、定义4.2、django中session的使用4.3、django中session的配置

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,默认修改之后才保存(默认)
最新回复(0)