当前位置: 首页 > news >正文

4.DRF 认证--Authentication4.DRF 认证--Authentication

创建一个子应用 opt

python manage.py startapp opt

注册子应用

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','rest_framework','students','sers',    # 序列化器"school",  # 序列化器嵌套'req',     # 请求与响应'demo',    # 视图'opt',     # drf提供的组件使用
]

总路由,代码:

from django.contrib import admin
from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('students/', include("students.urls")),path('sers/', include("sers.urls")),path('school/', include("school.urls")),path("req/", include("req.urls")),path("demo/", include("demo.urls")),path("opt/", include("opt.urls")),
]

子路由,代码:

from django.urls import path
from . import views
urlpatterns = []

因为接下来的认证组件中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员.

admin运营站点的访问地址:http://127.0.0.1:8000/admin

python manage.py createsuperuser
# 如果之前有账号,但是忘了,可以通过终端下的命令修改指定用户的密码,这里的密码必须8位长度以上的
python manage.py changepassword 用户名

创建管理员以后,访问admin站点,先修改站点的语言配置

settings.py

LANGUAGE_CODE = 'zh-hans'TIME_ZONE = 'Asia/Shanghai'

认证Authentication

可以在配置文件中配置全局默认的认证方案常见的认证方式:cookie、session、token/home/moluo/.virtualenvs/drfdemo/lib/python3.6/site-packages/rest_framework/settings.py 默认配置文件
REST_FRAMEWORK = {# 配置认证方式的选项'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework.authentication.SessionAuthentication', # session认证'rest_framework.authentication.BasicAuthentication',   # 基本认证)
}

也可以在具体的视图类中通过设置authentication_classess类属性来设置单独的不同的认证方式

from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.views import APIViewclass ExampleView(APIView):# 类属性authentication_classes = [SessionAuthentication, BasicAuthentication]def get(self,request):pass

认证失败会有两种可能的返回值,这个需要我们配合权限组件来使用:

  • 401 Unauthorized 未认证
  • 403 Permission Denied 权限被禁止

自定义认证,drfdemo.authentication代码:

from rest_framework.authentication import BaseAuthentication
from django.contrib.auth import get_user_modelclass CustomAuthentication(BaseAuthentication):"""自定义认证方式"""def authenticate(self, request):"""认证方法request: 本次客户端发送过来的http请求对象"""user = request.query_params.get("user")pwd  = request.query_params.get("pwd")if user != "root" or pwd != "houmen":return None# get_user_model获取当前系统中用户表对应的用户模型类user = get_user_model().objects.first()return (user, None)  # 按照固定的返回格式填写 (用户模型对象, None)

视图调用自定义认证,视图代码:

from django.contrib.auth.models import AnonymousUser
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.authentication import SessionAuthentication
from drfdemo.authentication import CustomAuthentication
# Create your views here.
class HomeAPIView(APIView):# authentication_classes = [CustomAuthentication, ]def get(self,request):"""单独设置认证方式"""print(request.user) # 在中间件AuthenticationMiddleware中完成用户身份识别的,如果没有登录request.user值为AnonymousUserif request.user.id is None:return Response("未登录用户:游客")else:return Response(f"已登录用户:{request.user}")

当然,也可以注释掉上面视图中的配置,改成全局配置。settings.py,代码:

"""drf配置信息必须全部写在REST_FRAMEWORK配置项中"""
REST_FRAMEWORK = {# 配置认证方式的选项【drf的认证是内部循环遍历每一个注册的认证类,一旦认证通过识别到用户身份,则不会继续循环】'DEFAULT_AUTHENTICATION_CLASSES': ('drfdemo.authentication.CustomAuthentication',          # 自定义认证'rest_framework.authentication.SessionAuthentication',  # session认证'rest_framework.authentication.BasicAuthentication',    # 基本认证)
}
http://www.dtcms.com/a/302695.html

相关文章:

  • 从文件到文件描述符:理解程序与文件的交互本质
  • TapData 出席 TDBC 2025 可信数据库发展大会,分享“实时+信创”时代的数据基础设施演进路径
  • Kylin10 安装tomcat9
  • Centos 7 命令:ip addr
  • 黑马商城微服务-下
  • 【QT搭建opencv环境】
  • R 语言科研绘图 --- 其他绘图-汇总1
  • Language Models are Few-Shot Learners: 开箱即用的GPT-3(四)
  • Mac安装navicat17版本教程mac下载Navicat Premium for Mac v17.1.9【好用】
  • ubuntu资源共享samba 安装与配置 mac/windows共享ubuntu文件资源
  • 1.gradle安装(mac)
  • 【江科大CAN】2.1 STM32 CAN外设(上)
  • CVE-2021-21148
  • fmriprep安装与试用_附ubuntu分区大小调整
  • C语言:20250728学习(指针)
  • 零基础学 AI 提示词:从 “提问” 到 “高效交互” 的第一步
  • 股指期货周度想法
  • 【ELasticsearch】案例:AWS 上 Elasticsearch 对接 NLB / ALB
  • 浏览器安全演进:从裸指针到 raw_ptr 的实践与思考
  • 开发指南125-HTML DOM事件
  • 使用 Qt Installer Framework(IFW)进行打包
  • github copilot接入openai-compatible模型以及去除安全限制的方法
  • Unity开发2D类银河恶魔城游戏学习笔记目录
  • 【前端】Angular 与 Svelte:两大前端框架的深度剖析
  • 深度研究——OpenAI Researcher Agent(使用OpenAI Agents SDK)
  • 【Kotlin】如何实现静态方法?(单例类、伴生对象、@JvmStatic)
  • Qt的静态属性与动态属性详解
  • 扩展卡尔曼滤波器 (EKF) 与无人机三维姿态估计:从理论到实践
  • 无人机气动设计模块解析
  • 学习游戏制作记录(改进剑投掷状态)7.28