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