1.原理
一个简单的view 中的 登录方法:
def login(request):
if request.method == "POST":
user = request.POST.get('user')
pwd = request.POST.get('password')
if user == '123' and pwd == '123':
ret=redirect('/home/')
ret.set_cookie('is_login','1')
return ret
return render(request, 'login.html')
cookie 是服务器让浏览器 保存在 浏览器本地的 一组键值对 http协议是无状态的 每次请求 都是无关联的,没有状态,
用cookie 来保存状态
在对一个页面 进行post 请求时 ,如果账号密码正确,服务器就给 post 的这个页面
在响应头设置一个 响应cookie ,然后重定向访问home这 个页面时, 就带上那个cookie放在请求头去访问
这是一个需要登录 才能得到的页面:
def home(request):
# print(request.COOKIES) {'is_login': '1'}
if request.COOKIES.get('is_login') == '1':
return HttpResponse('hello')
return HttpResponse(' not login')
2.加装饰器 来设置cookie 校验
# 写一个装饰器
def login_required(fn):
def inner(request,*args,**kwargs):
if not request.COOKIES.get('is_login') == '1':
return redirect('/login/')
ret=fn(request,*args,**kwargs) #这里执行原来函数的功能
return ret #return 原来函数的 返回值
return inner #return inner函数出去 执行
@login_required
def index(request):
return HttpResponse('这是index')
login_required(fn) fn为 index 函数 传入 在inner函数 内 加上 校验 后再执行,用ret来接收 index 的返回值并返回
最后把 inner 函数 return 出去 执行 @login_required的作用相当于 index=login_required(index)
然后index() 执行
2.优化版: 对于重定向哪个网址 做判断
def login(request):
if request.method == "POST":
user = request.POST.get('user')
pwd = request.POST.get('password')
if user == '123' and pwd == '123':
next=request.GET.get('next') 2.拿到action中想要去的网址
ret=redirect(next) 3.重定向去网址
ret.set_cookie('is_login','1')
return ret
return render(request, 'login.html')
def login_required(fn):
def inner(request,*args,**kwargs):
if not request.COOKIES.get('is_login') == '1':
next=request.path_info
return redirect('/login/?next={}'.format(next)) 1.获得想要去的网址重定向到login.html
ret=fn(request,*args,**kwargs) 此时form表单的action 已经获得想要去的url路径
return ret
return inner
@login_required
def home(request):
return HttpResponse('这是home')
@login_required
def index(request):
return HttpResponse('这是index')
def logout(request): #删除cookie
ret=redirect('login')
ret.delete_cookie()
return ret
return render(request, 'login.html') render把request传入login页面 action 动态的改变 url
在login网页中 <form action="{{ request.get_full_path }}" method="post"> 获得url路径 再提交时post 路径为想要的url
3.加密的cookie session会话使用
1.cookie保存在浏览器上的 不安全 2.cookie 的长度受到限制 3.session保存在服务器上,依赖于cookie
设置 request.session['is_login']='1' 或request.sesion.setdefault(key,value)
获取 if not request.session.get('is_login') == '1': request.session['key']
配置数据库 python manage.py migrate 增加一个django_session的表 含有 session_key value 失效时间 expired() 字段
2.session的一些用法:
request.session.session_key request.session.clear_expired() request.session.exists(session_key)
request.session.delete() 删除所有session会话 不会删浏览器 上的cookie .flush() 全部删除
request.session.set_expired() 0关闭浏览器就失效 ,datetime设置时间之后失效, int是数秒后失效
3.清除过期的session: request.session.clear_expired()
from django.conf import global setting 全局设置 里配置session
session_cookie_name = ' sessionid' session.engine='默认session_key存的数据库'