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

Django初窥门径-自定义用户模型

前言

自定义用户模型在Django应用中是一个重要的话题,它涉及到如何根据您的项目需求以及特定的用户身份验证和授权需求来调整用户模型。在以下前言中,我将讲述为什么自定义用户模型是如此重要以及其潜在的优势:

随着Web应用的不断发展,用户身份认证和授权的需求也变得越来越多样化。在默认情况下,Django提供了一个名为django.contrib.auth.models.User的用户模型,它包含了常见的用户属性和方法,但不一定满足所有项目的要求。因此,自定义用户模型成为了一个必要的选择,它允许我们根据项目的具体需求来调整用户模型。

自定义用户模型的优势无处不在。首先,它使我们能够添加、修改或删除用户模型中的字段,以适应项目的特定数据。您可以为用户模型添加新的属性,如个人资料信息、头像、联系方式等,从而更好地满足项目需求。其次,自定义用户模型也允许您更好地集成社交媒体登录、第三方身份验证等功能,以提供更多的用户便利性。

此外,自定义用户模型还可以增强安全性。通过添加自定义字段,您可以更好地管理密码策略,实施多因素身份验证,记录安全审计日志等。最重要的是,自定义用户模型为您提供了更大的灵活性,以适应未来的项目需求和扩展。

总之,自定义用户模型不仅仅是一种实现特定项目需求的手段,更是提高Web应用的灵活性、安全性和可维护性的重要工具。在接下来的文章中,我们将深入探讨如何创建和使用自定义用户模型,以及它如何帮助我们构建更强大的Django应用。

Django用户模型

Django用户模型是Django框架的一个关键组件,用于处理用户认证和用户管理的任务。它为您提供了一种便捷的方式来创建、注册、登录和管理用户,同时也支持用户自定义以满足特定项目需求。

内置用户模型

Django提供了一个内置的用户模型 (django.contrib.auth.models.User),其中包含以下常见用户属性:

  • 用户名
  • 密码
  • 电子邮件地址
  • 名字
  • 姓氏

您可以轻松地在Django项目中启用这个内置用户模型并使用它来实现用户认证功能。

用户认证

Django用户模型简化了用户认证流程。以下是一些与用户认证相关的功能:

  • 用户注册
  • 用户登录
  • 用户注销
  • 密码重置
  • 用户会话管理

Django提供了内置视图和装饰器,以帮助您轻松实现这些功能。

用户自定义

如果需要更多用户属性或者用户模型的不同结构,您可以自定义用户模型。通常的做法是创建一个自定义用户模型,继承自 AbstractUser,然后为其添加额外的字段,以满足项目的需求。

from django.contrib.auth.models import AbstractUserclass CustomUser(AbstractUser):# 自定义字段age = models.PositiveIntegerField()

用户认证后端

Django允许您使用不同的用户认证后端。默认情况下,Django使用用户名和密码进行认证,但您可以实现其他认证方法,如社交媒体登录、LDAP认证等。

权限和组

Django用户模型也支持用户权限和用户组的管理。您可以为用户分配不同的权限,并将用户组用于更好地管理这些权限。

用户管理界面

Django提供了一个内置的管理界面,可用于管理用户、组和权限,使用户管理变得更加便捷。
这些是Django用户模型的一些重要方面,它们可用于构建强大的用户认证和管理系统,同时也具备灵活性,以满足不同项目的需求。

创建自定义模型

创建一个account应用

python manage.py startapp account

创建自定义用户管理器

由于我们需要对默认用户模型的字段进行增删,所以需要自己实现一个用户管理器来管理我们的自定义模型。

