DRF之视图集

【 一 】视图集

​ 在 RESTful 架构中,对资源的常规操作无非就是查询、新增、修改、删除等这么几种。为此,django-rest-framework 分别提供了对应通用类视图函数。但是,如果对同一个资源的不同操作逻辑分散在各个视图函数中,从逻辑上来说不太合理,实际中管理起来也不是很方便,还会产生很多重复性的代码。因此,django-rest-framework 引入了视图集(Viewsets),把对同一个资源的不同操作,集中到一个类中。同样的,针对 Web 开发中的常见逻辑,django-rest-framework 也提供了通用视图集,进一步简化开发工作。

​ 使用视图集的一个更大的好处,就是可以配合 django-rest-framework 提供的路由器(router),自动生成 API 的 URL,不需要我们再手工将 URL 模式和视图函数绑定了。所以大部分情况下,即使对资源只有一种操作,我们一般也会使用视图集。

  • ModelViewSet # 5个接口—>路由写法:映射,自动生成
  • ReadOnlyModelViewSet, # 只读2个接口
  • ViewSet # ViewSetMixin+APIView
  • GenericViewSet # ViewSetMixin + GenericAPIView
  • ViewSetMixin # 路由写法变了

【1】使用方法

  • 人话就是可以简化我们的代码

  • 5个接口,都写—》通过一个视图类实现

# urls.py
from django.urls import path
from one.views import BookView urlpatterns = [path('books/', BookView.as_view({'get': 'list', 'post': 'create'})),path('books/<int:pk>/', BookView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),]# views.py
# 视图集 ModelViewSet
from rest_framework.viewsets import ModelViewSet
from one.models import Book
from one.serial import BookSerializerclass BookView(ModelViewSet):# 拿到所有的数据 (拿多条数据)# 查询所有和新增一条接口queryset = Book.objects.all()# 序列化类serializer_class = BookSerializer# 序列化类from rest_framework import serializers
from one.models import Book#
class BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = '__all__'

【2】返回响应格式

class BookView(ModelViewSet):# 查询所有和新增一条接口queryset = Book.objects.all()serializer_class = BookSerializer# 查询单个数据def retrieve(self, request, *args, **kwargs):res = super().retrieve(request, *args, **kwargs)print(res)# 从res中取出响应体内容---》res.datareturn Response({'code': 100, 'msg': '查询单条成功', 'result': res.data})# 子序列化版本def update(self, request, *args, **kwargs):# UpdateModelMixin(更改) updateres = super().update(request, *args, **kwargs)# 从res中取出响应体内容---》res.datareturn Response({'code': 100, 'msg': '更改成功', 'result': res.data})def destroy(self, request, *args, **kwargs):# DestroyModelMixin(删除) destroyres = super().destroy(request, *args, **kwargs)# 从res中取出响应体内容---》res.datareturn Response({'code': 100, 'msg': '删除成功', 'result': res.data})def create(self, request, *args, **kwargs):# CreateModelMixin(添加) destroyres = super().create(request, *args, **kwargs)# 从res中取出响应体内容---》res.datareturn Response({'code': 100, 'msg': '成功', 'result': res.data})

当然视图集不会就是怎么简单

  • ModelViewSet:结合了 CRUD 操作的实现,适用于操作 Django ORM 模型。
  • ReadOnlyModelViewSet:只提供读取操作的视图集,不包括创建、更新和删除操作。
  • GenericViewSet:结合了 GenericAPIView 和 mixin 类,适用于定制化的视图逻辑,不依赖于特定的数据源。
  • ReadOnlyViewSet:提供只读操作的视图集,类似于 ReadOnlyModelViewSet,但不依赖于特定的数据源。
  • ViewSet:最基本的视图集,不包含任何 CRUD 操作的实现,通常用于定制化的视图逻辑。

【3】自动生成路由SimpleRouter

我这个要实现的功能是

