深入理解DRF中的Mixin类

news2024/11/24 20:13:27

DRF官网地址:

Home - Django REST framework

 Generic views - Django REST framework

一、Mixin类介绍

1.1 Mixin类介绍

Mixin类是一种常见的设计模式,在多个类之间共享功能或行为时非常有用。

一个Mixin类通常包含一组方法或属性,可以被其他类通过多重继承方式导入并使用这些方法或属性。通过将这些通用功能封装到Mixin类中,可以实现代码重用和模块化,同时保持类的单一责任原则。

在Django框架中,Mixin类广泛应用于视图、表单、模型等方面,用于添加或修改特定功能。类似地,在其他Python框架或代码中,也可以通过定义Mixin类来实现类似的目的。

1.2 使用Mixin类的示例

假设我们正在创建一个简单的电子商务网站,其中有不同类型的用户:普通用户(RegularUser)、会员用户(PremiumUser)和管理员用户(AdminUser)。我们想为每种用户类型提供一些特定功能。我们可以使用Mixin类来实现这个目标。

# 用户基类
class User:
    def __init__(self, username):
        self.username = username

    def get_username(self):
        return self.username


# Mixin类:普通用户功能
class RegularUserMixin:
    def add_to_cart(self, item):
        print(f"{self.get_username()} 添加 {item} 到购物车")

    def view_orders(self):
        print(f"{self.get_username()} 查看订单历史")


# Mixin类:会员用户功能
class PremiumUserMixin:
    def apply_discount(self, amount):
        print(f"{self.get_username()} 应用折扣:{amount}%")

    def access_premium_content(self):
        print(f"{self.get_username()} 访问高级内容")


# Mixin类:管理员用户功能
class AdminUserMixin:
    def delete_user(self, user):
        print(f"{self.get_username()} 删除用户:{user}")


# 普通用户
class RegularUser(User, RegularUserMixin):
    pass


# 会员用户
class PremiumUser(User, PremiumUserMixin):
    pass


# 管理员用户
class AdminUser(User, AdminUserMixin):
    pass


# 创建用户并使用功能
regular_user = RegularUser("Alice")
regular_user.add_to_cart("商品A")
regular_user.view_orders()

premium_user = PremiumUser("Bob")
premium_user.apply_discount(15)
premium_user.access_premium_content()

admin_user = AdminUser("Admin")
admin_user.delete_user("Alice")

在上面的示例中,我们定义了3个Mixin类:RegularUserMixin、PremiumUserMixin和AdminUserMixin,分别包含了普通用户、会员用户和管理员用户特定的功能。然后,我们通过多重继承,将这些Mixin类与相应的用户基类(User)结合起来创建了具体的用户类:RegularUser、PremiumUser和AdminUser。

通过使用Mixin类,我们可以将不同类型用户的特定功能模块化,并继承到相应的用户类中。这样,不同类型的用户就可以共享通用的用户属性,同时也可以各自访问自己特定的功能。

请注意,这只是一个简单的示例,用于演示Mixin类的概念。在实际开发中,Mixin类可以更复杂,包含更多的方法和属性,用于添加各种功能。

二、DRF(Django REST Framework)框架介绍

DRF(Django REST Framework)是一个基于Python的开源框架,用于快速构建强大的Web API。它建立在Django框架的基础之上,为开发者提供了一整套工具和库,简化了构建和管理API的过程。

DRF提供了丰富的功能集,包括序列化、请求处理、认证、权限控制、版本管理等,使得构建高度可定制和可扩展的API变得更加简单。它遵循RESTful设计原则,支持各种HTTP方法(如GET、POST、PUT、DELETE)和数据格式(如JSON、XML),能够轻松地与前端框架(如React、Angular、Vue.js)进行交互。