class UserManager(BaseUserManager):"""用户管理器"""use_in_migrations = Truedef _create_user(self, username, email, password, **extra_fields):if not username:raise ValueError('The given username must be set')email = self.normalize_email(email)username = self.model.normalize_username(username)user = self.model(username=username, email=email, password=password, **extra_fields)user.save(using=self._db)return userdef create_user(self, username, email=None, password=None, **extra_fields):extra_fields.setdefault('is_active', False)extra_fields.setdefault('is_superuser', False)return self._create_user(username, email, password, **extra_fields)def create_superuser(self, username, email, password, **extra_fields):extra_fields.setdefault('is_active', True)extra_fields.setdefault('is_superuser', True)if extra_fields.get('is_active') is not True:raise ValueError('Superuser must have is_active=True.')if extra_fields.get('is_superuser') is not True:raise ValueError('Superuser must have is_superuser=True.')return self._create_user(username, email, password, **extra_fields)
特征自定义管理器 (UserManager)默认管理器 (django.contrib.auth.models.UserManager)
创建用户方法提供 _create_user, create_usercreate_superuser 方法,允许根据特定需求创建用户对象。提供 create_usercreate_superuser 方法,用于创建普通用户和超级用户,但可能不够灵活以满足特定需求。
默认值设置允许设置特定的默认值,如 is_activeis_superuser,以确保创建的用户对象具有所需属性。提供一组默认值,通常创建的用户是活动的和非超级用户,可能需要进一步修改属性。
私有方法包含 _create_user 方法,它是私有的,不直接暴露给外部调用,而是通过公共方法 create_usercreate_superuser 访问。默认管理器没有私有方法,所有方法都是公共的,可以直接调用。
自定义性提供更灵活的方式来定义用户创建逻辑,包括额外字段的处理和验证。提供通用的用户创建方法,适用于大多数情况,但可能不满足特定项目的自定义需求。
用途适用于需要特定用户创建逻辑和更多控制的项目。适用于大多数一般情况下的项目,需要快速创建用户对象。

通过上述比较,您可以看到自定义管理器和默认管理器之间的一些关键区别,自定义管理器更适合在需要更多控制和自定义的项目中使用。默认管理器适用于一般情况下,可以快速创建用户对象,而自定义管理器则提供了更多的弹性和灵活性。

创建抽象用户模型

创建自定义权限混合模型

#!/usr/bin/python
# -*- coding: utf-8 -*-
from django.contrib.auth.models import _user_has_perm, _user_has_module_perms
from django.db import modelsclass PermissionsMixin(models.Model):"""超级用户权限混合模型"""is_superuser = models.BooleanField('超级用户状态', default=False, help_text='指明该用户缺省拥有所有权限。')class Meta:abstract = Truedef has_perm(self, perm, obj=None):"""Return True if the user has the specified permission. Query allavailable auth backends, but return immediately if any backend returnsTrue. Thus, a user who has permission from a single auth backend isassumed to have permission in general. If an object is provided, checkpermissions for that object."""# Active superusers have all permissions.if self.is_superuser:return True# Otherwise we need to check the backends.return _user_has_perm(self, perm, obj)def has_module_perms(self, app_label):"""Return True if the user has any permissions in the given app label.Use simlar logic as has_perm(), above."""# Active superusers have all permissions.if self.is_superuser:return Truereturn _user_has_module_perms(self, app_label)

PermissionsMixin 是一个抽象模型,用于将超级用户的权限特性添加到用户模型中。我们的自定义PermissionsMixin 与Django默认的用户模型(User)之间的主要区别在于权限管理。

特征PermissionsMixin默认的 User 模型
超级用户标识字段(is_superuser)存在,并且是一个布尔字段,用于表示用户是否是超级用户。默认情况下,用户不是超级用户。默认 User 模型中也存在 is_superuser 字段,但在创建用户时通常不会指定该字段,它会默认为 False
检查用户权限的方法(has_perm)PermissionsMixin 提供了 has_perm 方法,用于检查用户是否具有指定的权限。如果用户是超级用户,直接返回 True默认 User 模型中也有 has_perm 方法,但其行为可能会因所使用的身份验证后端而异。
检查应用程序权限的方法(has_module_perms)PermissionsMixin 提供了 has_module_perms 方法,用于检查用户是否在给定应用程序标签中具有任何权限。默认 User 模型中没有 has_module_perms 方法,检查应用程序权限通常需要自己实现。
使用场景适用于需要超级用户权限相关功能的应用,可以与自定义用户模型一起使用。适用于一般情况下的应用,通常不需要额外的超级用户权限功能。
默认值设置is_superuser 默认为 False,表示用户不是超级用户。需要在用户创建时手动设置为 Trueis_superuser 默认为 False,在创建用户时通常不需要显式设置。
帮助文本提供了帮助文本,解释了 is_superuser 字段的作用,即指明该用户是否默认拥有所有权限。默认 User 模型中的 is_superuser 字段通常没有相应的帮助文本。

