【2022.9.12】cookie与session/Django操作cookie/Django操作session/Django中间件
作者:互联网
今日内容概要
- cookie与session
- Django操作cookie
- Django操作session
- Django中间件
cookie与session简介
- 推导与介绍
# 推导:
HTTP协议四大特性:
1.基于请求响应
2.基于TCP、IP作用于应用层之上协议
3.无状态
意思为:服务端记不住无法识别客户端的状态
(1).最初互联网的发展 网页简单 每个用户都一样
(2).随着互联网发展(支付宝等) 服务端需要记住每个用户的信息 业务才能发展
(3).cookie与sess应运而生
4.无连接/短连接
# 介绍:
cookie:
保存在客户端上跟用户信息状态相关的数据
session:
保存在服务端上跟用户信息状态相关的数据
"""
session的工作主要依赖于cookie
因为所有的服务端有关于用户的信息数据都是基于cookie才能得到 目前所有能够识别用户身份的网址也都需要使用cookie
当让客户端浏览器也有权利拒绝保存cookie
"""
Django 操作 cookie
- 1、如果想要让客户端浏览器保存cookie需HttpResonse对象调用方法
return HttpResponse()
return render()
return redirect()
return JsonRepsonse()
- 2、设置cookie需要变形
obj = HttpResponse()
obj.操作cookie的方法
return obj
obj = render()
obj.操作cookie的方法
return obj
obj = redirect()
obj.操作cookie的方法
return obj
obj = JsonRepsonse()
obj.操作cookie的方法
return obj
# 示例:
def set_cookie(request):
obj = HttpResponse()
obj.set_cookie('name','make') # cookie数据会保存在浏览器
return obj
- 3、登录设置cookie
- (1)、dedault:默认值
- (2)、salt:加密盐
- (3)、max_age:后台控制过期时间 单位为秒
- (4)、保存cookie数据:obj.set_cookie()
- (5)、拿取cookie数据:request.COOKIES.get()
# 保存cookie数据
def set_cookie(request):
obj = HttpResponse('中秋快乐')
# 让浏览器保存cookie数据
obj.set_cookie('name', 'make')
return obj
#login视图
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'make' and password == '123':
obj.set_cookie('name', 'make', max_age=3) # 参数max_age 为cookie保存信息时间长短。以秒为单位。
return obj
return render(request, 'login.html')
#home视图
def home(request):
if request.COOKIES.get('name'): # 取cookie数据
return HttpResponse('home页面 只有登录的用户才可以查看')
return redirect('/login/')
#首页视图
def index(request):
if request.COOKIES.get('name'): # 取cookie数据
return HttpResponse('index页面 只有登录的用户才可以查看')
return redirect('/login/')
-
问题: 上述代码虽然可以实现 登录后保存cookie然后访问其他页面
-
弊端:网页如果加多 代码也要增加 显得臃肿 而且对后期网页登录访问修改都留下弊端 所以要想办法进行精简
-
思考:
-
需求:实现用户在使用客户端浏览器时 只要登录过保存cookie就可以访问该网址的随意页面 并且在需要短期内访问无需要再次验证信息
- (1)登录设置cookie
- (2)多个视图函数都需要校验用户是否登录 (装饰器)
- (3)如何记住用户登录之前想要访问的页面 用户登录之后自动跳转
- (4)需要用到cookie中的操作方法
# 方式: print(request.path) # 获取路由网址后缀 print(request.path_info) # 获取路由网址后缀 print(request.get_full_path()) # 获取网址所有全部的后缀 # 注意:一般使用后两种方式来获取用户想要访问网站页面的全部网址后缀
# 分析:
情况1:用户访问了其他需要登录才可以访问的页面
如何跳转>>>:想要访问的页面
def set_cookie(request):
obj = HttpResponse('中秋快乐')
# 让浏览器保存cookie数据
obj.set_cookie('name', 'make')
return obj
def login_auth(func_name):
def inner(request, *args, **kwargs):
if request.COOKIES.get('name'):
res = func_name(request, *args, **kwargs)
return res
else:
target_path = request.path_info
return redirect(f'/login/?next={target_path}')
return inner
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'make' and password == '123':
target_path = request.GET.get('next')
if target_path:
obj = redirect(target_path) # 如果有值则跳转到指定页面
else:
obj = redirect('/home/') # 如果没有值则跳转到首页
obj.set_cookie('name', 'make', max_age=3)
return obj
return render(request, 'login.html')
@login_auth
def home(request):
return HttpResponse('home页面 只有登录的用户才可以查看')
@login_auth
def index(request):
return HttpResponse('index页面 只有登录的用户才可以查看')
# 分析:
情况2:用户直接访问登录页面
如何跳转>>>:网址首页
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'make' and password == '123':
target_path = request.GET.get('next')
if target_path:
obj = redirect(target_path) # 如果有值则跳转到指定页面
else:
obj = redirect('/home/') # 如果没有值则跳转到首页
obj.set_cookie('name', 'make', max_age=3)
return obj
return render(request, 'login.html')
Django操作session
-
1.设置
djanjo
操作session
,session
保存用户信息需要一张表(django_session 表)
需要提前执行数据库迁移命令,会自动创建django_session 表
这张表就是专门用来存储session相关服务端的数据,因此想要执行session,必须先执行迁移命令 -
2.django默认的session失效时间14天
-
3.客户端会接收到键值对 键默认是sessionid值是加密的随机字符串(令牌)
-
4、设置session
request.session['name'] = 'jason'
1.django自动产生一个随机字符串返回给客户端(对name加密)
2.往django_session创建数据(对jason加密)
def set_session(request):
request.session['name'] = 'jason'
return HttpResponse('设置session')
===========================================================================
request.session.get('name')
1.自动从请求中回去sessionid对应的随机字符串
2.拿着随机字符串去django_session中匹配数据
3.如果匹配上还会自动解密数据并展示
def get_session(request):
print(request.session.get('name'))
return HttpResponse('获取session')
- 5、5中类型的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_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_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
Django中Session相关设置
Django中间件
- 简介:django中间件类似于django的门户 所有的请求来和响应走都必须经过中间件(它是一个轻量、低级别的插件系统 用于在全局范围内改变Django的输入和输出 每个中间件组件都负责做一些特定的功能。)
- 1、django默认自带七个中间件,每个中间件都有各自负责的功能
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',
]
-
2、django中间件除了默认的之外 还支持自定义中间件(无限加中间件)
-
3、中间件使用场景
- 全局相关的功能:全局用户身份校验,全局用户黑名单校验,全局用户访问频率校验
-
4、django自定义中间件中有五种方法
process_request
process_response
process_view
process_template_response
process_exception
方法 | 说明 |
---|---|
process_request | 1.请求来的时候会按照配置文件中注册了的中间件 从上往下依次执行每一个中间件里面的process_request方法 如果没有则直接跳过 2.该方法如果返回了HttpResonse对象 那么请求不会再往后执行 原路返回 |
process_response | 1.响应走的时候会按照配置文件中注册了的中间件 从下往上一次执行每一个中间件里面的process_response方法 没有没有则直接跳过 2.该方法有两个形参request和response 并且默认情况下应该返回response 3.该方法也可以自己返回HttpResponse对象 相当于狸猫换太子 |
process_view(了解) | 当路由匹配成功之后 执行视图函数之前 自动触发 |
process_excption(了解) | 当视图函数报错之后 自动触发 |
process_template_response(了解) | 当视图函数返回的数据对象中含有render属性对应render函数才会触发 |
注意:如果请求的过程中process_request
方法直接返回了HttpResponse
对象那么会原地执行同级别process_response
方法返回(flask
则不同)
- 5、定义中间件步骤
- 1.如果想要写一些第三方的插件功能,可以在应用下创建一个文件,在这个文件下写一些py文件
- 2、配置中间件
- 3、process_request
1.请求来的时候会按照配置文件中注册了的中间件 从上往下依次执行每一个中间件里面的process_request方法 如果没有则直接跳过
2.该方法如果返回了HttpResonse对象 那么请求不会再往后执行 原路返回
- 4、process_response
1.响应走的时候会按照配置文件中注册了的中间件 从下往上一次执行每一个中间件里面的process_response方法 没有没有则直接跳过
2.该方法有两个形参request和response 并且默认情况下应该返回response
3.该方法也可以自己返回HttpResponse对象 相当于狸猫换太子
ps:如果请求的过程中process_request方法直接反悔了HttpResponse对象那么会原地执行同级别process_response方法返回(flask则不同)
标签:return,中间件,request,Django,session,cookie,obj 来源: https://www.cnblogs.com/55wym/p/16687611.html