# 1导入一个路由类
# 2 实例化得到对象
# 3 执行对象的方法
# 4 对象.属性 拿到值
# urls.py
from django.urls import path, include
from one.views import ReqsuetView, BookView,PublishView
# 自动生成路由
from rest_framework.routers import SimpleRouter
# 2 实例化得到对象
router=SimpleRouter()
# 3 执行对象的方法    BookView
router.register('books',BookView,'books')
# 4 对象.属性 拿到值
print(router.urls)
urlpatterns = [path('request/', ReqsuetView.as_view()),]
# 5 把自动生成的路由,放到 urlpatterns中
urlpatterns+=router.urls
from rest_framework.viewsets import ModelViewSet
from one.models import Book
from one.serial import BookSerializerclass BookView(ModelViewSet):# 拿到所有的数据 (拿多条数据)# 查询所有和新增一条接口queryset = Book.objects.all()# 序列化类serializer_class = BookSerializer

【4】SimpleRouter和DefaultRouter的区别

SimpleRouterDefaultRouter 是 Django REST Framework 中两个常用的路由器类,它们用于自动生成 API URL 配置。它们之间的主要区别在于生成的 URL 配置和可用的操作。

  1. SimpleRouter

    • SimpleRouter 是一个简单的路由器,它为每个视图集提供默认的 URL 配置,包括列表视图、创建视图、详情视图、更新视图和删除视图。

    • 默认情况下,

      SimpleRouter
      

      会为每个视图集生成以下 URL 配置:

      • GET(列表)、POST(创建):/<resource>/
      • GET(详情)、PUT(更新)、DELETE(删除):/<resource>/<pk>/
    • 这种简单的 URL 配置适用于大多数基本的 CRUD(创建、读取、更新、删除)操作。

  2. DefaultRouter

    • DefaultRouter 提供了与 SimpleRouter 类似的默认 URL 配置,但还额外提供了一个根视图(Root View)和一个 API 登录视图(API Login View)。

    • 根视图是一个包含所有可用 API 路由链接的视图,它可以帮助用户发现 API 中可用的端点。

    • API 登录视图提供了一个标准的登录视图,用于用户身份验证和获取访问 API 的权限。

    • 默认情况下,

      DefaultRouter
      

      会为每个视图集生成与

      SimpleRouter
      

      相同的 URL 配置,另外还会生成以下两个 URL 配置:

      • 根视图:/
      • API 登录视图:/api-auth/

​ 总的来说,SimpleRouter 更加轻量级和简单,适用于简单的 API,而 DefaultRouter 提供了额外的功能,如根视图和 API 登录视图,适用于更复杂的 API 项目。选择使用哪个取决于你的项目需求以及是否需要这些额外的功能。

【5】DefaultRouter

  • # 使用action装饰器定制详细路由

# urls.py
from django.urls import path, include
from one.views import ReqsuetView, BookView,PublishView
# 自动生成路由
from rest_framework.routers import SimpleRouter
# 2 实例化得到对象
router=SimpleRouter()
# 3 执行对象的方法    BookView
router.register('books',BookView,'books')
# 4 对象.属性 拿到值
print(router.urls)
urlpatterns = [path('request/', ReqsuetView.as_view()),path('publish/', PublishView.as_view({'get': 'login'})),
]
# 5 把自动生成的路由,放到 urlpatterns中
urlpatterns+=router.urls

http://127.0.0.1:8080/one/publish/

from rest_framework.viewsets import ModelViewSet
from one.models import Book
from one.serial import BookSerializerclass BookView(ModelViewSet):# 拿到所有的数据 (拿多条数据)# 查询所有和新增一条接口# 数据记者: 所有要序列化的数据queryset = Book.objects.all()# 完成序列化serializer_class = BookSerializer# 使用action装饰器定制详细路由
from rest_framework.decorators import action
from rest_framework.viewsets import ViewSetMixin
class PublishView(ViewSetMixin, GenericAPIView):# get请求执行它  http://127.0.0.1:8080/one/publish/@action(methods=['GET'], detail=False)def login(self, request):return Response('你妈死了')

image-20240415231541450

【6】登陆注册接口的实现

  • 序列化类