总的来说,PermissionsMixin 旨在扩展用户模型以添加超级用户权限相关的功能,如检查用户是否具有特定权限和应用程序权限。默认的 User 模型是通用的,适用于大多数一般情况,但不包括额外的超级用户权限管理功能。可以根据项目需求选择是否使用 PermissionsMixin 或默认的 User 模型。

创建自定义校验器

#!/usr/bin/python
# -*- coding: utf-8 -*-
from django.core import validators
from django.utils.deconstruct import deconstructible@deconstructible
class UsernameValidator(validators.RegexValidator):"""用户名校验"""regex = r'^[a-zA-Z0-9_.]{4,16}$'message = '请输入4-16位字母数字以及下划线和点的组合'flags = 0

我们创建了一个自定义的用户名校验器,该校验器通过继承 validators.RegexValidator 并使用 @deconstructible 装饰器来创建一个可序列化的自定义校验器。

创建抽象用户模型

class AbstractUser(AbstractBaseUser, PermissionsMixin):"""抽象用户模型"""username_validator = UsernameValidator()username = models.CharField('用户名', max_length=150, unique=True, validators=[username_validator],help_text='必填。150个字符或者更少。包含字母,数字和仅有的/./+/-/_符号。',error_messages={'unique': '已存在一位使用该名字的用户。',})email = models.EmailField('电子邮件地址', unique=True, blank=False, null=False)is_active = models.BooleanField('有效', default=False, help_text='指明用户是否被认为是活跃的。以反选代替删除帐号。')# 需要使用 Django Admin的同学必须添加该字段,不然访问会报错is_staff = models.BooleanField('员工', default=True)date_joined = models.DateTimeField('加入日期', default=timezone.now)objects = UserManager()EMAIL_FIELD = 'email'USERNAME_FIELD = 'username'REQUIRED_FIELDS = ['email']class Meta:verbose_name = '用户'verbose_name_plural = verbose_nameabstract = True
关键点描述
类的名称AbstractUser - 这是一个抽象用户模型。
继承关系继承自 AbstractBaseUserPermissionsMixin,具备身份认证和权限管理的功能。
username_validator包含了用户名校验器 UsernameValidator,用于验证用户名是否符合指定格式要求。
username 字段表示用户的用户名,包含帮助文本和错误消息,唯一且不可为空。
email 字段表示用户的电子邮件地址,唯一且不可为空。
is_active 字段表示用户的活跃状态,默认为非活跃状态。
date_joined 字段表示用户的加入日期,使用 timezone.now 作为默认值。
objects用户管理器,通常是一个自定义的用户管理器,用于管理用户对象。
EMAIL_FIELD用户模型中用于电子邮件地址的字段名称。
USERNAME_FIELD用户模型中用于用户名的字段名称。
REQUIRED_FIELDS包含了必填字段列表,包括了电子邮件地址。
Meta定义了一些元数据,如用户模型的名称、复数形式名称,以及将其设置为抽象模型。
用途用作其他用户模型的基础,提供了身份认证和权限管理的功能,可用于创建自定义用户模型。

这个抽象用户模型提供了一个基础,可用作其他用户模型的基础。其他用户模型可以继承此抽象用户模型,以获得身份认证和权限管理的功能,并根据需要扩展字段和行为。这样,我们可以轻松创建满足特定项目需求的用户模型。

