s001网站建设/平台运营推广
前言
自定义用户模型在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_user 和 create_superuser 方法,允许根据特定需求创建用户对象。 | 提供 create_user 和 create_superuser 方法,用于创建普通用户和超级用户,但可能不够灵活以满足特定需求。 |
默认值设置 | 允许设置特定的默认值,如 is_active 和 is_superuser ,以确保创建的用户对象具有所需属性。 | 提供一组默认值,通常创建的用户是活动的和非超级用户,可能需要进一步修改属性。 |
私有方法 | 包含 _create_user 方法,它是私有的,不直接暴露给外部调用,而是通过公共方法 create_user 和 create_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 ,表示用户不是超级用户。需要在用户创建时手动设置为 True 。 | is_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 - 这是一个抽象用户模型。 |
继承关系 | 继承自 AbstractBaseUser 和 PermissionsMixin ,具备身份认证和权限管理的功能。 |
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 参数 | 用于判断用户对象是否是新创建的,如果 created 为 True ,表示用户是新创建的。 |
- 密码加密 | 在处理函数中,从用户实例中获取明文密码,然后使用 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】比较器和堆
系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考…...

【计算机组成与设计】Chisel取指和指令译码设计
本次试验分为三个部分: 目录 设计译码电路 设计寄存器文件 实现一个32个字的指令存储器 设计译码电路 输入位32bit的一个机器字,按照课本MIPS 指令格式,完成add、sub、lw、sw指令译码,其他指令一律译码成nop指令。输入信号名…...

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

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

el-select多选以tag展示时,超过显示长度以...省略号显示,且在一行展示
效果: 代码: <span>系统词典维度:</span><el-selectv-model"dNum"placeholder"请选择"multiplecollapse-tags //设置collapse-tags属性将它们合并为一段文字size"small"style"width:160p…...

计算机网络第4章-通用转发和SDN
引子: 在前面,我们将基于目的地转发的特征总结为两个步骤: 查找目的IP地址(匹配),然后将分组发送到有特定输出端口的交换结构(“动作”)。 但是这种转发特征会带来许多问题&#…...

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

MySQL 案例:update set 和 and 的坑
问题描述 最近碰到到一个奇怪的问题,update 语句执行没有报错,但是没有更新数据,具体有问题的语句类似于如下形式: update test.stu set cname 0 and math 90 and his 80 where id 100; 复制 原因分析 直观上看ÿ…...

VSCode remote-ssh 连接远端服务器失败
系统 Mac os Intel处理器 描述 该问题在上午时还没有,下午突然毫无征兆的发生,当时没有更新vscode,没有更新插件。 分析 网上对于该问题的答案多是说磁盘空间不够vscode不能下载相应插件,我所遇到的并不是这种情况。报的错误多是…...

通达信动量线MTM指标原理详解及MTM底背离选股公式
MTM指标(动量线指标)用于衡量价格的动量和趋势,以判断未来价格的变化。计算方法很简单,用当前价格减去一段时间(通常为12日)前的价格,计算得到的差值的正负和大小,可以判断可能的趋势…...

汇编-DUP操作符
DUP操作符使用整数表达式作为计数器, 为多个数据项分配存储空间。 在为字符串或数组分配存储空间时,这个操作符尤其有用,并且可以使用初始化或非初始化数据: .data BYTE 20 DUP(0) ;20个字节,都等于0 BYTE 20 …...

2311C++抽象工厂
1,为啥需要工厂设计模式?工厂设计模式可解决什么问题? 先看一下示例,多态示例. #include <iostream> using namespace std; class Shape { public:Shape() { }virtual void drawShape(){cout << "base draw shape" << endl;} }; class Rectang…...

Lavarel定时任务的使用
系统为window 执行命令(执行一次命令只会根据当前时间运行一次定时任务) php artisan schedule:run创建一个任务类(在Jobs文件夹下面) <?phpnamespace App\Jobs;use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contract…...

Java开发者的网络安全指南(二)
目录 一、加密和数据保护 二、身份验证和授权 三、Web应用程序安全 四、安全编码实践 五、网络防火墙和入侵检测系统 六、日志和监视 七、漏洞管理 八、安全教育和培训 九、结论 介绍: 简要说明网络安全的重要性和为什么Java开发者需要关注它。 一、加密…...

Python基础学习016__UnitTest
# UnitTest是python自带的一个单元测试框架,不需要额外安装 # 也是自动化脚本执行框架,使用UnitTest来管理,运行多个框架 # 为什么使用:能够组织多个用例去执行.提供了丰富的断言方法,能够生成测试报告 # 核心要素: # Testcase:测试用例:这个测试用例是UnitTest的组成部分,不是…...

一物一码需求,标签制作功能轻松解决
许多行业存在为人员、物品、设备等做一物一码标签的需求,可使用草料标签制作功能。直接选择标签样式,填入数据,即可批量生成标签,还可批量排版,更易落地。还可保存标签样式,后续多次复用样式,批…...

【Linux】七、基础IO
预备知识 文件 属性(本质上也是数据)内容; 文件的所有操作大致有两种,对内容的操作,和对属性的操作; 文件在磁盘中放置,磁盘是硬件,只有操作系统可以真正的访问磁盘;C\C…...