Django 用户验证,restframework用户验证,cookie+session,token

用户验证方式可用cookie+session方式或token方式

1.基本概念

1.1cookie+session方式

基本原理:用户登录时,后台验证密码有效后,通过算法生成一段id分配给一个cookie值返回前端,后端将随机id存储为session值;以后用户每次请求时后端都通过cookie带的值来与数据库的session对比查看cookie的有效性。

 

优点:常规的登入,退出操作

弊端:服务端需要存储信息,每次请求都要查数据库

 

1.2token方式

基本原理:用户登录时,后台验证密码有效性后,通过一定加密算法计算后分配给前端一个token值;以后用户每次带token请求,后台通过特定算法计算token是否有效

优点:不需要后台存储信息

缺点:token分配出去后在有效期内都不能撤回,若用加黑名单方式撤回则会丧失token的优势

 

2.Django中实现

 

2.1 cookie+session

cookie操作

from django.shortcuts import render, HttpResponse

# 设置cookie
def set_cookie(request):
    response = HttpResponse('设置cookie')
    # 设置cookie
    response.set_cookie('num', 10, max_age=3600 * 24 * 14)
    return response


# 读取cookie
def get_cookie(request):
    # 通过 键 获取值
    num = request.COOKIES['num']
    return HttpResponse(num)

session操作 

def set_session(request):
    # 设置session
    request.session['username'] = 'zs'
    request.session['age'] = 18
    # request.session.set_expiry(2)  # 2s后过期
    # 默认是14天后过期, 0 表示关闭浏览器过期
    # 5s 表示 5s后过期
    return HttpResponse('设置session')


def get_session(request):
    """获取session"""
    username = request.session['username']
    age = request.session['age']
    return HttpResponse(username + ":" + str(age))


# 删除session
def clear_session(request):
    request.session.flush()  # 将整条记录删除
    request.session.clear() # 删除内容部分
    # 删除指定的key
    del request.session['username']
    return HttpResponse('清除成功')

 

Django项目默认开启session的,会在数据库中生成响应的存储表

在settings.py文件中,可以设置session数据的存储方式,可以保存在数据库、本地缓存等。

 

session存储可用一下几种方式:

1.默认的数据库

2.本地缓存

3.中间件缓存:如Redis。由于session访问频率很高,所以提高性能可用Redis。

 

2.2 token

加密算法的定义:需要达到的效果:token具有有效期,不易被计算出来(用户信息+salt+日期信息...组合)

token操作与cookie相似,都是对http header进行相关字段的添加

 

 

Django自带的用户验证

from  django.contrib.auth import authenticate,login,logout
from  django.contrib.auth.decorators import login_required
from django.contrib import auth
from django.contrib.auth.models import User

        def my_view(request):
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                # Redirect to a success page.
            else:
                # Return a 'disabled account' error message
                ... 
        else:
            # Return an 'invalid login' error message.

验证模块与user要一起使用:

#注册
def reg(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        user = User.objects.create_user(username=user,password=pwd)
        return redirect('/login/')
    return render(request,'reg.html')


def my_view(request):
  if not request.user.is_authenticated():
    return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值