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

我来详细讲解一下“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日

相关文章

  • vue项目创建,redis列表字典操作,django用redis的第二种方法

    vue项目的创建(路飞前端) -安装node.js -安装vue的脚手架 -创建vue项目,vue create 项目名字在pycharm中开发vue -webstrom,pyacharm,goland,idea,androidStuidio,Php…. -Edit-conf—-》点+ 选npm—–》在script对应的框中写:servevue…

    Django 2023年4月10日
    00
  • Django Rest Framework之解析器

    urls.py: from django.conf.urls import url, include from web.views.s5_parser import TestView urlpatterns = [ url(r’test/’, TestView.as_view(), name=’test’), ]  views.py: from rest_f…

    2023年4月9日
    00
  • django MEDIA_URL MEDIA_ROOT 用法

    参考实例:https://cloud.tencent.com/developer/article/1578874   1.在项目setting中具体配置: MEDIA_URL = ‘/media/’ MEDIA_ROOT = os.path.join(BASE_DIR, ‘media’)   2  在url.py 中配置路由 from bookweb.set…

    Django 2023年4月13日
    00
  • 将Python的Django框架与认证系统整合的方法

    将Python的Django框架与认证系统整合的方法是很常见的需求,主要是在网站建设等场景中需要用户注册、登录、注销等功能。下面是将Python的Django框架与认证系统整合的完整攻略。 1.创建Django项目并设置认证系统 首先,我们需要创建一个Django项目,并设置认证系统。可以在终端中执行以下命令来创建Django项目: django-admin…

    Django 2023年5月16日
    00
  • 详解Django之auth模块(用户认证)

    下面我将详细讲解“详解Django之auth模块(用户认证)”的完整攻略,并且会包含两条示例说明,其内容如下: 详解Django之auth模块(用户认证) 什么是Django auth模块? Django auth是Django的一个内置模块,用于提供用户认证、用户组、权限等功能。它提供了一组可重用的视图和模板,可以快速构建用户注册、登录、注销等功能。在Dj…

    Django 2023年5月16日
    00
  • Django高级编程之自定义Field实现多语言

    下面我会详细讲解“Django高级编程之自定义Field实现多语言”的完整攻略,同时给出两条示例说明。 什么是自定义Field 在Django中,Field是描述模型中每个属性的数据类型和对应的数据库映射关系。Django提供了很多内置的Field类型,如CharField、IntegerField、DateField等等,但是在某些实际场景中,可能需要自定…

    Django 2023年5月16日
    00
  • 详解django中使用定时任务的方法

    下面我来为您详细讲解“详解Django中使用定时任务的方法”的完整攻略,其中还包括两条示例说明。 什么是Django任务? Django任务是一种自动执行的代码,可以在预定的时间间隔内进行。它们通常被用来处理需要定期执行的任务,例如数据备份、清理和数据分析。 Django任务的基本原理 Django使用Celery和Django-Celery-Beat来实现…

    Django 2023年5月16日
    00
  • 简介Django框架中可使用的各类缓存

    首先我们需要了解什么是缓存。缓存是将计算出来的结果缓存起来,以供后面的请求使用,避免再次计算,从而提高应用程序的性能。 Django框架中可使用的缓存主要包括内存缓存、文件缓存、数据库缓存以及其他缓存。 内存缓存 内存缓存是将缓存数据保存在内存中,读写速度非常快,但是数据不稳定,需要在应用程序重启时重新载入缓存数据。 Django框架中内置了两种内存缓存方式…

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