DRF的重要性体现在以下几个方面:

  1. 快速开发:DRF提供了一组简洁而功能强大的API,使得开发者能够快速构建出高质量的Web API。使用DRF,可以轻松处理URL路由、请求、响应等方面的逻辑,减少了繁琐的编码工作。
  2. 强大的序列化器:DRF的序列化器允许将复杂的数据结构转换为简单的Python数据类型,以便进行序列化和反序列化。它还支持验证输入数据、自动生成文档等功能,简化了数据处理的过程。
  3. 认证和权限控制:DRF提供了各种认证方式(如Token、OAuth、JWT)和权限控制机制,使得开发者能够轻松地保护API的安全性,并限制用户对资源的访问权限。
  4. 文档生成:DRF能够自动生成API文档,包括接口说明、请求参数、返回结果等信息。这极大地方便了团队协作和沟通,减少了开发和前端之间的沟通成本。
  5. 社区活跃:DRF拥有庞大而活跃的社区,有大量的教程、示例代码以及问题解答。这使得学习和使用DRF变得更加容易,能够快速解决开发中遇到的问题。

总之,DRF是一个功能强大且易于使用的框架,为开发者提供了丰富的工具和库,简化了构建和管理API的过程。无论是构建小型项目还是大型应用程序,DRF都是一个值得考虑的首选框架。

三、 Mixin类在DRF中的作用和意义

Mixin类在DRF中起到了非常重要的作用,它们提供了一种灵活且可重用的方式来扩展和组合视图类的功能。Mixin类是一种特殊类型的类,其目的是通过多继承的方式将一些通用功能添加到视图类中,从而避免代码重复和混乱。

在DRF中,Mixin类用于将常见的功能和行为添加到视图类中。这些功能包括常见的HTTP方法(如GET、POST、PUT、DELETE)的实现、数据查询、序列化、认证、权限控制等。通过将这些功能封装在Mixin类中,可以使视图类变得更加简洁、可读且易于维护。

Mixin类的使用方式很简单。只需将Mixin类与DRF的视图类进行多继承,并实现相应的方法即可。当视图类需要某些特定的功能时,只需引入对应的Mixin类即可,无需重新编写大量的代码。

DRF提供了许多内置的Mixin类,如ListModelMixin、CreateModelMixin、RetrieveModelMixin、UpdateModelMixin、DestroyModelMixin等。这些Mixin类提供了常见的CRUD操作(创建、读取、更新、删除)的实现,使得构建API变得更加便捷。

使用Mixin类能够使代码具有更好的组织性和可维护性。通过将功能划分为多个Mixin类,可以按需组合,灵活地扩展和定制视图类的功能。这种模块化的设计非常有利于代码的重用,并能够减少开发中的重复工作量。

总之,Mixin类在DRF中的作用是提供了一种灵活且可重用的方式来扩展和组合视图类的功能。通过使用Mixin类,可以避免代码的冗余和混乱,并使得视图类的实现更加简洁、可读和易于维护。


四、什么是Mixin类

4.1 Mixin类的概念和基本原理

Mixin类是面向对象编程中的一种设计模式,它是指包含一组特定功能的类,这些功能可以被其他类通过多继承的方式共享或复用。Mixin类通常只关注一个特定的功能,而不关心具体的实现细节或逻辑。

 

Mixin类的基本原理是通过多继承将其功能注入到目标类中。当一个类需要使用Mixin类中的功能时,它可以通过多继承同时继承Mixin类和其他必要的类。这样,在目标类中就可以直接调用Mixin类中定义的方法和属性,从而获得相应的功能。

使用Mixin类的基本步骤如下:

  1. 定义Mixin类:Mixin类是一个普通的Python类,其中包含了一组特定的功能(例如,常见的CRUD操作、认证、权限控制等)。Mixin类通常不需要初始化方法,只包含各种方法和属性的定义。
  2. 定义目标类:目标类是需要获得Mixin类功能的类。在目标类的定义中,通过多继承的方式继承Mixin类和其他必要的父类。这样,目标类就能够获得Mixin类中定义的方法和属性。
  3. 使用Mixin功能:在目标类中可以直接调用Mixin类中定义的方法和属性,从而使用Mixin类提供的功能。由于Mixin类的功能与目标类的功能相互独立,所以可以轻松地增加、删除或替换Mixin类,以满足特定需求。