class SileBookSerializer(serializers.ModelSerializer):class Meta:model = Userfields = ['id','name']class UserSerializer(serializers.ModelSerializer):class Meta:model = Userfields = ['username','password']extra_kwargs = {# 确保密码只在创建时输入,而不是在序列化输出中显示'password':{'write_only':True}}def create(self,validated_data):user = User.objects.create(**validated_data)return userdef update(self, instance, validated_data):instance.username = validated_data.get('username', instance.username)password = validated_data.get('password')if password:# 如果提供了新密码,则更新密码instance.set_password(password)instance.save()return instance
  • views.py

from rest_framework.decorators import action
from rest_framework.viewsets import ViewSet
from two.serial import BookSerializer, SileBookSerializer,UserSerializer
from rest_framework.response import Response
from two.models import Book2, User, UserToken
import uuidclass UsersViews(ViewSet):@action(methods=['GET'], detail=False)# http://127.0.0.1:8200/two/users/login/def login(self, request):# 用户名、密码 ---> request.datausername = request.data.get('username')password = request.data.get('password')user = User.objects.filter(username=username,password=password).first()if user:token = str(uuid.uuid4())UserToken.objects.update_or_create(defaults={'token': token}, user=user)print(token)# 登录成功 --> 生成随机字符串: token---> 存到UserToken表中return Response({'code': 200, 'msg': '登录成功', 'token': token})else:return Response({'code': 404, 'msg': '用户名或者密码错误!!!'})@action(methods=['POST'], detail=False)#http://127.0.0.1:8200/two/users/register/@action(methods=['POST','PUT'], detail=False)def register(self, request):serializer = UserSerializer(data=request.data)if serializer.is_valid():username = serializer.validated_data.get('username')if User.objects.filter(username=username).exists():return Response({'code': 403, 'msg': '用户已存在', 'res': serializer.data})else:serializer.save()return Response({'code': 200, 'msg': '注册成功', 'res': serializer.data})else:return Response({'code': 404, 'msg': '注册失败', 'res': serializer.errors})
  • urls.py

from two.views import BookView, PublishView, Userview ,UsersViews # ,BookDetailView
# 自动生成路由
from rest_framework.routers import SimpleRouter, DefaultRouter
from django.urls import path,include
# 2 实例化得到对象
# router = SimpleRouter()
router = DefaultRouter()
# 3 执行对象的方法
# 这个方法就是自动帮我们生成映射  {'get': 'list', 'post': 'create'}
router.register('user', Userview, 'user')router.register('users', UsersViews, 'users')
# router.register('books', BookView, 'books')# 4 对象.属性 拿到值
print(router.urls)# [<URLPattern '^books/$' [name='books-list']>, <URLPattern '^books/(?P<pk>[^/.]+)/$' [name='books-detail']>]
urlpatterns = [# path('request/', ReqsuetView.as_view()),#  什么是映射下面这种就是path('publish/', PublishView.as_view({'get': 'login'})),# 前面可以再加前缀path('api/v1/',include(router.urls))
]
# 5 把自动生成的路由,放到 urlpatterns中
urlpatterns += router.urls

image-20240416210336845

image-20240416210551929

【7】修改密码接口

  • 这里有个前提条件了
  • 我这里要实现是密文校验的密码修改
  • 就需要继承超级管理员的表中的数据
准备工作
  • 序列化类

  • create_user这个就是我们要用到超级管理员表中数据进行加密的作用了
    