创建用户模型

class User(AbstractUser):avatar = models.URLField('头像', null=True)last_login_ip = models.GenericIPAddressField(null=True)def __str__(self):return self.usernameclass Meta:ordering = ['-last_login']
关键点描述
类的名称User - 这是一个自定义用户模型,继承自Django内置的AbstractUser
继承关系继承自AbstractUser,继承了AbstractUser中的字段和方法,并允许添加自定义字段和方法。
自定义字段- avatar字段:用于存储用户的头像URL,类型为URLField,允许为空。
- last_login_ip字段:用于存储用户的上次登录IP地址,类型为GenericIPAddressField,也允许为空。
__str__ 方法定义了对象的字符串表示,返回用户的用户名作为字符串表示。
Meta- ordering属性:定义查询结果的默认排序方式,按last_login字段降序排序,最后登录的用户排在前面。
用途用作自定义用户模型,允许在Django应用中使用,并添加额外的字段和方法来满足特定项目的需求。

这个自定义用户模型允许我们创建具有额外功能的用户对象,例如存储用户头像和上次登录IP地址,同时继承了Django内置用户管理的功能,如身份认证和权限管理。可以根据具体项目的需求,创建自定义用户模型来满足特定的功能和字段要求。

应用自定义用户模型

AUTH_USER_MODEL = 'account.User'

AUTH_USER_MODEL 是一个Django设置,用于指定自定义用户模型的路径。AUTH_USER_MODEL 被设置为 ‘account.User’,表示自定义用户模型位于account应用中的User模型。

通过设置AUTH_USER_MODEL,告诉Django使用指定的用户模型来处理身份验证和用户相关的操作,而不是使用默认的django.contrib.auth.models.User模型。这允许我们自定义用户模型,以满足项目的特定需求。

在使用自定义用户模型时,需要确保将AUTH_USER_MODEL设置在项目的设置文件中,以便Django知道要使用哪个用户模型。这通常在项目的settings.py文件中设置。

在后续开发中,我们使用get_user_model() 用于替代硬编码用户模型的引用,以提高代码的灵活性和可维护性。在使用自定义用户模型时,它有助于确保代码与用户模型的更改保持兼容。比如:

User = get_user_model()

处理用户注册时填写的密码