Mixin类的概念和基本原理使得代码具有更好的组织性和可维护性。通过将功能划分为多个Mixin类,可以按需组合,灵活地扩展和定制类的功能。这种模块化的设计能够减少代码的冗余,提高代码的重用性,并使得代码的结构更加清晰。

需要注意的是,在使用Mixin类时,应该遵循一些规范和最佳实践。例如,Mixin类的命名通常以Mixin结尾,以明确表示其作为Mixin类的特殊角色。此外,不建议使用单独继承Mixin类而不继承其他类,因为Mixin类本身并不完整,仅供其他类组合使用。

 
五、DRF中常用的Mixin类

在Django REST Framework (DRF)中,常用的Mixin类提供了一些基本功能,使我们能够更方便地编写API视图。下面逐个介绍这些Mixin类,并解释它们的功能和使用场景:

3.1 APIView

APIView是DRF中最基本的Mixin类之一。它提供了处理HTTP请求的基本方法,如GET、POST、PUT、DELETE等。同时,APIView也可以作为其他Mixin类的基类,通过多重继承的方式与其他Mixin类组合使用,以实现更复杂的功能。

虽然APIView在DRF中被称为Mixin类,但它通常作为其他Mixin类的基类,并结合其他Mixin类一起使用,以满足不同API视图的需求。通过继承APIView并组合其他Mixin类,我们可以实现灵活定制的API视图,包括获取列表、创建对象、获取详情、更新对象和删除对象等操作。

 

APIView 在Django项目中的应用:

当我们使用Django开发Web应用时,可以使用Django Rest Framework(DRF)提供的APIView来创建API视图。下面是一个示例,展示了如何使用DRF的APIView创建一个简单的API视图:

from rest_framework.views import APIView
from rest_framework.response import Response

class HelloWorldAPIView(APIView):
    def get(self, request):
        data = {
            'message': 'Hello, World!'
        }
        return Response(data)


在这个示例中,我们定义了一个名为HelloWorldAPIView的类,它继承自DRF提供的APIView。我们通过覆写get方法来处理GET请求,并返回一个包含消息的响应。

在这种情况下,Django的URL配置将请求映射到这个视图,然后视图处理该请求并生成响应。由于该视图继承自DRF的APIView,因此我们可以利用DRF提供的一些功能,例如自动处理请求和响应的序列化、认证和权限控制等。

使用APIView可以很方便地编写基于类的API视图,并且可以根据具体需求进行扩展和定制。

3.2 ListModelMixin

ListModelMixin:ListModelMixin是一个用于序列化和返回查询结果列表的Mixin类。它提供了list()方法,用于获取查询集并将其序列化返回。使用场景包括展示列表页、搜索功能以及对列表数据进行筛选、排序等操作。

class ListModelMixin:
    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

3.3 CreateModelMixin

CreateModelMixin:CreateModelMixin是用于创建新资源的Mixin类。它提供了create()方法,用于将传入的数据进行验证和保存操作。使用场景包括处理POST请求,创建新资源的操作。

class CreateModelMixin:
    """
    Create a model instance.
    """
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

    def perform_create(self, serializer):
        serializer.save()

    def get_success_headers(self, data):
        try:
            return {'Location': str(data[api_settings.URL_FIELD_NAME])}
        except (TypeError, KeyError):
            return {}

3.4 RetrieveModelMixin

RetrieveModelMixin:RetrieveModelMixin用于获取单个资源的Mixin类。它提供了retrieve()方法,用于获取指定对象的详细信息。使用场景包括处理GET请求,获取单个资源的详细信息。

class RetrieveModelMixin:
    """
    Retrieve a model instance.
    """
    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

3.5 UpdateModelMixin

UpdateModelMixin:UpdateModelMixin用于更新资源的Mixin类。它提供了update()方法,用于验证和更新现有资源的数据。使用场景包括处理PUT请求,更新资源的操作。

class UpdateModelMixin:
    """
    Update a model instance.
    """
    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)

        if getattr(instance, '_prefetched_objects_cache', None):
            # If 'prefetch_related' has been applied to a queryset, we need to
            # forcibly invalidate the prefetch cache on the instance.
            instance._prefetched_objects_cache = {}

        return Response(serializer.data)

    def perform_update(self, serializer):
        serializer.save()

    def partial_update(self, request, *args, **kwargs):
        kwargs['partial'] = True
        return self.update(request, *args, **kwargs)

