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 BookSerializer


class 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 = Book
        fields = '__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.data
        return Response({'code': 100, 'msg': '查询单条成功', 'result': res.data})

    # 子序列化版本
    def update(self, request, *args, **kwargs):
        # UpdateModelMixin(更改) update
        res = super().update(request, *args, **kwargs)
        # 从res中取出响应体内容---》res.data
        return Response({'code': 100, 'msg': '更改成功', 'result': res.data})

    def destroy(self, request, *args, **kwargs):
        # DestroyModelMixin(删除) destroy
        res = super().destroy(request, *args, **kwargs)
        # 从res中取出响应体内容---》res.data
        return Response({'code': 100, 'msg': '删除成功', 'result': res.data})

    def create(self, request, *args, **kwargs):
        # CreateModelMixin(添加) destroy
        res = super().create(request, *args, **kwargs)
        # 从res中取出响应体内容---》res.data
        return 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 BookSerializer


class 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 BookSerializer


class 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 = User
        fields = ['id','name']


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['username','password']
        extra_kwargs = {
            # 确保密码只在创建时输入,而不是在序列化输出中显示
            'password':{'write_only':True}
        }

    def create(self,validated_data):
        user = User.objects.create(**validated_data)
        return user

    def 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 uuid


class UsersViews(ViewSet):
    @action(methods=['GET'], detail=False)
 	# http://127.0.0.1:8200/two/users/login/
    def login(self, request):
        # 用户名、密码 ---> request.data
        username = 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 = Book
        fields = '__all__'



class SileBookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Usersuper
        fields = ['id','name']


class UserSerializer(serializers.ModelSerializer):
    # 添加 mobile 字段
    mobile = serializers.CharField(required=False)
    class Meta:
        model = Usersuper
        fields = ['username','password','mobile']
        extra_kwargs = {
            # 确保密码只在创建时输入,而不是在序列化输出中显示
            'password':{'write_only':True}
        }

    def create(self,validated_data):
        # 加密密码
        user = Usersuper.objects.create_user(**validated_data)
        return user

class 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, AbstractUser