  •     def create(self,validated_data):# 加密密码user = Usersuper.objects.create_user(**validated_data)return user
    
from rest_framework import serializers
from one.models import Book
from .models import Book2,Usersuper,UserToken#
class BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = '__all__'class SileBookSerializer(serializers.ModelSerializer):class Meta:model = Usersuperfields = ['id','name']class UserSerializer(serializers.ModelSerializer):# 添加 mobile 字段mobile = serializers.CharField(required=False)class Meta:model = Usersuperfields = ['username','password','mobile']extra_kwargs = {# 确保密码只在创建时输入,而不是在序列化输出中显示'password':{'write_only':True}}def create(self,validated_data):# 加密密码user = Usersuper.objects.create_user(**validated_data)return userclass PutSerializer(serializers.Serializer):old_password = serializers.CharField(required=True)new_password = serializers.CharField(required=True)
  • models.py


from django.db import models
from django.contrib.auth.models import User, AbstractUserclass Usersuper(AbstractUser):'''如果继承了AbstractUser那么在执行数据库迁移命令的时候,auth_user表就不会被创建而 UserInfo 会在 auth_user表 的基础上添加自定义扩展的字段优点:直接通过自己定义的表快速完成操作及扩展前提(1)在执行之前没有执行过数据库迁移命令auth_user 表没有被创建如果当前库已经被创建,则需要更换新的库(2)继承的表里面不要覆盖 AbstractUser 里面的字段名表里面有的字段不要动,只扩展额外的字段即可(3)需要再配置文件中声明Django要使用 UserInfo 替代 auth_userAUTH_USER_MODEL = 'app01.UserInfo'  ---'应用名.表名''''phone = models.CharField(max_length=32)class Book2(models.Model):name = models.CharField(max_length=88)price = models.IntegerField()publish = models.CharField(max_length=66)class UserToken(models.Model):token = models.CharField(max_length=255)# 一对一关系   UserToken是一 User是一user = models.OneToOneField(to=Usersuper,on_delete=models.CASCADE)

注意要在配置文件中设置

# AUTH_USER_MODEL = 'two.Usersuper'
应用软件.表名
  • urls.py

这里要导入

from django.contrib.auth.hashers import check_password,make_password
import uuid
'''
check_password(password, encoded):这个函数用于检查用户输入的密码是否与存储在数据库中的哈希密码匹配。它接受两个参数,第一个参数是用户输入的明文密码,第二个参数是存储在数据库中的密码的哈希值。如果密码匹配,返回 True,否则返回 False。make_password(password, salt=None, hasher='default'):这个函数用于对密码进行哈希加密。它接受三个参数,第一个参数是要加密的密码明文,第二个参数是一个可选的盐值(默认为 None,Django 会自动生成盐值),第三个参数是哈希算法(默认为 'default',即使用 PBKDF2 算法)。函数返回一个哈希后的密码字符串。'''
  • 登陆接口

class UsersViews(ViewSet):# permission_classes = [IsAuthenticated]@action(methods=['GET'], detail=False)def login(self, request):# 用户名、密码 ---> request.datausername = request.data.get('username')password = request.data.get('password')user = Usersuper.objects.get(username=username)print(user)print(password)if check_password(password, user.password):  # 检查用户输入的密码是否与数据库中存储的密码匹配print(password)print(user.password)token = str(uuid.uuid4())UserToken.objects.update_or_create(defaults={'token': token}, user=user)print(token)# 登录成功 --> 生成随机字符串: token---> 存到UserToken表中return Response({'code': 200, 'msg': '登录成功', 'token': token})else:return Response({'code': 404, 'msg': '用户名或者密码错误!!!'})

  • 注册接口

    @action(methods=['POST', 'PUT'], detail=False)def register(self, request):serializer = UserSerializer(data=request.data)if serializer.is_valid():username = serializer.validated_data.get('username')print(username)if Usersuper.objects.filter(username=username).exists():return Response({'code': 403, 'msg': '用户已存在', 'res': serializer.data})else:serializer.save()return Response({'code': 200, 'msg': '注册成功', 'res': serializer.data})else:return Response({'code': 404, 'msg': '注册失败', 'res': serializer.errors})
  • make_password(加密的密码明文) 修改密码接口

    @action(methods=['PUT'], detail=False)def change_password(self, request, *args, **kwargs):username = request.data.get('username')old_password = request.data.get('old_password')new_password = request.data.get('new_password')print(username)# 验证用户身份user = Usersuper.objects.filter(username=username).first()if not user:return Response({'code': 404, 'msg': '用户不存在'})print(old_password)print(new_password)print(user.password)# 检查旧密码是否正确if not check_password(old_password, user.password):return Response({'code': 403, 'msg': '旧密码错误'})# 保存密码# make_password(加密的密码明文)user.password = make_password(new_password)user.save()return Response({'code': 200, 'msg': '密码已成功更新'})

image-20240416233359911

【 二 】视图结构的用法和继承关系

19

  • 2个视图基类,5个视图扩展类,9个视图子类和视图集

【1】视图基类:

  1. APIView:这是 Django REST Framework 中最基本的视图类之一,它提供了最基本的请求处理方法,并且不依赖于任何特定的数据源或模型。
  2. GenericAPIView:这是一个更高级的基类,结合了 APIView 和一些 mixin 类,提供了对常见 CRUD 操作的支持,通常用于与 Django ORM 或其他数据源交互。

【2】视图扩展类(Mixin 类):

