django之登陆验证,cookie,session

一:会话技术:

      1:什么是会话跟踪技术:

    首先我们应该知道,什么是会话。当浏览器(客户端)第一次访问某个网站的时候(服务器)。该浏览器便和服务器建立了单独的会话。直到浏览器关闭或服务器断开。但是一个网站有许多请求,如/login/,/index/等,而http协议是一种无状态的协议,一次请求一次链接,并不会保存状态信息。而我们一些信息,常常需要多个请求之间进行交互。既然请求无法保存登陆信息,那么可以使用会话跟踪技术来保存数据信息,进而进行多个请求之间的数据互通。实现会话跟踪技术就可以使用cookie和session来吗实现。    

二:cookie

  1:什么是cookie

    cookie是存在浏览器上的一种对象,用于保存浏览器的一些用户信息,比如登陆信息,包括登陆状态,上一次登陆时间。

      优点:在用户二次登陆的情况下,可以的快速获取用户登陆状态。

      缺点:因为是保存在浏览器端所以安全性差

        保存方式:采用键值对的方式保存:{key:value,key:value}

  2:django的cookie实现

   1:设置cookie  

def  log_in(request):
    if  request.method=='POST':
        user = request.POST.get('username')
        password = request.POST.get('password')
        if user == 'yjp' and password == 'abc':#登陆验证成功
           obj = redirect('/index')
           obj.set_cookie('cookie_id','cookie_value')#设置cookie,在浏览器存储{'cookie_id':'cookie_value'}
           return  obj
    return render(request, 'login.html', locals())

   2:获取cook

def  index(request):
    co =request.COOKIES.get('cookie_id',None)#根据cooke_id获取cookie
    if co :
        return render(request, 'index.html')#存在cookie跳转首页
    return render(request, 'login.html')#不存在 跳转登陆页

浏览器第一次请求,携带一个空的cookie,服务器相应的时候,往空的cookie,添加信息。以后的每次请求都携带该cookie.

 

  3:删除cookie   

response.delete_cookie("cookie_key",path="/",domain=name) 

三:session

  3.1:什么是session

    session和cookie的作用一样相似,用来保存用户的状态信息。通常保存在服务器上,对用户而言,不可见,相对安全。

    保存方式:使用键值对的方式保存,{key:value,key:value}

    优点:相对于cookie较为安全。

    缺点:通常保存在数据库上,每次保存数据都会进行数据库的读取或写入,影响效率。

     3.2:session实现

def log_in2(request):
  if
request.method=='POST': user = request.POST.get('username') password = request.POST.get('password') if user == 'yjp' and password == 'abc':print('session',request.session) session=request.session session['verfiy'] ='is_login' #设置cookie obj = redirect('/index') return obj return render(request, 'login.html', locals()) def index2(request): co = request.session.get('verfiy', None)#获取cookie if co == 'is_login': return render(request, 'index.html') return render(request, 'login.html'

四:django登陆验证,auth.利用cookie+session的保存技术

     4.1:cookie+session保存过程

          1:浏览器第一次发送请求的时候,发送一个空的cookie,服务器此时设置session  如{'user':'yuan'}。

    2:当session设置成功后,服务器会做两步操作。一:生成一个随机字符串,并将该字符串当作当作session_key,{'user':'yuan'}当作session-data 存在数据库上。

第二步,生成一个cookie{'session_id':'随机字符串'},返回浏览器。

   3:浏览器下次发送请求的时候cookie={'session_id':'随机字符串'},服务器拿到随机字符串,当作session_key,在数据库中取出session_data,这样就完成了session值的传递。

 

  4.2:auth验证的代码实现

from django.shortcuts import render,redirect,HttpResponse
import random
from django.contrib import auth        #导入登陆验证的模块
# Create your views here.
from django.http import JsonResponse
def index(request):
    if request.user:    #判断用户是否存在
        print(request.user)
        return render(request,'index.html')

    else:
        return render(request,'login.html')

def  login(request):
    if  request.method=='GET':
        return render(request,'login.html')
    if request.method=='POST':
        data={'user':None,'msg':None}
        print(request.POST)
        user =request.POST['user']
        pwd =request.POST['pwd']
        code =request.POST['code']
        if  code.lower()==request.session['code'].lower():
            user=auth.authenticate(username=user,password=pwd)#登陆验证,验证用户登陆信息是否正确,正确返回一个user已经验证通过的用户
            if  user:
                auth.login(request,user)#接受一个request对象和通过登陆验证user,并完成上面三步cookie+session的设置
                data['user']=True
            else:
                data['msg'] = '用户名或密码错误'

        else:
            data['msg']='验证码错误'

        return JsonResponse(data)
def logout_view(request):
  auth.logout(request)#注销用户

五:User对象:

  User对象有两个属性(user,password)。可以通过request.user.is_authenticated()来验证用户登陆是否通过验证,通过验证返回true.

验证后的怎么操作和该方法无关。该方法只做验证这一个功能。

    

原文地址:https://www.cnblogs.com/yingjp/p/10010088.html