Django之Auth认证模块

文章目录

  • 一、简介
  • 二、Auth模块是什么
  • 三、Auth模块常用方法
    • create_user() 创建普通用户
    • authenticate() 用户认证
    • auth.login(HttpResponse,user)登录状态保持
    • is_authenticated 登录认证判断
    • auth.loginout(reqeust)退出登录
    • login_required() 登录认证装饰器
    • check_password(password) 检查密码
    • set_password(password)修改密码
    • 用户删除
    • 创建超级用户
  • 四、拓展Auth_user表

一、简介

在平常我们使用Django开发的过程中都需要设计Web用户系统其中包含:用户注册、登录、修改密码、登录认证、注销等功能。而这些都是由我们手动将数据拿到数据库表中一一匹对,太过于麻烦。那么我们今天使用到的Auth模块可以完美解决这个问题,提升使用Django的开发效率


二、Auth模块是什么

Auth是Django自带的用户认证模块

Django作为一个完美主义者的终极框架,当然也会想到开发者的这些痛点,它内置了强大的用户认证系统:auth,它默认使用auth_user表来存储用户数据(也就是第一次迁移数据库时Django创建的表之一)

三、Auth模块常用方法

auth模块常用的属性和方法:

属性或方法解释
auth.authenticate判断用户名和密码
is_authenticated判断用户是否登录
request.user获取当前登录用户
login_required校验用户是否登录装饰器
check_password校验密码是否正确
set_password修改密码
auth.logout(request)退出登录
create_user()创建用户和加密密码
AbstractUser基于auth扩写

我们可以通过一下来导入Auth模块:

	from django.contrib import auth

create_user() 创建普通用户

auth提供的一个创建新用户的方法,需要提供必要参数(username,password)等。

导入方式:

	from django.contrib.auth.models import User

我们创建的用户默认会被添加到auth_user表中,首先我们得有一个注册页面,便于能够快速起到效果,这里就没有校验二次密码了,有兴趣就自行添加即可。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container"><div class="row"><div class="col-md-8 col-md-offset-2"><h1 class="text-center">注册页面</h1><hr><form action="" method="post">{% csrf_token %}<p>username:<input type="text" name="username" class="form-control"></p><p>password:<input type="password" name="password" class="form-control"></p><input type="submit" class="btn btn-block btn-success" value="注册"></form></div></div>
</div>
</body>
</html>

视图函数:

from django.contrib import auth
from django.contrib.auth.models import User
def register(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')# 校验用户名是否已存在# 这个方法必须要传递用户名和密码,单个不行会获取出None# obj = auth.authenticate(request,username=username,password=password)obj = User.objects.filter(username=username,password=password)if obj:return HttpResponse('用户名已存在')# 注册用户# User.objects.create(username=username,password=password) #不能自己创建,因为密码加密无法实现else:User.objects.create_user(username=username,password=password) # create_user方法会自动对密码加密return HttpResponse('注册成功!')return render(request,'register.html')

那么此时我们就实现了用户的账号注册功能。在auth_user表中就可以看到我们刚才注册的用户,并且Django帮助我们存储的过程中将密码进行了加密处理。

在这里插入图片描述


authenticate() 用户认证

提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username、password两个关键字参数。

导入方式:

	from django.contrib.auth import authenticate

如果认证成功(用户名和密码正确有效),便会返回一个User对象。

authenticate()会在该User对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。

登录Web

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container"><div class="row"><div class="col-md-8 col-md-offset-2"><h1 class="text-center">登录页面</h1><hr><form action="" method="post">{% csrf_token %}<p>username:<input type="text" name="username" class="form-control"></p><p>password:<input type="password" name="password" class="form-control"></p><input type="submit" class="btn btn-block btn-success" value="登录"></form></div></div>
</div>
</body>
</html>

视图函数:

	def login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')# 校验用户是否存在  自己是无法比对,因为密码存入其中加密了,所以需要用到auth模块提供的方法才可以obj = auth.authenticate(request,username=username,password=password) # 用户名和密码正确之后返回的是数据对象,反之返回None# print(obj.password, obj.username)if obj:return HttpResponse('登录成功!')else:return HttpResponse('用户名或密码错误!')return render(request,'login.html')

此时,我们便已经完成验证用户账号和密码是否正确的一个功能,此时再浏览器输入正确的用户名与密码,就会显示登录成功!

究其本质还是Django把我们输入的内容拿到了auth_user表中对比,匹对成功了返回一个User对象给我们,只不过这些步骤我们只需要调用一个API就可以是实现。


auth.login(HttpResponse,user)登录状态保持

如果现在有一个home页面需要登录之后才能访问,那么我们就需要再用户登录之后制作一个登录标识保存在Session中,那么访问home页面校验一下Session即可判断出来。这是我们之前的操作,需要手动设置Session,在手动验证Session是否存在。

login函数接收一个HttpResponse对象,以及一个经过认证的User对象。

该函数实现一个用户登录的功能,它本质上会在后端为该用户生产相关session数据。

该函数需要再用户认证以后使用,因为它的第二个参数需要传入一个User对象。

	from django.contrib.auth import authenticatedef login(request):print(request.user.is_authenticated)  # True表示存在此用户,print(request.user)  # 没有登录显示:AnonymousUser匿名用户    登录显示登录的用户对象数据'''用户登录成功之后执行Auth.login 该方法返回当前登录用户对象  admin用户没有登录成功没有执行Auth.login 该方法返回匿名用户对象  AnonymousUser'''if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')# 校验用户是否存在  自己是无法比对,因为密码存入其中加密了,所以需要用到auth模块提供的方法才可以obj = auth.authenticate(request,username=username,password=password) # 用户名和密码正确之后返回的是数据对象,反之返回Noneprint(obj.password, obj.username)if obj:# 用户登录成功后(返回给客户端一个登录凭证、字符串、令牌)auth.login(request, obj)  # 自动操作django_session表,返回一个凭证给客户端'''当执行上述的操作之后,我们就可以通过reqeust.user直接获取到当前登录的用户对象数据'''return HttpResponse('登录成功!')else:return HttpResponse('用户名或密码错误!')return render(request,'login.html')

此时我们还需配合下面的Auth方法一起使用才能看到效果


is_authenticated 登录认证判断

用来判断当前请求是否通过了登录认证。其主要还是判断请求内是否包含用户登录后的Session

定义一个home页面,只有检测到用户登录后才能访问,否则重定向到登录页面

登录验证Web

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
{% if request.user.is_authenticated %}  # 判断当前请求是否为登录状态<h1>{{ request.user.username}}</h1>
{% else %}<a href="/auth_register/">注册</a><a href="/auth_login/">登录</a>
{% endif %} 
</body>
</html>

视图函数:

	def home(request):return render(request,'home.html')

ps:reqeust.use具备很多方法,一些其它的常用方法在有需求的情况下在做了解

reqeust.user.username :查看当前登录的用户名
request.user.password :查看当前登录的用户密码(加密形式的)

到这里我们已经实现了登录认证,登录状态保持的一个效果,后端也可以识别当前是否为登录状态,并且知道当前登录的用户是那个。


auth.loginout(reqeust)退出登录

该函数接受一个HttpResponse对象,无返回值。

当调用该函数时,当前请求的Session信息会被全部清除。即使没有登录,使用该函数也不会报错。

后端清空了当前用户保存的Session信息,也可以理解为没有登录状态了,下次访问某些页面需要重新登录

	def login_out(request):auth.logout(request)return HttpResponse('已注销用户!')

当是这种退出登录,不管什么登录状态的都清除掉session这样不算合格,所以我们需要先校验是否登录。


login_required() 登录认证装饰器

在上面我们是通过Web页面里面使用了request.user.is_authenticated校验是否登录的

现在我们为了更加简单实现,auth给我们提供了一个装饰器工具,用来快捷的给某个视图添加登录校验

	@login_requireddef login_out(request):auth.logout(request)return HttpResponse('已注销用户!')

若用户没有登录,则会跳转到Django默认的登录URL/accounts/login/并且URL会额外显示:?next=/跳转之前的路径/

如果需要自定义登录的URL,有两种方式:

  1. 需要再settings.py文件中通过LOGIN_URL进行修改。
	LOGIN_URL = '/auth_login/' #这里配置成你的项目登录页面的路由
  1. 手动指定:用户没有登录时重定向到登录页面
	@login_required(login_url='/auth_login/')def indexs(request):# if request.user.is_authenticated:#     return HttpResponse('只有登录的用户可见')# else:#     return redirect('/auth_login/')return HttpResponse('只有登录的用户可见')

如果我们想要在登录之后立马跳转到被重定向之前的页面,使用方式一,因为它会保留定义之前的URL:

	 if obj:# 用户登录成功后(返回给客户端一个登录凭证、字符串、令牌)auth.login(request, obj)  # 自动操作django_session表,返回一个凭证给客户端urls = reqeust.GET.get('next')if not urls:urls = '/index/'  # 如果没有获取到,就默认登录后跳转到首页return redirect(urls)

check_password(password) 检查密码

auth提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。

密码正确返回True,否则返回False。但必须在登录之后并且保存了登录Session才能使用

使用方法:

	user = request.user.check_password('密码')

set_password(password)修改密码

auth 提供的一个修改密码的方法,接受要设置的新密码作为参数。

注意:设置完一定要调用用户对象的save方法!!! 通常在check_password校验之后使用

我们使用这两个来实现修改密码的功能

web:set_html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container"><div class="row"><div class="col-md-8 col-md-offset-2"><h1 class="text-center">修改密码页面</h1><hr><form action="" method="post">{% csrf_token %}<p>username:<input type="text" name="username" class="form-control" value="{{ request.user.username }}" disabled></p><p>oldpassword:<input type="password" name="old_pwd" class="form-control"></p><p>newpassword:<input type="password" name="new_pwd" class="form-control"></p><p>Confirm_password<input type="password" name="confirm_pwd" class="form-control"></p><input type="submit" class="btn btn-block btn-success" value="提交"></form></div></div>
</div>
</body>
</html>

视图函数:

@login_required
def set_pwd(request):if request.method == 'POST':user = request.user # 获取当前用户对象old_pwd = request.POST.get('old_pwd')  # 获取用户输入的旧密码new_pwd = request.POST.get('new_pwd')  # 获取用户输入的新密码confirm_pwd = request.POST.get('confirm_pwd')  # 二次确认新密码if not new_pwd == confirm_pwd:return HttpResponse('两次密码不一致')# 判断原密码是否正确res = request.user.check_password(old_pwd)if not res:return HttpResponse('原密码错误!')else:#修改密码request.user.set_password(new_pwd)request.user.save()  # 将修改后的数据保存在auth_user表中auth.login(request,user) # 因为用户信息发生变动,需要修改用户的session数据才能保持登录状态return HttpResponse('修改成功!')return render(request,'set.html')

用户删除

如果是管理员的话,可以删除其他用户,如果是普通用户的话,只能删除自己

管理员删除需要前端传递一个用户id到后端才能进行删除;需要路由定义分组来接收并传递给视图函数

	# 管理员删除用户@login_requireddef auth_delete(request,id):auth.logout(request)user = User.objects.filter(pk=id)user.delete()return HttpResponse('.....')路由层配置urls.pyre_path('auth_delete/(\dt)/', views.auth_delete,name='auth_delete'),

普通用户,仅只能删除自身

	@login_requireddef auth_delete(request):request.user.delete()return HttpResponse('.....')

注意:如果连接的是sqlite数据库,很可能会删除失效,建议换成MySQL数据库


创建超级用户

超级用户首先具备登录admin后端的能力,其次可以在里面删除其它用户;

超级用户的创建方式有两种:

  1. 通过:Python3 manage.py createsuperuser命令,根据提示输入用户名、邮箱(可输入空)、密码、二次密码等
  2. 通过Auth组件创建;与创建普通用户区别不大,只是获得权限不同

第一种方式:

django自带一个admin路由,但是需要我们提供管理员账户和密码,如果想要使用admin后台管理,需要先创建表,然后创建管理员账户。

在这里插入图片描述
直接执行数据类迁移命令即可产生默认的auth_user表,该表就是admin后台管理默认的认证表
在这里插入图片描述

​ 在控制台输入命令python38 manage.py createsuperuser

在执行创建管理员命令后,运行环境会提示我们输入用户名,邮箱(选填),密码等信息,依次输入即可。这样我们的auth_user表中就会添加一条数据,这条数据就是管理员用户信息。


第二种方式:
web:super_register.html 建立超级用户

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container"><div class="row"><h1 class="text-center">超级用户创建</h1><form action="" method="post">{% csrf_token %}<p>用户名:<input type="text" name="username" class="form-control"></p><p>邮箱:<input type="email" name="email" class="form-control"></p><p>密码:<input type="password" name="password" class="form-control"></p><p><input type="submit" value="提交" class="form-control btn-warning"></p></form></div>
</div>
</body>
</html>

视图函数

	# 创建超级管理员用户def auth_super_register(request):if request.method == 'POST':username = request.POST.get('username')email =request.POST.get('email')password = request.POST.get('password')User.objects.create_superuser(username=username,email=email,password=password)return HttpResponse('超级用户创建成功!')return render(request,'super_register.html')

创建完成以后我们就可以通过刚刚创建的账号和密码登录到Django的admin后台管理界面了

在这里插入图片描述


四、拓展Auth_user表

在原来的基础authmok的功能,并且又想扩展auth_user表的字段

思路1:一对一字段关联(不推荐)

	from django.contrib.auth.models import Userclass OtherUser(models.Model):user = models.OneToOneField(to=User)""" 将User表与OtherUser的字段一一对应,操作起来很麻烦"""

思路2:替换auth_user表(推荐)

	步骤1:模型层编写模型类继承AbstractUserfrom django.contrib.auth.models import AbstractUserclass UserInfo(AbstactUser):  # 继承原管理表格# 填写AbstactUser表中没有的字段phone=models.BinIntegerField()  # 可以随意添加desc=models.TextField()步骤2:一定要配置文件中声明替换关系AUTH_USER_MODEL='app01.UserInfo'# 告诉orm 使用app01 下的UserInfo表替换原先的auth_user表ps:替换还有一个前提,就是数据库迁移命令没有执行过(auth相关表没有创建),用全新的库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/185999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL之JDBC

&#x1f495;"我像离家的孤儿,回到了母亲的怀抱,恢复了青春。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;MySQL之JDBC 一.什么是JDBC? JDBC编程就是通过Java 代码来操纵数据库 数据库编程&#xff0c; 需要数据库服务器提供一些API供程序…

原来10张图就可以搞懂分布式链路追踪系统原理

分布式系统为什么需要链路追踪&#xff1f; 随着互联网业务快速扩展&#xff0c;软件架构也日益变得复杂&#xff0c;为了适应海量用户高并发请求&#xff0c;系统中越来越多的组件开始走向分布式化&#xff0c;如单体架构拆分为微服务、服务内缓存变为分布式缓存、服务组件通…

经典策略梯度算法

经典策略梯度算法 DDPG算法 DDPG 算法被提出的初衷其实是 DQN 算法的一个连续动作空间版本扩展。深度确定性策略梯度算法&#xff08; deep deterministic policy gradient&#xff0c;DDPG&#xff09;&#xff0c;是一种确定性的策略梯度算法。 由于DQN算法中动作是通过贪…

STM32CubeIDE(CUBE-MX)----快速移植FreeRTOS实战

文章目录 前言一、Freertos可视化配置二、生成代码三、实验现象总结 前言 FreeRTOS&#xff08;Real-Time Operating System&#xff09;是一个开源的实时操作系统内核&#xff0c;专注于嵌入式系统。它提供了一套用于管理任务、调度器、内存管理等的实时操作系统功能&#xf…

spring RedisTemplate RedisLockRegistry opsForXxx 基本使用总结以及介绍

一、基本介绍 RedisTemplate 为 spring 对 redis 操作的高度封装&#xff0c;基本已经满足所有使用场景。 若存在其他拓展使用我们可以自行封装工具类对基本操作进行组装。 RedisLockRegistry 对 redis 锁的一些封装 二、不同环境下依赖以及基本配置 2.1 spring-boot 下依赖…

windows启动后直接进入指定程序并且不显示欢迎界面和windows桌面

windows启动后直接进入指定程序并且不显示欢迎界面和windows桌面 前言开机进入指定程序方法问题 浅尝GINA和Credential Providers关闭欢迎屏幕 前言 由于系统需求需要做到电脑开机后显示完windows加载页面就直接进入自己系统的界面&#xff0c;并且不显示登录欢迎页面&#xf…

java操作windows系统功能案例(二)

1、打印指定文件 可以使用Java提供的Runtime类和Process类来打印指定文件。以下是一个示例代码&#xff1a; import java.io.File; import java.io.IOException;public class PrintFile {public static void main(String[] args) {if (args.length ! 1) {System.out.println(…

supermap-iserver激活教程(linux)

本篇只介绍linux临时许可激活教程&#xff0c;windows的原理一摸一样不做赘述。 1.下载许可中心&#xff08;web版&#xff09; SuperMap技术资源中心|为您提供全面的在线技术服务 2.解压 supermap-bslicense-server-3.0.24-linux-x64.tar.gz tar -zxvf supermap-bslicense…

微信小程序 - 开发版、体验版、正式版共享本地缓存

问题描述 最近突然发现一个大问题啊&#xff0c;小程序切换版本环境的时候发现数据被污染了&#xff0c;瞬间就怀疑不同环境版本的小程序本地缓存是否共享的&#xff1f;&#xff01; 果然是&#xff01; 解决方案 我们可能马上想到解决方案就是&#xff1a;给每一个环境版本…

Python字符串大小写转换的函数及用法

Python字符串由内建的str类代表&#xff0c;那么str 类包含哪些方法呢&#xff1f;Python 非常方便&#xff0c;它甚至不需要用户查询文档&#xff0c;Python 是“自带文档”的。 这里需要读者简单掌握两个帮助函数&#xff1a; dir()&#xff1a;列出指定类或模块包含的全部…

万户ezOFFICE wpsservlet任意文件上传漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品&#xff0c;统一的基础管理平台&#xff0c;实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台&#xff0c;将外网信息…

什么是AI PC:人工智能电脑?

大家好啊&#xff0c;我是董董灿。 今天在一个群聊里&#xff0c;聊到了关于 AI PC (人工智能电脑)的话题。 之前看到过关于 AI PC 的新闻&#xff0c;说的是联想集团董事长兼CEO杨元庆在一次演讲中提到了 AI PC 的概念&#xff0c;并且绘声绘色的描绘了AI PC 的发展前景。 下…

希亦、追觅和添可洗地机哪个好?3款热门洗地机测评

洗地机因为自身的超强清洁效果&#xff0c;能大大的降低家务清洁工作&#xff0c;所以近年来以及越来越成为家庭的标配家电。 地机选起来让人眼花缭乱&#xff0c;对于消费者来说&#xff0c;如何选择一台实用性价比高的洗地机已经是一个头疼的问题&#xff0c;看着宣传画面很…

【前端开发】Next.js与Nest.js之间的差异2023

在快节奏的网络开发领域&#xff0c;JavaScript已成为构建可靠且引人入胜的在线应用程序的标准语言。然而&#xff0c;随着对适应性强、高效的在线服务的需求不断增加&#xff0c;开发人员通常不得不从广泛的库和框架中进行选择&#xff0c;以满足其项目的要求。Next.js和Nest.…

【C++ Primer Plus学习记录】嵌套循环和二维数组

for循环是一种处理数组的工具。下面进一步讨论如何使用嵌套for循环中来处理二维数组。 C没有提供二维数组类型&#xff0c;但是用户可以创建每个元素本身都是数组的数组。例如&#xff0c;假设要存储5个城市在4年间的最高温度&#xff0c;可以这样声明数组&#xff1a; int m…

HP1010 | 业界首款图腾柱 PFC 专用数字控制器震撼来袭!

随着节能标准和客户需求的不断提高&#xff0c;电源解决方案的效率和尺寸也在不断优化&#xff0c;设计紧凑高效的 PFC 电源是一个复杂的开发挑战。随着第三代半导体器件氮化镓和碳化硅的大范围应用&#xff0c;图腾柱无桥 PFC&#xff08;TPPFC&#xff09;应用获得极大的拓展…

Kubernetes(K8s)_15_CNI

Kubernetes&#xff08;K8s&#xff09;_15_CNI CNI网络模型UnderlayMAC VLANIP VLANDirect Route OverlayVXLAN CNI插件FlannelCalico CNI配置内置实现 CNI CNI(Container Network Interface): 实现容器网络连接的规范 Kubernetes将网络通信可分为: Pod内容器、Pod、Pod与Se…

SOT23-3封装的设计与应用:220V转5V芯片电路

SOT23-3封装的设计与应用&#xff1a;220V转5V电路 AH8100介绍了一种基于SOT23-3封装的220V转5V电路l32*4761*OOO1设计方案&#xff0c;该方案具有简单、高效、稳定的特点&#xff0c;适用于各种电子设备。 一、引言 随着科技的发展&#xff0c;电子设备越来越多地应用于我们…

滴滴2023.11.27P0级故障技术复盘回顾(k8s的的错?)

本文从滴滴官方恢复及技术公众号带大家从技术角度复盘这次事故 目录 1. 背景 2. 滴滴官方消息 3. 问题分析及定位 4.网传的k8s及解析 5.k8s引发的思考&#xff1a;举一反三&#xff0c;怎么避免再次出现 6.近段时间其他平台崩溃回顾 1. 背景 11 月 27 晚约 10 点&#xf…

TCP解帧解码、并发送有效数据到FPGA

TCP解帧解码、并发送有效数据到FPGA 工程的功能&#xff1a;使用TCP协议接收到网络调试助手发来的指令&#xff0c;将指令进行解帧&#xff0c;提取出帧头、有限数据、帧尾&#xff1b;再将有效数据发送到FPGA端的BRAM上&#xff0c;实现信息传递。 参考&#xff1a;正点原子启…