  1. CreateModelMixin:提供创建资源的功能,通常用于 POST 请求。
  2. RetrieveModelMixin:提供检索单个资源的功能,通常用于 GET 请求。
  3. DestroyModelMixin:提供删除资源的功能,通常用于 DELETE 请求。
  4. ListModelMixin:提供列举资源列表的功能,通常用于 GET 请求。
  5. UpdateModelMixin:提供更新资源的功能,通常用于 PUT 或 PATCH 请求。

【3】视图子类:

  1. ListAPIView:继承自 GenericAPIView 和 ListModelMixin,用于展示列表数据。
  2. RetrieveAPIView:继承自 GenericAPIView 和 RetrieveModelMixin,用于检索单个数据。
  3. CreateAPIView:继承自 GenericAPIView 和 CreateModelMixin,用于创建新的数据。
  4. DestroyAPIView:继承自 GenericAPIView 和 DestroyModelMixin,用于删除数据。
  5. UpdateAPIView:继承自 GenericAPIView 和 UpdateModelMixin,用于更新数据。
  6. RetrieveUpdateAPIView:继承自 GenericAPIView、RetrieveModelMixin 和 UpdateModelMixin,用于检索和更新数据。
  7. RetrieveDestroyAPIView:继承自 GenericAPIView、RetrieveModelMixin 和 DestroyModelMixin,用于检索和删除数据。
  8. ListCreateAPIView:继承自 GenericAPIView、ListModelMixin 和 CreateModelMixin,用于列举和创建数据。
  9. RetrieveUpdateDestroyAPIView:继承自 GenericAPIView、RetrieveModelMixin、UpdateModelMixin 和 DestroyModelMixin,用于检索、更新和删除数据。

【4】视图集(ViewSets):

ModelViewSet:结合了 CRUD 操作的实现,适用于操作 Django ORM 模型。

class ModelViewSet(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet):"""A viewset that provides default `create()`, `retrieve()`, `update()`,`partial_update()`, `destroy()` and `list()` actions."""'''提供默认 'create()', 'retrieve()', 'update()' 的视图集,'partial_update()'、'destroy()' 和 'list()' 操作'''pass

ReadOnlyModelViewSet*:只提供读取操作的视图集,不包括创建、更新和删除操作。

class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,mixins.ListModelMixin,GenericViewSet):"""A viewset that provides default `list()` and `retrieve()` actions."""pass

GenericViewSet:结合了 GenericAPIView 和 mixin 类,适用于定制化的视图逻辑,不依赖于特定的数据源。

class GenericViewSet(ViewSetMixin, generics.GenericAPIView):"""The GenericViewSet class does not provide any actions by default,but does include the base set of generic view behavior, such asthe `get_object` and `get_queryset` methods."""pass

ReadOnlyViewSet:提供只读操作的视图集,类似于 ReadOnlyModelViewSet,但不依赖于特定的数据源。


ViewSet:最基本的视图集,不包含任何 CRUD 操作的实现,通常用于定制化的视图逻辑。

class ViewSet(ViewSetMixin, views.APIView):"""The base ViewSet class does not provide any actions by default.这里的意思就是ViewSet这里不提供任何的默认操作"""pass

【5】继承关系:

  • APIViewGenericAPIView 是其他视图类的基类。
  • GenericAPIView 结合了 GenericAPIView 和 mixin 类,提供了更多功能。
  • 大多数视图子类都是通过组合 GenericAPIView 和 mixin 类来实现特定功能的。

【6】属性和方法:

  • queryset:表示要操作的数据集。
  • serializer_class:用于序列化和反序列化数据的序列化器类。
  • get_queryset():获取要操作的数据集。
  • get_serializer_class():获取要使用的序列化器类。
  • perform_create():执行创建资源的操作。
  • perform_update():执行更新资源的操作。
  • perform_destroy():执行删除资源的操作。
  • list():列举资源列表。
  • retrieve():检索单个资源。
  • create():创建新的资源。
  • destroy():删除资源。
  • update():更新资源。

接口实现:

编写视图的步骤通常包括定义视图类,设置相关属性(如 querysetserializer_class 等),并根据需求重写相应的方法(如 get_queryset()perform_create() 等)来实现对应的接口功能。例如:

from rest_framework.generics import ListAPIView
from .models import Book
from .serializers import BookSerializerclass BookListView(ListAPIView):queryset = Book.objects.all()serializer_class = BookSerializer

