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
    评论
Django REST framework (DRF) 可以使用 Token 认证、Session 认证和 JSON Web Token (JWT) 认证等方式进行登录验证。 其中,Token 认证和 Session 认证是最基本的认证方式,它们都使用了 Django 自带的用户认证系统,适合于简单的应用场景。Token 认证是通过在请求头中添加 Token 来进行认证,而 Session 认证则是在 Cookie 中保存 Session ID 来进行认证。 JWT 认证则是一种更加灵活和安全的认证方式,它使用了基于 JSON 的 Token,可以完全脱离 Django 自带的用户认证系统,支持跨域访问和分布式系统。JWT 认证需要在 DRF 中添加相应的中间件和配置,同时也需要在前端实现 Token 的生成和保存。 在 DRF 中使用 Token 认证或 Session 认证,只需要在 settings.py 文件中添加相应的认证方式,如: ```python REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', 'rest_framework.authentication.SessionAuthentication', ], } ``` 在视图函数中使用 `@authentication_classes` 装饰器来指定认证方式,如: ```python from rest_framework.decorators import authentication_classes from rest_framework.authentication import TokenAuthentication, SessionAuthentication @authentication_classes([TokenAuthentication, SessionAuthentication]) @api_view(['GET']) def my_view(request): # ... ``` JWT 认证需要使用第三方库 `djangorestframework-jwt`,并在 settings.py 文件中添加相应的配置,如: ```python INSTALLED_APPS = [ # ... 'rest_framework', 'rest_framework_jwt', ] REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', ), } JWT_AUTH = { 'JWT_SECRET_KEY': 'your_secret_key', 'JWT_ALGORITHM': 'HS256', 'JWT_ALLOW_REFRESH': True, 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7), 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=30), } ``` 在视图函数中使用 `@jwt_authetication_classes` 装饰器来指定 JWT 认证方式,如: ```python from rest_framework_jwt.authentication import JSONWebTokenAuthentication from rest_framework.decorators import jwt_authetication_classes @jwt_authetication_classes([JSONWebTokenAuthentication]) @api_view(['GET']) def my_view(request): # ... ``` 以上是 DRF 中常见的登录验证方式,可以根据具体的应用场景选择合适的认证方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值