3.6 DestroyModelMixin

DestroyModelMixin:DestroyModelMixin是用于删除资源的Mixin类。它提供了destroy()方法,用于验证和删除现有资源。使用场景包括处理DELETE请求,删除资源的操作。

class DestroyModelMixin:
    """
    Destroy a model instance.
    """
    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        self.perform_destroy(instance)
        return Response(status=status.HTTP_204_NO_CONTENT)

    def perform_destroy(self, instance):
        instance.delete()

这些Mixin类可以与APIView或其他View类结合使用,通过多继承的方式实现功能的组合。例如,使用ListAPIView继承自APIView和ListModelMixin,即可获得列表查询和序列化的功能。

ListAPIView(APIView,ListModelMixin)

Mixin类的好处在于它们将常见的功能抽象出来,并通过多继承的方式提供给我们使用。这样,我们可以根据不同的需求将它们组合在一起,减少代码冗余,提高开发效率。同时,Mixin类也使得代码更具可读性和可维护性,方便后续的功能拓展和修改。

需要注意的是,在使用Mixin类时,通常要根据具体需求选择合适的Mixin类进行组合,以满足API视图的功能要求。


四、如何使用Mixin类

4.1  使用Mixin类的方法和步骤

使用Mixin类是一种常见的代码重用技术,可以通过多重继承将一些通用功能和行为添加到类中。下面是使用Mixin类的步骤和示例代码:

1、定义Mixin类:

首先,我们需要定义一个Mixin类,命名时通常以Mixin结尾,以明确其作为Mixin类的特殊用途。Mixin类应该只包含一些辅助方法、属性或者覆写某些方法,而不应该定义构造函数或独立的功能。

class MyMixin:
    def common_method(self):
        # 实现通用方法逻辑
        pass

    def common_property(self):
        # 实现通用属性逻辑
        pass

    # 其他辅助方法...

2、创建视图类并继承Mixin类:

接下来,创建一个视图类,并使用多重继承来继承Mixin类和其他必要的父类。在多重继承中,通常将Mixin类放在前面,以便优先继承Mixin类的方法和属性。

from django.views import View

class MyView(MyMixin, View):
    def get(self, request):
        # 处理GET请求的业务逻辑
        self.common_method()
        return ...

    # 其他HTTP方法和逻辑...

3、注意Mixin类的顺序:

当使用多个Mixin类时,它们的顺序很重要。因为Python的方法解析顺序是从左到右,所以如果有相同名称的方法或属性,最先继承的Mixin类中的方法和属性将被优先使用。

class MyOtherMixin:
    def common_method(self):
        # 另一个实现通用方法逻辑
        pass

class MyView(MyMixin, MyOtherMixin, View):
    def get(self, request):
        # 处理GET请求的业务逻辑
        self.common_method()  # 调用的是MyMixin中的common_method()
        return ...

4、遵循命名规范:

为了保持代码的可读性和易于理解,Mixin类通常以Mixin结尾,并根据其功能进行命名。同时,还要注意避免Mixin类之间产生重复的方法或属性名,以免出现命名冲突或意外覆写。


使用Mixin类需要遵循一些优秀的编程实践:

  • 尽量保持Mixin类的独立性,不要在Mixin类中引入过多的额外依赖。
  • Mixin类应该关注单一领域的功能,并提供通用的方法或属性,以方便复用。
  • 在开发过程中,可以创建多个Mixin类来组合不同的功能,使得代码更加模块化、易于维护。
  • 注意Mixin类的顺序和命名规范,避免混淆和冲突。

通过合理地使用Mixin类,我们可以有效地实现代码的重用,减少重复性的开发工作,并提高代码的可维护性和可扩展性。

 

五、Mixin类的高级用法

使用Mixin类的高级用法包括自定义和扩展Mixin类的功能,可以通过以下几种方式实现:

5.1、重写Mixin类方法:

如果需要在具体视图类中对Mixin类的方法进行个性化定制,可以在具体视图类中重新实现Mixin类的方法。这样可以覆盖Mixin类中的默认实现,并根据需求进行定制化的扩展。

class MyMixin:
    def common_method(self):
        # 默认实现
        pass

class MyView(MyMixin, View):
    def common_method(self):
        # 个性化定制
        pass

5.2 添加新的方法和属性:

可以在具体视图类中添加新的方法和属性,以扩展Mixin类的功能。这样可以在Mixin类提供的基础上,进一步增加特定需求下的功能。

class MyMixin:
    def common_method(self):
        # 实现通用方法逻辑
        pass

class MyView(MyMixin, View):
    def specific_method(self):
        # 特定功能方法
        pass

5.3 组合多个Mixin类:

可以将多个Mixin类组合在一起,以实现更复杂的功能扩展。通过多重继承,可以将多个Mixin类的方法和属性组合到具体视图类中,从而实现更丰富的功能。

class OtherMixin:
    def other_method(self):
        # 其他功能方法
        pass

class MyView(MyMixin, OtherMixin, View):
    pass

5.4 自定义Mixin类顺序:

在多重继承中,Mixin类的顺序决定了方法解析顺序。根据需求,可以调整Mixin类的顺序,以确保特定Mixin类的方法优先被调用。

class MyView(OtherMixin, MyMixin, View):
    pass

5.5 继承其他Mixin类:

Mixin类也可以继承其他Mixin类,以进一步构建更复杂的功能组合。这样可以形成层次化的Mixin类结构,以便更好地复用和扩展代码。

class BaseMixin:
    def base_method(self):
        # 基础方法
        pass

class EnhancedMixin(BaseMixin):
    def enhanced_method(self):
        # 进一步增强的方法
        pass

class MyView(EnhancedMixin, View):
    pass

使用Mixin类的高级用法能够更加灵活地自定义和扩展功能,根据需要进行个性化定制,组合不同的Mixin类以实现更丰富的功能,提高代码的复用性和可维护性。但是在使用过程中,要注意遵循良好的命名规范,控制Mixin类的复杂度,以及理解Mixin类之间的关系,以避免混淆和冲突。

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

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

相关文章

unity 使用vrtk4的插件 打包htv vive VR客户端包,手柄不生效

背景: 目的:u3d使用vrtk开发pico应用(vrtk是为了到时候无缝衔接后续要买的htc vive pro 2) 先导入了tilia importer(也就是vrtk4.0,根据教程模块化使用功能)和pico官网下的“PICO Unity IntegrationSDK-214-20230302…

Leetcode-每日一题【138.复制带随机指针的链表】

题目 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节…

手捏Java知识点

今天开始面向对象了 面向对象基础 类:由属性和行为组成属性:在类中通过成员变量来体现行为:在类中通过成员方法来体现public class 类名{//成员变量变量1的数据类型 变量1;变量2的数据类型 变量2;...//成员方法方法1;方法2;...}有几个重要的概…

百度iOS端长连接组件建设及应用实践

作者 | 百度消息中台团队 导读 在过去的十年里,移动端技术飞速发展,移动应用逐渐成为主要的便捷访问和使用互联网的方式,承接了越来越多的业务和功能,这也意味着对移动端和服务器之间的通信效率和稳定性提出了更高的要求。为了实现…

ellisys 过滤设备

1、通过关键字过滤 输入蓝牙名称关键字,比如下面输入的是BNCM Transmitter "*BNCM*" || Receiver "*BNCM*" 之后,所有与这个设备相关的信号都会抓取过滤出来 2、通过地址过滤 之后,所有与这个设备相关的信号都会抓取过…

港联证券-深夜,大利好!人民币暴拉超500点,全球股市大反攻

全球商场一夜狂欢。 美国通胀大降温,全球危险资产全线大涨。北京时间7月12日晚间,美国劳工统计局发布数据,美国6月CPI同比涨幅回落至3%,低于预期3.1%,接连第12个月下降,且为2021年3月以来最低。数据发布后&…

02 |「Android Studio 新建项目」

前言 新手入门安卓开发 文章目录 前言一、步骤一、步骤 New Project选择 Empty Activity1)Name:项目的名字; 2)Package name:项目的包名(项目的唯一标识); 3)Save location:项目的保存路径; 4)Language:

QT实现按钮开关Form窗体的效果

实现效果叙述如下: MainWindow中的按钮实现Form窗体的开关,Form窗体的关闭按钮禁用掉,只允许使用窗体按钮进行,且关闭MainWindow按钮时Form窗体随之关闭。 注意: 要想实现关闭MainWindow按钮时Form窗体随之关闭&#x…

【Android知识笔记】系统进程(一)

Android 系统进程有哪些 先来一个整体结构图从宏观上理解Android系统的进程结构布局: 这里我们简单总结一下: 系统的第一个进程其实是0号进程(又叫swapper进程/Idle进程) 0号进程fork出了1号进程(init进程)和2号进程(kthreadd进程) 1号进程是所有普通用户进程的祖先,2号进程…

Docker部署前后端分离项目

✅作者简介:大家好,我是Cisyam,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Cisyam-Shark的博客 💞当前专栏: 项目部署 ✨特色专栏&…

K8s生产环境常见问题处理、答疑(连载、不定期更新)

文章目录 K8s 常见问题处理、答疑[1] calico一直处于未就绪状态[2] 删除dashboard 一直卡在delete[3] k8s-dashboard 修改tocken-ttl避免频繁输入tocken[4] kubectl 快捷指令[5] 解决UTC时间问题[6] kubectl命令自动补全[7] kubectl exec进入pod[8] 使用hostpath解决容器UTC时间…

LibreOffice 在win11(高版本win10)无响应的解决方案

问题描述 某次windows升级了以后,LibreOffice无法启动无响应、无报错 解决 安全模式启动 然后禁用显卡加速 然后:应用更改并重新启动 即可以正常模式启动LibreOffice

ARP协议(地址分析协议)

系列文章目录 数通王国历险记(4) 目录 前言 一,什么是地址解析协议(ARP) 二,封装和解封装 三,为什么需要地址解析协议(ARP) 四,ARP的验证实验 4.1&#x…

MySQL 学习笔记 4:视图

MySQL 学习笔记 4:视图 图源:ubiq.co 简单的说,视图就是“固化的SQL查询”。 这里看一个简单示例,我们有一个表,保存学生信息: mysql> select * from student limit 10; ---------------------------…

利用电价运行策略研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

外观模式:简化复杂系统的访问接口

外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问复杂系统中的一组接口。本文将深入探讨外观模式的原理、结构和使用方法,并通过详细的 Java 示例代码来说明。 1. 外观模式的定义 外观模式是一种通过提供一个简化的接口&…

LoggerFactory is not a Logback LoggerContext but Logback is on the classpath

springboot项目报错如下: 这个错误是由于在你的Java代码中使用了Logback日志库,但是同时又存在与Logback竞争的其他日志库(例如slf4j-simple)导致的冲突。 要解决这个问题,你可以尝试以下几个步骤: 1. 检…

计算机网关原理、子网掩码原理(路由器、交换机)(网关:与以太网接口关联的路由)

文章目录 网关网关的历史网关的功能网关的原理相关疑问为什么用子网掩码与IP地址进行与运算来确定一个IP地址所属的子网?网关地址是谁定的,是配置路由的人随意定的吗?(配置人员定的)如何正确设置网关地址(路…

WPF 如何引入图标文件

文章目录 前言:WPF 引入图标什么是ttf字体阿里云矢量库下载WPF引用为什么文件路径是#iconfont而不是iconfont。前面为什么要带个#号? 前言: 我最近在研究WPF,吃饭嘛,桌面端实在是不想用Winform,太丑了。WP…

WebDAV之π-Disk派盘+Notability

Notability 支持WebDAV方式连接π-Disk派盘。 Notability是一款功能强大的数字笔记应用,适用于iOS和macOS。它提供了优秀的手写体验,支持手写、录音和多种标记。用户可以记录想法、思路、绘图和草图,进行注释和标记,实现高效的学习和创作。同时,Notability具有文本输入、…