​ 这个例子定义了一个 BookListView 类,继承自 ListAPIView,用于展示书籍列表数据。queryset 设置为查询所有书籍对象,serializer_class 设置为书籍序列化器。这样,视图就能够正确地展示书籍列表数据了。

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

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

相关文章

C++STL细节,底层实现,面试题04

文章目录 19. STL19.1. 序列容器19.1.1. vector19.1.1.1. 底层实现和特点19.1.1.2. 常用函数19.1.1.3. emplace_back() vs push_back() 19.1.2. array19.1.2.1. 底层实现和特点19.1.2.2. 常用函数 19.1.3. deque19.1.3.1. 底层实现和特点19.1.3.2. 常用函数 19.1.4 list19.1.4.…

性能远超GPT-4!谷歌发布Med-Gemini医疗模型;李飞飞首次创业瞄准空间智能;疫苗巨头联合OpenAl助力AI医疗...

AI for Science 企业动态速览—— * 谷歌 Med-Gemini 医疗 AI 模型性能远超 GPT-4 * 斯坦福李飞飞首次创业瞄准「空间智能」 * 疫苗巨头 Moderna 与 OpenAl 达成合作 * 美国能源部推动 AI 在清洁能源领域的应用 * 美年健康荣获「2024福布斯中国人工智能创新场景应用企业TOP10」…

2024-5-9

今日流水账&#xff1a; 上午&#xff1a;又睡懒觉了&#xff0c;9点半才起来… 还是在调之前的那个 kernel pwn&#xff0c;但是 CONFIG_SLAB_FREELIST_HARDENED 加固泄漏 cookie 哪里我还是没搞明白&#xff08;&#xff1a;服了然后去理发、冲水卡了&#xff08;&#xff1a…

Centos 7.9如何使用源码编译安装curl最新版本

文章目录 1、前言2、curl源代码下载3、openssl安装4、编译curl4.1、配置编译环境4.2、编译输出二进制curl程序4.3、安装编译后的curl4.4、编译完成检查4.5、验证安装 1、前言 Centos 7.9&#xff0c;由于系统为2017年发行&#xff0c;且以稳定性为主&#xff0c;部分工具版本较…

吴恩达机器学习笔记:第 9 周-17大规模机器学习(Large Scale Machine Learning)17.3-17.4

目录 第 9 周 17、 大规模机器学习(Large Scale Machine Learning)17.3 小批量梯度下降17.4 随机梯度下降收敛 第 9 周 17、 大规模机器学习(Large Scale Machine Learning) 17.3 小批量梯度下降 小批量梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法&…

Docker Desktop 修改容器的自启动设置

Docker Desktop 允许用户控制容器的自启动行为。如果你不希望某个容器在 Docker 启动时自动启动&#xff0c;你可以通过以下步骤来更改设置&#xff1a; 1. 打开 Docker Desktop 应用。 2. 点击右上角的设置&#xff08;Settings&#xff09;按钮&#xff0c;或者使用快捷键 Cm…

2024数维杯数学建模A题B题C题思路+模型+代码(开赛后第一时间更新)

2024数维杯数学建模A题B题C题思路模型代码&#xff08;开赛后第一时间更新&#xff09; https://mbd.pub/o/bread/ZpWakpdq https://mbd.pub/o/bread/ZpWakpdq 2024年第九届数维杯大学生数学建模挑战赛参赛规则 竞赛要求及论文提交方式; ①本次参赛作品统一在线提交到竞赛…

如何进行资产梳理(信息收集)

前言 渗透测试流程 线路一:渗透测试人员 1.域名收集--(备案收集) 1.1在线收集子域名 1.1.1 站长之家 1.1.2 IP138网站 1.1.3 查子域 1.1.4 RapidDNS 1.1.5 聚名 1.1.6 Crt.sh 1.1.7 googleHack 1.2工具和资产测绘收集子域名 1.2.1 oneforall(最好用,最全面) 1.2.…

内网安全-隧道技术SSHDNSICMPSMB上线通讯LinuxMac 简单总结

第126天&#xff1a;内网安全-隧道技术&SSH&DNS&ICMP&SMB&上线通讯Linux&Mac_内网安全-隧道技术_ssh_dns_icmp_smb_上线通讯linux_mac-CSDN博客 内网渗透—隧道技术_隧道技术csdn-CSDN博客 #SMB 隧道&通讯&上线 判断&#xff1a;445 通讯 上…