class Usersuper(AbstractUser):
    '''
        如果继承了AbstractUser
        那么在执行数据库迁移命令的时候,auth_user表就不会被创建
        而 UserInfo 会在 auth_user表 的基础上添加自定义扩展的字段

        优点:
            直接通过自己定义的表快速完成操作及扩展

        前提
            (1)在执行之前没有执行过数据库迁移命令
                auth_user 表没有被创建
                如果当前库已经被创建,则需要更换新的库
            (2)继承的表里面不要覆盖 AbstractUser 里面的字段名
                表里面有的字段不要动,只扩展额外的字段即可
            (3)需要再配置文件中声明Django要使用 UserInfo 替代 auth_user
                AUTH_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.data
        username = 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 as
    the `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 BookSerializer

class BookListView(ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI地名故事:鸦岗村

鸦岗村&#xff0c;位于广州市白云区石井镇&#xff0c;是一个历史悠久、文化底蕴深厚的村落。据《广州地名志》记载&#xff0c;南宋时期&#xff0c;南雄珠玑巷的凌氏家族迁移至此地&#xff0c;并在此建立村落。由于村子周边的山岗上常有乌鸦栖息&#xff0c;因此得名“鸦岗…

python接口测试之tokensession的处理

使用python语言来进行实现&#xff0c;在这里我们使用第三方的库requests&#xff0c;需要单独的安装下&#xff0c;安装的命令是&#xff1a; pip install -U requests 见安装的截图&#xff1a; 安装成功后&#xff0c;如果可以在正常的导入&#xff0c;说明安装OK&#xf…

基于springboot实现医药管理系统项目【项目源码+论文说明】

基于springboot实现医药管理系统演示 摘要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&…

嗨动PDF编辑器怎么对pdf修改?分享修改步骤

嗨动PDF编辑器怎么对pdf修改&#xff1f;PDF&#xff08;Portable Document Format&#xff09;格式因其跨平台、不易修改的特性&#xff0c;在日常工作和学习中得到了广泛的应用。然而&#xff0c;当需要对PDF文件进行修改时&#xff0c;许多人可能会感到困扰。此时&#xff0…

紫光展锐先进技术科普 | 工业互联网遇到5G,1+1>2?

随着工厂自动化的加速普及&#xff0c;如今我们可能经常看到这样的场景&#xff1a;在高温、潮湿、粉尘、腐蚀等恶劣环境作业场景&#xff0c;巡检机器人穿梭其中&#xff0c;工人们不必弯腰去搬沉重又危险的器件&#xff0c;而旁边会有一个个机械臂帮手平稳有序地完成好所有搬…

谷歌Google搜索广告开户流程与费用?

谷歌Google作为全球领先的搜索引擎&#xff0c;其广告平台——Google Ads&#xff0c;无疑是企业捕获潜在客户的黄金钥匙。想要在广阔的互联网海洋中精准航行&#xff0c;了解Google搜索广告的开户流程与费用至关重要。通过云衔科技的专业服务&#xff0c;让您的谷歌Google广告…

MPLS小实验

实验图&#xff1a; 实验要求&#xff1a; 要求使用MPLS技术&#xff0c;将实验通&#xff0c;并在实验结束后使用命令&#xff1a;tracert -v -a 看是否基于标签进行转发。 如上&#xff1a;在每台路由器上都有两个环回&#xff0c;一个用于模拟用户网段&#xff0c;一个用于M…

ubuntu CUDA 驱动更新,版本更新,多CUDA版本管理

1 新版本驱动下载 前面介绍过window CUDA驱动更新&#xff0c;但是对于ubuntu 的驱动更新&#xff0c;没有一键操作。 本人笔记本电脑n年前装的CUDA DRIVER仅支持到cuda10.2&#xff0c;实在无法满足这日新月异的科技更新。 左 旧的驱动版本 右 新下载的硬件支持的驱动版本&…

Zynq UltraScale+ MPSoC 配置存储器器件

Zynq UltraScale MPSoC 配置存储器器件 下表所示闪存器件支持通过 Vivado 软件对 Zynq UltraScale MPSoC 器件执行擦除、空白检查、编程和验证等配置操 作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 &#xff0c; 并支持通过 Vivado 软件对其中所列…

LLM应用-prompt提示:让大模型总结生成思维导图

第一步&#xff1a;大模型生成markdown思维导图格式 例如&#xff1a;kimi 总结pdf文档案例&#xff1a; 生成的markdown格式&#xff1a; # 知识图谱的构建及应用 ## 一、知识图谱的构建 ### 1. 数据采集 - 来源&#xff1a;结构化数据库、半结构化网页、非结构化文本 - 预处…

Cache基本原理--以TC3xx为例(1)

目录 1.为什么要使用Cache 2.Memory与Cache如何映射 2.1 地址映射概设 3.小结 为什么要使用Cache&#xff1f;为什么在多核工程里要谨慎使用DCache&#xff1f;Cache里的数据、指令是如何与Memory映射&#xff1f; 灵魂三连后&#xff0c;软件工程师应该都会有模糊的回答&…

Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明

Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明 目录 Python 机器学习 基础 之 监督学习 [ 核支持向量机 SVM ] 算法 的简单说明 一、简单介绍 二、监督学习 算法 说明前的 数据集 说明 三、监督学习 之 核支持向量机 1、线性模型与非线性特征 …

战网国际服下载教程 暴雪战网客户端一键下载安装教程分享

战网国际服务平台&#xff0c;又名Battle.net环球版&#xff0c;是暴雪娱乐操作的跨国界游戏交流平台&#xff0c;它消除了地域的隔阂&#xff0c;向全球范围内的游戏爱好者提供服务。与仅服务于特定地区的版本不同&#xff0c;国际版赋予了玩家自由穿梭于暴雪众多标志性游戏的…

python怎么安装matplotlib

1、登陆官方网址“https://pypi.org/project/matplotlib/#description”&#xff0c;下载安装包。 2、选择合适的安装包&#xff0c;下载下来。 3、将安装包放置到python交互命令窗口的当前目录下。 4、打开windows的命令行窗口&#xff0c;通过"pip install"这个命令…

一种快速提升文件传输速度的方法

在面对网络条件不理想时&#xff0c;进行文件传输往往会导致传输速率的显著下降。为了克服这一难题&#xff0c;镭速软件特别引入了一系列创新的设置选项&#xff0c;旨在显著提升文件传输速率。通过这些优化措施&#xff0c;用户即使在网络不佳的情况下&#xff0c;也能享受到…

尝试使用官方jailhouse-images仓库运行jailhouse

jailhouse 的官方 demo 演示仓库 Demo and testing images: https://github.com/siemens/jailhouse-images 通过jailhouse 的官方 demo 演示仓库&#xff0c;可以直接编译出带有部署有jailhouse程序的Linux镜像&#xff0c;有多个目标平台的Linux镜像可选&#xff0c;也有在qe…

优秀测试的核心能力!2招高效定位分析BUG!

之所以写这一篇文章&#xff0c;是突然想起来曾经在测试过程中被开发嘲讽过&#xff0c;事情是这样的&#xff0c;当时发现了一个疑似前端的Bug就草草提交到了禅道&#xff0c;结果刚来的女前端看到了就有点生气地问我为啥不查清到底是前后端问题就直接派给她前端了&#xff0c…

IT革新狂潮:引领未来的技术趋势

方向一&#xff1a;技术革新与行业应用 当前现状&#xff1a; 量子计算&#xff1a;量子计算的研究正在加速&#xff0c;尽管目前仍处于初级阶段&#xff0c;但其在药物研发、加密技术和材料科学等领域的应用潜力已被广泛认可。 虚拟现实&#xff08;VR&#xff09;与增强现实…

python之pyQt5实例:树莓派+MPU6050采集数据

1、安装必要的软件包&#xff1a; sudo apt-get update sudo apt-get install python3-smbus python3-dev i2c-tools sudo apt-get install python3-smbus 2、确认I2C接口已经启用&#xff1a; 运行 sudo raspi-config 命令打开Raspberry Pi配置工具。 在菜单中选择 "…

EFCore_创建项目

添加依赖 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Tools(Migration工具) 根据使用的DB添加对应依赖&#xff1a; SQL Server&#xff1a;Microsoft.EntityFrameworkCore.SqlServer 添加该依赖时可不添加Microsoft.EntityFrameworkCore&#xff0c;该依…