#内容概览
HTTP协议四大特性:
"""如果想要让客户端浏览器保存cookie,需要使用HttpResponse对象调用方法"""
def func01(request):
obj = HttpResponse()
obj.cookie方法
return obj
"""render/redirect/JsonResponse等创建的对象都算是HttpResponse对象"""
"""删除cookie"""
def func01(request):
obj = HttoResponse()
obj.delete_cookie('name')
return obj
"""cookie参数"""
key 键
value 值
max_age cookie最大生效时限
expires 同上,针对IE浏览器
path cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
domain cookie生效的域名
secure https传输
httponly 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
"""使用户在登录时使用cookie记录"""
def func01(request):
obj = render(request, 'func01.html')
if request.method == "POST":
name = request.POST.get('username')
obj.set_cookie('name', name)
return obj
return obj
"""设置页面需要登录后才能够访问"""
def func02(request):
if request.COOKIES.get('name'): # 获取接收数据中cookie键为name的是否有值
return render(request, 'func02.html')
return redirect('/func01/') # 如果没有值则重定向到登录页面
func01.html:
<form action="" method="post">
<p><input type="text" name="username" placeholder="username">p>
<p><input type="password" name="password" placeholder="password">p>
<input type="submit" value="提交">
form>
"""多个函数都需要在使用校验校验用户身份,那么就该使用到装饰器了"""
def login(func_name):
def inner(request, *args, **kwargs): # request是固定会传的,可以直接写在参数里,也可以不写直接使用args[0]
if request.COOKIES.get('name'):
res = func_name(request, *args, **kwargs)
return res
else:
return redirect('/func01/')
return inner
@login
def func03(request):
return render(request, 'func03.html')
"""装饰器"""
def login(func_name):
def inner(request, *args, **kwargs):
if request.COOKIES.get('name'):
res = func_name(request, *args, **kwargs)
return res
else:
i_path = request.path_info # 获取路由
return redirect(f'/func01/?i_path={i_path}')
return inner
"""登录函数"""
def func01(request):
obj = render(request, 'func01.html')
if request.method == "POST":
i_path = request.GET.get('i_path') # 获取GET中携带的路由
if i_path:
obj = redirect(i_path) # 如果有,重定向去到用户想去的页面
else:
obj = redirect('home.html') # 如果直接点登录,则登录完成后返回主页
name = request.POST.get('username')
obj.set_cookie('name', name)
return obj
return obj
cookie通过每次访问自动发送数据算是解决了保存状态的需求,但是由于cookie本身最大只支持4096字节,以及数据存放在客户端,可能被拦截窃取安全性不高;所以就需要使用能够支持更多字节,并且保存在服务器使安全性更高的session
session在请求来之后服务端产生随机字符串发送给客户端,服务端只需要保存随机字符串与用户信息之间的关系;之后客户端只需要使用随机字符串发送给服务端校验即可
"""
django默认的session失效时间为14天
客户端收到的键值对,键默认是sessionid,值是加密的字符串
"""
request.session['name'] = 'jason'
"""
django自动产生一个随机字符串返回给客户端(对name加密)
往django_session.创建数据(对jason加密,新项目需要先执行数据库迁移命令,否则没有表存放数据)
"""
request.session.get('name')
"""
自动从请求中获取sessionid对应的随机字符串
拿着随机字符串去django_session中匹配数据
匹配成功会将数据解密当做返回值返回
"""
"""session其他操作"""
1. 删除当前会话的所有session数据
request.session.delete()
2. 删除当前会话数据并删除会话的cookie
request.session.flush()
3. 设置会话session和cookie的失效时间
request.session.set_expiry()
# 如果参数是整数,那么session会在指定秒后失效
# 如果参数是时间对象(datetime/timedelta),那么session就会这个时间后失效
# 如果参数是0,那么用户关闭浏览器session就会失效
# 如果参数为None,那么session会依赖全局session失效策略
session的存储位置可以有五种模式
4. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
5. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
6. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
7. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
8. 加密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默认自带七个中间件,每个都负责各自的功能
setting中自带的中间件:
django除了有默认的中间件,还支持自定义中间件
django自定义中间件中有五个方法:
process_request、process_response、process_view、process_template_response、process_exception
1.process_request
1.请求来的时候会按照配置文件中注册了的中间件 从上往下依次执行每一个中间件里面的process_request方法 如果没有则直接跳过
2.该方法如果返回了HttpResonse对象 那么请求不会再往后执行 原路返回
2.process_response
1.响应走的时候会按照配置文件中注册了的中间件 从下往上一次执行每一个中间件里面的process_response方法 没有没有则直接跳过
2.该方法有两个形参request和response 并且默认情况下应该返回response
3.该方法也可以自己返回HttpResponse对象 相当于狸猫换太子
ps:如果请求的过程中process_request方法直接反悔了HttpResponse对象那么会原地执行同级别process_response方法返回(flask则不同)
3.process_view
当路由匹配成功之后 执行视图函数之前 自动触发
4.process_excption
当视图函数报错之后 自动触发
5.process_template_response
当视图函数返回的数据对象中含有render属性对应render函数才会触发