Django Rest Framework实现身份认证源码详解

yizhihongxing

我来详细讲解一下“Django Rest Framework实现身份认证源码详解”的完整攻略,下面我们将分为以下几个部分:

  1. 介绍Django Rest Framework身份认证的基本原理
  2. 详细讲解Django Rest Framework中使用基于Token的身份认证
  3. 详细讲解Django Rest Framework中使用基于Session的身份认证

1. Django Rest Framework身份认证的基本原理

在Django Rest Framework中实现身份认证,需要在视图函数中添加认证类,Django Rest Framework中提供基于Token和基于Session两种方式来实现身份认证。

在views.py中添加身份认证类的方法如下:

from rest_framework.authentication import TokenAuthentication

class ExampleView(APIView):
    authentication_classes = [TokenAuthentication]
    # your code here

上述代码中,我们导入了TokenAuthentication类,然后将ExampleView视图函数中的authentication_classes属性设置为[TokenAuthentication]即可使用基于Token的身份认证。

如果要使用基于Session的身份认证,只需将authentication_classes属性设置为[SessionAuthentication]即可。

2. Django Rest Framework中使用基于Token的身份认证

Django Rest Framework中的Token身份认证是一种轻量级的身份认证方式,它的原理是:当用户首次登录,服务端会生成一个Token并返回给客户端,这个Token作为客户端请求时的身份凭证,服务端根据这个Token来识别用户的身份。

下面我们来看一下如何在Django Rest Framework中使用基于Token的身份验证。

2.1 生成Token

在Django Rest Framework中生成Token有两种方式:使用rest_framework.authtoken库和使用Django自带的TokenAuthentication库。这里我们采用使用Django自带的TokenAuthentication库的方式来生成Token。

在使用基于Token的身份认证前,我们需要先给用户生成一个Token,生成Token的方法如下:

from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token

user = User.objects.get(username='username')
token = Token.objects.create(user=user)

在上面的代码中,我们首先通过User.objects.get()方法获取到某个用户,然后使用Token.objects.create()方法为该用户生成一个Token。生成的Token将保存在数据库中的authtoken_token表中,每个Token对应一条记录,记录中保存了Token的值和对应的用户。

2.2 配置Token认证

我们已经生成了Token,接下来,我们需要在Django Rest Framework中配置Token认证。

from rest_framework.authentication import TokenAuthentication

class ExampleView(APIView):
    authentication_classes = [TokenAuthentication]

    def get(self, request, *args, **kwargs):
        # your code here
        pass

在上面的代码中,我们导入TokenAuthentication类,并将认证方式设置为基于Token的认证,然后在视图函数ExampleViewget方法中就可以通过request.user来获取当前已经认证的用户。

此时,我们就可以在客户端中将Token值放入请求头中进行请求:

headers = {'Authorization': 'Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b'}
response = requests.get('http://localhost:8000/api/endpoint/', headers=headers)

在上面的代码中,我们在请求头中添加了Authorization字段,并将Token值放入其中。在服务端中,Django Rest Framework会自动解析请求头中的Token并进行身份认证。

2.3 自定义Token模型

Django Rest Framework中提供的Token模型较为简单,如果我们需要在Token模型中添加一些自定义的字段,需要自定义Token模型。

自定义Token模型的方法如下:

  • 首先,在models.py中创建一个自定义的Token模型,在Token模型中添加一些自定义的字段。
from django.contrib.auth.models import AbstractUser, User
from django.db import models
from rest_framework.authtoken.models import Token

class CustomToken(Token):
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='用户', related_name='auth_tokens')
    created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')

    class Meta:
        ordering = ['-created_time']
        verbose_name = '自定义Token'
        verbose_name_plural = '自定义Token'

在上面的代码中,我们从rest_framework.authtoken.models import Token中导入原生的Token类,并自定义了一个CustomToken模型,在CustomToken模型中添加了一个created_time字段,并将user字段设置为外键。

  • 然后,我们需要修改Django Rest Framework中的Token认证类,将它的token_model属性设置为我们自定义的Token模型。修改认证类的方法如下:
from rest_framework.authentication import TokenAuthentication
from myapp.models import CustomToken

class CustomTokenAuthentication(TokenAuthentication):
    model = CustomToken

在上面的代码中,我们定义了一个自定义的Token认证类,将model属性设置为我们自定义的Token模型。

  • 最后,在视图函数中使用我们自定义的Token认证类即可。
class ExampleView(APIView):
    authentication_classes = [CustomTokenAuthentication]

    def get(self, request, *args, **kwargs):
        # your code here
        pass

在上面的代码中,我们将ExampleView视图函数中的身份认证方式设置为基于自定义Token的认证方式。

3. Django Rest Framework中使用基于Session的身份认证

Django Rest Framework中的Session身份认证是一种通过使用浏览器的Cookie来实现的身份认证方式。

下面我们来看一下如何在Django Rest Framework中使用基于Session的身份认证。

3.1 配置Session认证

在Django Rest Framework中使用Session身份认证的方式与使用Token身份认证稍有不同,我们需要先在Django中开启Session,并在Django Rest Framework中进行相关配置。

  • 首先,需要在Django中配置Session,可以在settings.py中进行配置,代码如下:
SESSION_ENGINE = 'django.contrib.sessions.backends.db'       # session存储方式
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                       # 浏览器关闭时session是否过期
SESSION_COOKIE_HTTPONLY = True                                # session cookie只能通过HTTP请求来获取,JS无法获取
SESSION_COOKIE_SECURE = False                                 # 是否启用HTTPS安全传输协议

在上面代码中,我们使用Django自带的Session存储方式,设置Session在浏览器关闭时不过期,设置Session cookie只能通过HTTP请求来获取,设置Session cookie不启用HTTPS安全传输协议。

  • 然后,在视图函数中添加Session认证:
from rest_framework.authentication import SessionAuthentication

class ExampleView(APIView):
    authentication_classes = [SessionAuthentication]

    def get(self, request, *args, **kwargs):
        # your code here
        pass

在上面的代码中,我们导入了Django Rest Framework中的SessionAuthentication认证类,并将ExampleView视图函数中的身份认证方式设置为基于Session的认证方式。

3.2 在客户端中使用Session认证

在客户端中使用Session认证的方式与使用Token认证略微不同,需要使用Django自带的django.contrib.sessions.backends.base.SessionBase类来模拟Session认证。

import requests
from django.contrib.sessions.backends.base import SessionBase

session = SessionBase()
session['_auth_user_id'] = '1'   # 用户ID
session['_auth_user_backend'] = 'django.contrib.auth.backends.ModelBackend'

headers = {'Cookie': 'sessionid={}'.format(session.session_key)}
response = requests.get('http://localhost:8000/api/endpoint/', headers=headers)

在上面的代码中,我们首先导入了django.contrib.sessions.backends.base.SessionBase类,然后模拟Session认证,将用户ID和用户认证后端保存到Session中,最后在请求头中添加sessionid即可。

这样,我们就可以在客户端中使用Session认证对Django Rest Framework进行身份认证了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django Rest Framework实现身份认证源码详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • django patch

    1 import datetime 2 3 import pytz 4 from django.apps import AppConfig 5 from django.db.models.fields import DateTimeField 6 from django.utils.dateparse import parse_date 7 from dja…

    Django 2023年4月11日
    00
  • Django 将数据库查出的 QuerySet 对象转换为 json 字符串

    通过Django查询出MySQL数据库的数据,并将查询出的QuerySet 对象转化成 json 字符串。 写这个例子的作用主要是用来为手机端提供接口用,记录一下,以后 说不准 肯定能用到!   —————-  这是一条人工分界线———————-   1.  假如只查询其中一条数据的对象转换为 json 字符串…

    Django 2023年4月9日
    00
  • Python中的Django基本命令实例详解

    下面我会详细讲解“Python中的Django基本命令实例详解”的完整攻略,包含两条示例说明。 一、Django基本命令 1.创建Django项目 使用以下命令来创建Django项目: django-admin startproject <projectname> 其中,<projectname>为你想要创建项目的名称。执行上面的命令…

    Django 2023年5月16日
    00
  • Django Admin数据表可视化

    Django Admin是一个强大的开发工具,它为开发者提供了一套完整的管理界面,用于管理网站的后台数据。其中最常用的就是数据表可视化,即展示和编辑数据库中的数据表。 以下是使用Django Admin实现数据表可视化的方法: 在models.py中定义数据模型(Model) 将需要展示的数据表定义为一个Django模型(Model),例如: from dj…

    Django 2023年3月12日
    00
  • django2笔记之路由path语法的实现

    下面是详细讲解“django2笔记之路由path语法的实现”的完整攻略: 1. 路由path语法概述 在Django中,路由用于匹配URL,并将请求分发到对应的视图函数。而路由的定义则是通过一个Python模块来完成的,这个模块通常被称作“路由表”。 在Django 2开始,我们使用path()函数定义路由而不是url()函数。和旧版本的url()函数相比,…

    Django 2023年5月16日
    00
  • Django orm 实现批量插入数据

    Django ORM 中的批量操作 在Hibenate中,通过批量提交SQL操作,部分地实现了数据库的批量操作。但在Django的ORM中的批量操作却要完美得多,真是一个惊喜。 数据模型定义 首先,定义一个实例使用的django数据库模型Product,只是象征性地定义了两个字段name和price。 from django.db import models…

    Django 2023年4月9日
    00
  • Django对数据库进行添加与更新的例子

    以下是Django对数据库进行添加和更新的例子: 添加数据到数据库 1. 创建模型 在 Django 中创建数据模型是一个关键的过程。它定义了数据的结构,就像数据库中的表格一样。为了创建一个模型,你需要在你的 Django 应用的 models.py 文件中定义一个 Python 类来表示你想存储的数据。下面是一个示例: from django.db imp…

    Django 2023年5月16日
    00
  • django基础知识之模型查询:

    查询集表示从数据库中获取的对象集合 查询集可以含有零个、一个或多个过滤器 过滤器基于所给的参数限制查询的结果 从Sql的角度,查询集和select语句等价,过滤器像where和limit子句 接下来主要讨论如下知识点 查询集 字段查询:比较运算符,F对象,Q对象 在管理器上调用过滤器方法会返回查询集 查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤…

    Django 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部