#!/usr/bin/python
# -*- coding: utf-8 -*-
from django.contrib.auth import get_user_model
from django.db.models import signals
from django.dispatch import receiverUser = get_user_model()@receiver(signals.post_save, sender=User)
def create_user(sender, instance=None, created=False, **kwargs):"""创建用户信号量"""if created:"""创建用户时将明文密码改成加密格式"""password = instance.passwordinstance.set_password(password)instance.save()
关键点描述
获取用户模型(get_user_model()使用 get_user_model() 函数来获取当前项目中配置的用户模型,确保与项目中使用的用户模型保持一致。
信号接收器装饰器(@receiver使用 @receiver 装饰器注册信号接收器,指定了接收 post_save 信号,表示在保存用户对象后触发信号,同时指定了信号的发送者为 User 模型。
create_user 函数信号接收器的处理函数,用于处理 post_save 信号。
- created 参数用于判断用户对象是否是新创建的,如果 createdTrue,表示用户是新创建的。
- 密码加密在处理函数中,从用户实例中获取明文密码,然后使用 set_password 方法将其转换为加密格式,最后保存用户实例以将加密后的密码存储到数据库中。
作用该信号接收器的作用是在创建用户时,自动将明文密码转换为加密格式并保存到数据库中,以提高用户密码的安全性。

这个信号量用于确保用户的密码在创建时自动得到加密处理,而不以明文形式存储在数据库中。通常与自定义用户模型一起使用,以确保密码安全性的提高。

我们需要在apps.py中注册这个信号量:

from django.apps import AppConfigclass AccountConfig(AppConfig):default_auto_field = 'django.db.models.BigAutoField'name = 'account'def ready(self):from . import signals

ready 方法是应用配置的一个特殊方法,它在Django启动时自动执行。在这里,它导入了应用内的signals模块,以便应用的信号接收器可以注册并在应用启动时生效。

此时,千万不要忘了在配置文件里注册我们的account应用

INSTALLED_APPS = [...'account.apps.AccountConfig',...
]

重新初始化数据库

由于我们更改了用户模型,对数据库影响较大,应用到数据库的时候可能会报错,所以建议删掉所有表重新初始化。

python manage.py makemigrations
python manage.py migrate

模型的更改应用到数据库后,我们就可以生成超级用户了:

python manage.py createsuperuser

在这里插入图片描述
由上图可以看出,我们已经应用新的用户模型生成了数据库表,并且创建了超级用户。

结语

在本文中,我们探讨了Django中的用户模型、信号接收器以及数据库迁移。我们了解了如何自定义用户模型以满足特定项目需求,如何使用信号接收器处理各种操作,以及如何使用迁移来管理数据库模式的变更。这些都是Django中的关键概念,有助于构建强大的Web应用。希望本文能帮助您更深入地理解这些概念,并在您的项目中有所应用。

相关文章:

Django初窥门径-自定义用户模型

前言 自定义用户模型在Django应用中是一个重要的话题,它涉及到如何根据您的项目需求以及特定的用户身份验证和授权需求来调整用户模型。在以下前言中,我将讲述为什么自定义用户模型是如此重要以及其潜在的优势: 随着Web应用的不断发展&…...

微信小程序文件上传wx.uploadFile

网页版查看了一下负载要求是这样 wx.uploadFile({url: ${wx.getStorageSync(apiUrl)}//sysFileInfo/upload?token${wx.getStorageSync(token)}, // 仅为示例,非真实的接口地址filePath: files[0].url,name: file,formData: {secretFlag: Y },success: (res) > {…...

支持内录系统声音的Mac录屏软件Omi Recorder

Screen Recorder by Omi是一款功能强大的屏幕录制应用程序。它可用于在Windows和Mac计算机上捕获屏幕,以便进行演示、教程、游戏录制、视频编辑等各种用途。 以下是该应用程序的一些主要特点: 支持高清录制:Omi Screen Recorder可以以高达6…...

一、Hadoop初始化配置(final+ubuntu保姆级教程)

1、配置虚拟机 三台虚拟机,分别为node1、node2、node3,内存分别为4G、2G、2G,现存最好为(>40G),如下: 2、修改主机名 分别打开三台虚拟机,root用户输入一下命令: no…...

Linux常用的包管理工具

Linux系统中有两个常用的包管理工具,分别是yum和apt。 1. yum命令 yum是Red Hat公司开发的一种包管理器,主要用于安装、更新、卸载和管理RPM包。它是基于RPM包管理系统的,可以自动解决软件包依赖关系问题。 常用yum命令: - 安…...

python随机生成指定长度的字符串

需求:随机生成一个指定长度的字符串(数字和小写字母) 涉及到的python知识点 (1)python模块包:random random.choice(sequence):从指定的序列中获取一个随机元素 random.choice(sequence)从序…...

语音识别接口试用

语音识别结果对比 1.jonatasgrosman/wav2vec2-large-xlsr-53-chinese-zh-cn 啊五包你没有什么问题嗓局问的这老受刚来指伯间我想就了解其二联地完觉全没问题犹该奖姐家女标要等到老师主动据奖定练择因位我主要奖的是耶号联接最长加展们如果说宁士比到六点级到一到另年级的家长…...

Java的数组使用

数组的定义: package The_First_Stage.The_beginner_level_Java_SE.Arrawy;/*** 数组的作用:用来存储相同类型的数据* 以int类型数据为案例:数组用来存储int类型数据* 1》声明定义数组* int【】 arr 定义一个int类型的数组,名字…...

基于STC15单片机温度光照蓝牙传输-proteus仿真-源程序

一、系统方案 本设计采用STC15单片机作为主控器,液晶1602显示,DS18B20采集温度,光敏电阻采集光照、按键设置温度上下限,测量温度小于下限,启动加热,测量温度大于上限,启动降温。 二、硬件设计 …...

Jmter接口网站压力测试工具

首先下载Jmeter 官方地址:Apache JMeter - Apache JMeter™ 安装Jmeter 把下载的文件进行解压,产生如下目录: 打开bin文件夹下的jmeter.bat文件及进入程序的主界面窗体jmeter.log是日志文件。 主意:需要配置java环境。 jmter创…...

7.2 创建和销毁条件变量

方法 pthread_cond_init(condition, attr) pthread_cond_destroy(condition) pthread_condattr_init(attr) pthread_condattr_destroy(attr) 用法 条件变量的类型为pthread_cond_t,必须在使用之前初始化。有如下两种方法来初始化条件变量: 声明时初…...

九凌网络:谷歌seo优化和外贸建站的五大优势

九凌网络是专注于谷歌SEO和外贸网站建设技术研发的技术型公司。九凌网络为外贸企业提供优质的外贸建站和谷歌优化服务,目前全国合作过的外贸企业超过8000家,覆盖全国12个省,超过60个地级市,在运营的谷歌seo优化客户300多家&#x…...

【vue3/echarts】vue3中使用echarts/饼图/双轴双数据柱状图

npm下载echarts 引入使用 <script> import Box from "/components/box.vue"; import { onMounted } from vue; import { init } from echarts; export default {components: {Box: Box},setup() {onMounted(() > {// 饼图const charEle document.getElem…...

【左程云算法全讲4】比较器和堆

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于左程云算法课程进行的&#xff0c;每个知识点的修正和深入主要参考…...

【计算机组成与设计】Chisel取指和指令译码设计

本次试验分为三个部分&#xff1a; 目录 设计译码电路 设计寄存器文件 实现一个32个字的指令存储器 设计译码电路 输入位32bit的一个机器字&#xff0c;按照课本MIPS 指令格式&#xff0c;完成add、sub、lw、sw指令译码&#xff0c;其他指令一律译码成nop指令。输入信号名…...

「Verilog学习笔记」位拆分与运算

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 1、寄存器的位是可以分开单独运算的&#xff0c;并不是一个输入就一定是一个数据&#xff0c;在很多情况下&#xff0c;一个输入既包括数据又包括地址等其他有效信息 2、需…...

protobufjs实现protobuf序列化与反序列化

系列文章目录 websocket训练地址:https://www.qiulianmao.com,正在搭建中 基础-websocket逆向基础-http拦截基础-websocket拦截基础-base64编码与解码基础-python实现protobuf序列化与反序列化基础-前端js实现protobuf序列化与反序列化基础-protobufjs实现protobuf序列化与反…...

el-select多选以tag展示时,超过显示长度以...省略号显示,且在一行展示

效果&#xff1a; 代码&#xff1a; <span>系统词典维度&#xff1a;</span><el-selectv-model"dNum"placeholder"请选择"multiplecollapse-tags //设置collapse-tags属性将它们合并为一段文字size"small"style"width:160p…...

计算机网络第4章-通用转发和SDN

引子&#xff1a; 在前面&#xff0c;我们将基于目的地转发的特征总结为两个步骤&#xff1a; 查找目的IP地址&#xff08;匹配&#xff09;&#xff0c;然后将分组发送到有特定输出端口的交换结构&#xff08;“动作”&#xff09;。 但是这种转发特征会带来许多问题&#…...

DDD技术方案落地实践 | 京东云技术团队

1. 引言 从接触领域驱动设计的初学阶段&#xff0c;到实现一个旧系统改造到DDD模型&#xff0c;再到按DDD规范落地的3个的项目。对于领域驱动模型设计研发&#xff0c;从开始的各种疑惑到吸收各种先进的理念&#xff0c;目前在技术实施这一块已经基本比较成熟。在既往经验中总…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...