Spark云计算平台Databricks使用,创建workspace和Compute计算集群(Spark集群)

Databricks&#xff0c;是属于 Spark 的商业化公司&#xff0c;由美国加州大学伯克利 AMP 实验室的 Spark 大数据处理系统多位创始人联合创立。Databricks 致力于提供基于 Spark 的云服务&#xff0c;可用于数据集成&#xff0c;数据管道等任务。 1 创建workspace 点击创建wor…

YOLOv9改进策略 :一种新颖的通用倒瓶颈(UIB)搜索块助力检测| 轻量化之王MobileNetV4

💡💡💡创新点:轻量化之王MobileNetV4 开源 | Top-1 精度 87%,手机推理速度 3.8ms,原地起飞! 最主要创新:引入了通用倒瓶颈(UIB)搜索块,这是一个统一且灵活的结构,它融合了倒瓶颈(IB)、ConvNext、前馈网络(FFN)以及一种新颖的额外深度可分(ExtraDW)变体技…

【JavaWeb】网上蛋糕商城后台-客户管理

概念 上文中已讲解和实现了后台管理系统中的订单管理功能&#xff0c;本文讲解客户信息管理功能。 客户信息列表 在后台管理系统的head.jsp头部页面中点击“客户管理”向服务器发送请求 在servlet包中创建AdminUserListServlet类接收浏览器的请求 package servlet;import m…

totoriseSVN 常见问题

1. SVN 无法 clean up 上传时没有关闭 Excel&#xff0c;导致传入了一些临时文件&#xff08;文件名以$开头&#xff09;&#xff0c;关闭文件后临时文件自动删除&#xff0c;导致 SVN 版本错乱&#xff0c;使用 CleanUp 功能无效 更新时提示【Previous operation has not fin…

【Java探索之旅】super 子类构造 掌握

文章目录 &#x1f4d1;前言一、继承1.1 super1.2 子类的构造方法1.3 super与this的区别 &#x1f324;️全篇总结 &#x1f4d1;前言 继承作为面向对象编程中的重要概念&#xff0c;为我们提供了一种强大的代码复用和扩展机制。在Java中&#xff0c;通过继承可以实现子类对父类…

大数据毕业设计Python+Django地铁客流量预测 时间序列 深度学习 机器学习 人工智能 Python爬虫 计算机毕业设计

​ 博主介绍&#xff1a;全网粉丝100W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路 西安工程大学本科毕业设计&#xff…

C++中的std::bind深入剖析

目录 1.概要 2.原理 3.源码分析 3.1._Binder分析 3.2._CALL_BINDER的实现 4.总结 1.概要 std::bind是C11 中的一个函数模板&#xff0c;用于创建一个可调用对象&#xff08;函数对象或者函数指针&#xff09;的绑定副本&#xff0c;其中一部分参数被固定为指定值&#xf…

Visual Studio编译QT工程

1、安装QT 2、安装VS 3、选择扩展和更新 4、搜索Qt Visual Studio Tools&#xff0c;安装或卸载 5、安装成功后工具栏显示Qt VS Tools 6、配置Qt VS Tools&#xff1a;打开Qt VS Tools的下拉菜单&#xff0c;选择Qt Versions 7、选择qt qmake.exe 的路径

汽车行业芯片 车规级芯片 单车芯片( soc mcu)数量

链接&#xff1a;https://xueqiu.com/3000217281/272114755 10大车规级MCU芯片10大车规级MCU芯片 汽车芯片是什么&#xff1f; 汽车芯片即车规级芯片&#xff0c;标准要高于工业级和民用级芯片&#xff0c;仅次于军工级芯片。芯片大概有以下四种级别&#xff0c;分别是军工级…

猿匹配,一款使用环信实现的一个开源聊天应用含服务器

前言 之前写了一篇Android开发集成聊天环信SDK3.x简单开始&#xff0c;然后最近得空开发了一款使用环信实现的实时聊天应用&#xff0c;包含简单的服务器端&#xff0c;并开源给大家&#xff0c;有兴趣的同学可以一起搞一下&#xff0c;详细介绍看下边吧 上代码 服务器&#…

Java基于Spring Boot框架的校园外卖服务系统设计与实现(附源码,说明文档)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…