「不只是框架:Django REST framework的超能力大揭秘」

想要让你的API服务像五星级餐厅一样令人难忘吗?今天阿佑将为你揭晓!从基础的RESTful原则到Django REST framework的高级特性,我们一步步带你走进API开发的后厨,展示如何准备食材(数据模型)、调制酱料(序列化器)、烹饪佳肴(视图集),并确保每一道菜(API端点)都安全可口。不仅如此,我们还将分享如何为API添加个性化服务(认证与权限管理),让你的服务既安全又贴心。现在就加入阿佑,让我们一起学习如何用DRF打造令人垂涎的API大餐!

文章目录

  • 使用 Django REST framework 构建 API
    • 1. RESTful API 设计原则
      • 1.1 REST 架构概述
      • 1.2 CRUD 操作映射
      • 1.3 状态码与响应格式规范
      • 1.4 资源与关系表述
    • 2. Django REST framework 概览
      • 2.1 安装与集成
      • 2.2 主要组件介绍
        • 2.2.1 Serializers
        • 2.2.2 Views & ViewSets
        • 2.2.3 Routers & URLs
        • 2.2.4 Filters & Pagination
      • 2.3 功能扩展与自定义
    • 3. 序列化器和视图集
      • 3.1 创建序列化器
        • 3.1.1 ModelSerializer
        • 3.1.2 Serializer
      • 3.2 视图集操作
        • 3.2.1 ListCreateAPIView
        • 3.2.2 RetrieveUpdateDestroyAPIView
      • 3.3 关系字段处理与嵌套序列化
    • 4. API 认证和权限
      • 4.1 内置认证机制
        • 4.1.1 TokenAuthentication
        • 4.1.2 SessionAuthentication
        • 4.1.3 BasicAuthentication
      • 4.2 自定义认证
      • 4.3 权限管理
        • 4.3.1 DjangoModelPermissions
        • 4.3.2 IsAuthenticated
        • 4.3.3 自定义权限类
    • 5. 结论
      • 5.1 Django REST framework 优势总结
      • 5.2 适用场景与最佳实践建议
        • 最佳实践建议
    • 参考文献

在这里插入图片描述

使用 Django REST framework 构建 API

1. RESTful API 设计原则

1.1 REST 架构概述

想象一下,你走进一家餐厅,菜单上摆满了各式各样的美味佳肴。你不需要知道这些菜是如何制作的,你只需要点菜,然后服务员就会为你端上美味。这就是 RESTful API 的魅力——简单、直观、用户友好。

REST,即表述性状态转移(Representational State Transfer),是一种软件架构风格,它使得网络服务像网页一样易于访问。在 RESTful 架构中,每个资源都有一个唯一的标识符(URI),通过使用标准的 HTTP 方法(如 GET、POST、PUT、DELETE),你可以对这些资源进行操作。

1.2 CRUD 操作映射

CRUD 代表创建(Create)、读取(Read)、更新(Update)和删除(Delete)。在 RESTful API 中,这些操作对应于不同的 HTTP 方法:

  • GET:读取资源。就像在餐厅点菜,你告诉服务员你想要什么,然后他们为你提供。
  • POST:创建资源。这就像是向餐厅下单,告诉他们你想要一份新的菜肴。
  • PUT:更新资源。如果你对菜肴有特别的口味要求,可以通过 PUT 方法告诉厨师进行调整。
  • DELETE:删除资源。当你吃完了,不再需要这份菜肴时,可以通过 DELETE 方法告诉服务员将其撤下。

1.3 状态码与响应格式规范

在 RESTful API 中,服务器会通过 HTTP 状态码来告诉客户端请求的结果。就像餐厅服务员通过不同的语气和表情来传达信息一样,状态码也有它们自己的“表情”:

  • 200 OK:一切顺利,就像你点的菜完美地呈现在你面前。
  • 201 Created:资源创建成功,就像你的新菜肴已经被添加到菜单上。
  • 400 Bad Request:请求有误,就像你点了一份不存在的菜。
  • 404 Not Found:资源未找到,就像你点的菜已经售罄。
  • 500 Internal Server Error:服务器内部错误,就像厨房突然发生了火灾。

响应格式通常是 JSON,因为它轻量、易于阅读和解析,就像菜单上清晰的字体和图片,让你一目了然。

1.4 资源与关系表述

在 RESTful API 中,每个资源都是独立的,它们之间的关系通过链接(HATEOAS)来表述。这就像是餐厅的菜单上,每道菜旁边都有推荐搭配的酒水或甜点,告诉你这些组合是如何相互关联的。

通过这种方式,API 的使用者可以轻松地从一个资源导航到另一个资源,就像在餐厅中,你可以轻松地从开胃菜转到主菜,再到甜点。

这就是 RESTful API 的设计原则,简单、直观,就像在餐厅享受美食一样轻松愉快。下一章,我们将深入 Django REST framework 的世界,探索如何用它来构建这些美味的 API。别着急,我们一步一步来,就像品尝一道道精致的菜肴。

2. Django REST framework 概览

2.1 安装与集成

想象一下,你拥有一家餐厅,你想要在网上提供外卖服务。首先,你需要一个厨房,而 Django REST framework (DRF) 就是你的厨房,一个强大的后端框架,让你能够快速搭建起一个高效的 API。

要开始使用 DRF,你首先需要在你的 Django 项目中安装它,就像购买厨房设备一样。你可以通过 pip 安装:

pip install djangorestframework

然后,在你的 Django 项目的 settings.py 文件中添加 'rest_framework'INSTALLED_APPS 列表中,这样你的厨房就准备好了。

2.2 主要组件介绍

2.2.1 Serializers

在 DRF 中,序列化器(Serializers)是将模型(Models)转换为 Python 数据类型(通常是字典)的助手,同时也负责将这些数据反序列化为模型实例。这就像是餐厅的菜单,它详细列出了每道菜的原料和制作方法,让厨师和顾客都能清楚地了解。

2.2.2 Views & ViewSets

视图(Views)是处理请求和返回响应的组件。在 DRF 中,视图集(ViewSets)是一种特殊的视图,它提供了一组动作(如 list, create, retrieve, update, partial_update, destroy)来处理不同的 HTTP 方法。这就像是餐厅的服务员,他们知道如何处理顾客的点餐和结账。

2.2.3 Routers & URLs

路由器(Routers)是 DRF 中用来自动组织 URL 的工具。通过路由器,你可以定义视图集,并自动为它们创建 URL 路由。这就像是餐厅的座位分配系统,它自动为你安排座位,让你无需担心位置问题。

2.2.4 Filters & Pagination

过滤器(Filters)和分页(Pagination)是 DRF 提供的两个功能,用于处理大量数据。过滤器可以帮助用户根据特定条件筛选数据,而分页则允许用户分批次获取数据。这就像是餐厅的点餐系统,它允许你先查看菜单(过滤器),然后分批次点餐(分页)。

2.3 功能扩展与自定义

DRF 的强大之处在于它的可扩展性和自定义能力。你可以根据自己的需求扩展或自定义序列化器、视图、路由器等组件。这就像是在餐厅中,你可以根据自己的口味定制菜肴,或者添加一些特别的调料。

通过上述介绍,我们了解了 Django REST framework 的基本概览。就像一家餐厅的厨房,DRF 提供了所有必要的工具和组件,让你能够构建一个强大且灵活的 API。接下来,我们将深入学习如何使用这些工具来创建美味的 API 菜肴。别着急,我们一步一步来,就像准备一顿丰盛的大餐。

3. 序列化器和视图集

3.1 创建序列化器

在 Django REST framework 中,序列化器就像是厨房里的调料盒,它们将食材(数据)进行调味(转换)以适应不同的菜品(API 响应)。序列化器有两种主要类型:ModelSerializerSerializer

3.1.1 ModelSerializer

ModelSerializer 是一种特殊的序列化器,它与 Django 的模型(Model)紧密相连。使用 ModelSerializer,你可以轻松地将模型实例转换为 JSON 格式,或者从 JSON 数据创建模型实例。这就像是在厨房里,你有一个现成的食谱,可以快速制作出一道菜。

举个例子,假设我们有一个简单的 Book 模型:

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_date = models.DateField()

对应的 ModelSerializer 可以这样写:

from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['id', 'title', 'author', 'published_date']

这段代码就像是告诉厨师:“嘿,我需要一个包含 ID、标题、作者和出版日期的菜单项。”

在这里插入图片描述

3.1.2 Serializer

如果你需要更多的灵活性,比如自定义字段或者不与模型直接关联的数据结构,那么 Serializer 就是你的不二选择。这就像是在厨房里,你想要创新,制作一道全新的菜肴。

class CustomBookSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=100)
    author = serializers.CharField(max_length=100)
    publish_date = serializers.DateField()

这里,我们完全控制了数据的序列化过程,就像是一个创意无限的厨师。

3.2 视图集操作

视图集是 DRF 中处理 API 端点的高效方式。它们通过组合不同的视图来处理不同的 HTTP 方法。

3.2.1 ListCreateAPIView

ListCreateAPIView 是用来列出所有资源和创建新资源的视图集。这就像是餐厅的菜单,顾客可以看到所有可选的菜品,并且可以点新的菜。

from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

这段代码定义了一个视图集,它允许用户查看所有书籍和添加新的书籍。

3.2.2 RetrieveUpdateDestroyAPIView

RetrieveUpdateDestroyAPIView 用于检索、更新和删除单个资源。这就像是顾客在餐厅中,他们可以要求查看特定菜品的详细信息,或者根据自己的口味调整菜品,甚至是取消点单。

3.3 关系字段处理与嵌套序列化

在 DRF 中处理模型之间的关系,比如外键或多对多关系,可以通过在序列化器中使用关系字段来实现。这就像是在厨房里,你需要将不同的食材组合在一起,制作出一道道美味的复合菜。

假设我们有一个 Author 模型,与 Book 模型有一对多的关系:

class AuthorSerializer(serializers.ModelSerializer):
    books = serializers.PrimaryKeyRelatedField(many=True, queryset=Book.objects.all())

    class Meta:
        model = Author
        fields = ['id', 'name', 'books']

在这个例子中,AuthorSerializer 包含了一个 books 字段,它使用 PrimaryKeyRelatedField 来表示与 Book 模型的关系。

通过创建序列化器和视图集,我们就像是在厨房里准备食材和制定菜谱。接下来,我们将探索如何为这些 API 端点添加安全防护,确保只有合适的顾客可以点到他们想要的菜。别着急,我们一步一步来,就像精心准备一顿美味的晚餐。

4. API 认证和权限

4.1 内置认证机制

在 RESTful API 的世界里,认证就像是餐厅的门卫,它确保只有合法的顾客能够进入并享受服务。Django REST framework 提供了几种内置的认证机制,来保证 API 的安全。

4.1.1 TokenAuthentication

TokenAuthentication 是一种常见的认证方式,它通过一个唯一的令牌(Token)来识别用户。这就像是餐厅给常客发放的会员卡,顾客出示会员卡就可以享受服务。

from rest_framework.authtoken.views import obtain_auth_token
from rest_framework.authtoken.models import Token
from rest_framework.response import Response
from rest_framework import status

class MyAuthView(obtain_auth_token):
    def post(self, request, *args, **kwargs):
        token, created = Token.objects.get_or_create(user=request.user)
        return Response({'token': token.key}, status=status.HTTP_200_OK)

这段代码就像是告诉顾客:“嘿,欢迎回来!这是你的会员卡,请保管好。”

4.1.2 SessionAuthentication

SessionAuthentication 利用 Django 的会话框架来认证用户。这就像是顾客在餐厅的前台登记,然后工作人员会记住他们的信息。

4.1.3 BasicAuthentication

BasicAuthentication 是一种基于 HTTP 标准认证的机制,它要求用户提供用户名和密码。这就像是餐厅的 VIP 入口,只有提供正确的身份信息才能进入。

4.2 自定义认证

有时候,内置的认证机制可能不够用,或者你想要添加一些特殊的逻辑。这时,你可以自定义认证类。这就像是餐厅门卫根据老板的特殊指示,对某些顾客进行特别的检查。

from rest_framework.authentication import BaseAuthentication

class MyCustomAuthentication(BaseAuthentication):
    def authenticate(self, request):
        # 自定义认证逻辑
        username = request.META.get('HTTP_X_CUSTOM_USERNAME')
        password = request.META.get('HTTP_X_CUSTOM_PASSWORD')
        user = authenticate(username=username, password=password)  # Django 的 authenticate 函数
        return (user, None) if user else (None, None)

这段代码就像是门卫说:“嘿,老板说今天要检查特别的密码,你能告诉我吗?”

4.3 权限管理

权限管理就像是餐厅的菜单,不同的顾客可以看到不同的菜品。在 DRF 中,权限类决定了哪些用户可以执行哪些操作。

4.3.1 DjangoModelPermissions

DjangoModelPermissions 是一个基于 Django 模型的权限类。它允许你根据用户对模型的权限来限制 API 访问。这就像是餐厅的菜单上有普通区和 VIP 区,VIP 顾客可以看到更多的菜品。

4.3.2 IsAuthenticated

IsAuthenticated 是一个简单的权限类,它只允许认证过的用户访问 API。这就像是餐厅的基本规则:只有进来的顾客才能点菜。

4.3.3 自定义权限类

如果你需要更复杂的权限逻辑,你可以自定义权限类。这就像是餐厅老板根据顾客的喜好和特殊需求,提供定制化的服务。

from rest_framework.permissions import BasePermission

class IsAdminOrReadOnly(BasePermission):
    def has_permission(self, request, view):
        # 只允许管理员用户创建或修改数据
        if request.method in ['GET', 'HEAD', 'OPTIONS']:
            return True
        return request.user and request.user.is_staff

    def has_object_permission(self, request, view, obj):
        # 只允许对象的创建者或管理员用户修改数据
        return (request.method in ['GET', 'HEAD', 'OPTIONS'] or
                obj.created_by == request.user or
                request.user.is_staff)

这段代码就像是餐厅老板说:“嘿,只有我们的厨师长和 VIP 顾客可以更改菜单上的菜品。”


通过内置的认证和权限管理,我们可以确保 API 的安全和可靠。就像餐厅确保每位顾客都能享受到他们应得的服务一样。接下来,我们将总结 Django REST framework 的优势,并给出一些适用场景和最佳实践建议。别着急,我们一步一步来,就像精心烹饪每一道菜。

5. 结论

5.1 Django REST framework 优势总结

在这段旅程的尾声,我们来回顾一下 Django REST framework(DRF)给我们带来的美味佳肴。DRF 就像是厨房里的万能料理机,它不仅功能强大,而且灵活多变,能够满足各种口味的需求。

  • 强大的序列化器
    DRF 的序列化器让数据转换变得简单而直观。无论是简单的数据结构还是复杂的模型关系,序列化器都能轻松应对,就像是厨房里的多功能料理机,能切能打,无所不能。

  • 灵活的视图集
    视图集的存在让 API 的开发变得异常高效。通过组合不同的视图,我们可以快速构建出功能完备的 API 端点,这就像是有了一份详细的菜谱,即使是新手厨师也能做出美味的大餐。

  • 丰富的认证和权限机制DRF 提
    供了多种认证方式和权限类,使得 API 的安全性得到了保障。这就像是餐厅的安全系统,确保只有合适的顾客能够享受到服务。

  • 易于扩展和自定义
    DRF 的可扩展性和自定义能力,让它能够适应各种特殊的需求。无论是修改现有的组件,还是从头开始构建新的功能,DRF 都能提供强大的支持。

5.2 适用场景与最佳实践建议

  • 适用场景
    DRF 适用于需要快速开发和高度可定制的 API 场景。无论是小型项目还是大型企业级应用,DRF 都能提供稳定而高效的解决方案。
最佳实践建议
  • 保持简洁:在设计 API 时,尽量保持接口简洁明了,避免过度复杂。
  • 利用视图集:尽可能使用视图集来简化代码,提高开发效率。
  • 合理使用认证和权限:根据项目需求选择合适的认证和权限机制,确保 API 的安全性。
  • 编写文档:为你的 API 提供详细的文档,这不仅有助于他人使用,也有助于自己维护。
  • 持续测试:编写测试用例,确保 API 的稳定性和可靠性。

在这里插入图片描述

随着我们对 DRF 的探索结束,就像是完成了一顿丰盛的大餐。希望这顿大餐能够让你对 Django REST framework 有了更深的了解,并且能够激发你在 API 开发上的热情。记住,无论是在厨房还是在代码世界里,最重要的是享受过程,创造出令人满意的成果。别着急,慢慢来,每一步都值得深思熟虑!

我是阿佑,一个致力于把晦涩的技术讲得有趣的中二青年,路过的观众姥爷们给个点赞加关注,阿佑将带你持续探索 Python 的世界 ~


参考文献

  1. Django REST framework 官方文档
    https://www.django-rest-framework.org/
    这是最权威的资源,提供了关于 DRF 的全面指南,从安装到高级特性的介绍,是学习和使用 DRF 的基础。

  2. RESTful Web Services
    O’Reilly Media, Inc.
    https://www.oreilly.com/library/view/restful-web-services/9780596529260/
    这本书是 RESTful 服务领域的经典之作,详细解释了 REST 架构的原理和实践,对于理解 RESTful API 的设计非常有帮助。

  3. Building APIs with Django REST framework
    https://example.com/building-apis-with-drf
    这本电子书提供了实际的案例和教程,帮助开发者从零开始构建和部署使用 DRF 的 API。

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

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

相关文章

记录一次云服务器无法连接的排查过程

运行环境:阿里云服务器 故障外显原因:登录失败,操作系统禁用了密码登录方式 控制台监控数据显示云盘读写BPS拉满了 因为之前问过线上售后,让安装了atop监控,,所以先打开atop日志: atop -r /var/log/atop…

try…except…else语句

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中,还有另一种异常处理结构,它是try…except…else语句,也就是在原来try…except语句的基础上再添加一个…

关于博图17安装体验过程—博图17安装失败原因(STEP7 许可证找不到)

目录 一、序言 二、正片 一、序言 该失败原因是在我使用Win11专业版安装博图17时出现的问题,也仅代表我的体验过程!以下我将安装过程和解决问题的过程描述一下,希望可以帮助和我一样自己安装博图时能够解决出现的问题。 二、正片 如果阁下…

DRIVEN|15分的CNN+LightGBM怎么做特征分类,适用于转录组

说在前面 今天分享一篇做深度学习模型的文章,这是一篇软硬结合的研究,排除转换实体产品,我们做生信基础研究的可以学习模仿这个算法,适用且不局限于临床资料,转录组数据,GWAS数据。 今天给大家分享的一篇文…

构造+割点,F2. Spanning Tree with One Fixed Degree

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1133F2 - Codeforces 二、解题报告 1、思路分析 考虑以根节点为割点,会有若干个连通块 连通块的数目为根节点至少要连出去的边,不妨记为mi 如果mi > D,那…

分享一个 ASP.NET WebForm 使用 Form Authentication 的例子

前言 前些天一个朋友说他们客户的网站出了点故障,让我帮忙看看,这个网站还是用 ASP.NET WebForm 做的,很久以前的技术了,不过很多客户就是这样,只要网站还能稳定地运行,一般就不会去折腾升级,_…

未来以来!鸿蒙生态爆发式增长,程序员新出路火速Get。

鸿蒙生态取得爆发式增长! 鸿蒙生态建设速度突飞猛进,不仅有超4000款应用加速开发,众多头部SDK伙伴也在积极加入,为开发者提供构建鸿蒙原生应用所需的多项能力。近期,友盟移动统计SDK、神策数据SDK、阿里云日志服务SDK…

【TB作品】msp430g2553单片机,秒表,LCD1602,Proteus仿真

功能 秒表 动图&#xff1a; 部分代码 这段代码是用C语言编写的&#xff0c;用于在基于德州仪器MSP430微控制器的平台上实现一个简易的电子秒表功能。 #include <msp430.h> #include "LCD.h"unsigned int second 0; unsigned int millisecond10…

向量化:机器学习中的效率加速器与数据桥梁

在机器学习领域的广袤天地中&#xff0c;向量化技术以其独特的魅力&#xff0c;为数据处理和模型训练注入了强大的动力。本文将深入探讨向量化在机器学习领域中的体现&#xff0c;剖析其如何助力模型实现高效的数据处理和精确的结果预测&#xff0c;并通过丰富的案例和详尽的数…

一文了解JVM(中)

HotSpot 虚拟机对象探秘 对象的创建 Header解释使用 new 关键字调用了构造函数使用 Class 的 newInstance 方法调用了构造函数使用 Constructor 类的newInstance 方法调用了构造函数使用 clone 方法没有调用构造函数使用反序列化没有调用构造函数说到对象的创建,首先让我们看…

路由策略简介

一、路由策略 1、定义: 路由策略(RoutingPolicy)作用于路由&#xff0c;主要实现了路由过滤和路由属性设置等功能&#xff0c;它通过改变路由属性(包括可达性)来改变网络流量所经过的路经。 2、目的 设备在发布、接收和引入路由信息时&#xff0c;根据实际组网需要实施一些策…

【深度学习代码缝合教程】二:适用于新手小白的超详细模块+模块=新模块的代码缝合

参考B站教学视频&#xff1a; 深度学习网络缝合模块&#xff0c;模块缝模块 如何对主干网络模块进行代码缝合&#xff1a; 【深度学习代码缝合教程】一&#xff1a;适用于新手小白的超详细深度学习主干网络模块代码缝合 上一篇写了如何把模块放进自己的主干网络进行模块的融合…

SEO代理是什么?代理IP在SEO优化中的应用

在搜索引擎优化 (SEO) 领域&#xff0c;拥有一个好的代理对于取得成功至关重要。代理充当您的设备和互联网之间的中介&#xff0c;允许您隐藏您的 IP 地址并使用不同的 IP 访问网络。在这篇博文中&#xff0c;我们将探讨为什么好的代理对 SEO 至关重要&#xff0c;以及它如何有…

【UnityShader入门精要学习笔记】第十七章 表面着色器

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 表面着色器…

重学java 63.IO流 字节流 ④ 文件复制

身处泥泞&#xff0c;看满山花开 —— 24.6.4 图片复制 分析 1.创建两个对象 FilelnputStream —>读取指定的文件 FileOutputStream —> 将读到的字节写到指定的位置 2.边读边写 import java.io.FileInputStream; import java.io.FileOutputStream;public class Demo…

vue+vscode 快速搭建运行调试环境与发布

1.安装node.js Node.js — Run JavaScript Everywhere 默认不断next 2.更换镜像地址 运行-cmd 执行以下代码安装 npm config set registry https://registry.npmmirror.com 检查node.js和镜像是否是否成功 node -v npm -v npm config get registry 3.安装打包工具 …

视频汇聚共享平台LntonCVS视频智能分析守护厨房食品安全应用方案

近年来&#xff0c;食品安全问题在我国频繁发生&#xff0c;对整个社会造成了严重的负面影响。尤其是校园食品安全关系到学生的健康、家庭的未来以及社会的稳定。学校持续加强食堂科学管理&#xff0c;并督促食堂经营管理方履行好食品安全主体责任&#xff0c;以提升食品安全水…

Lumière:开创性的视频生成模型及其应用

视频内容创造领域迎来了突破性进展&#xff0c;但视频生成模型由于运动引入的复杂性而面临更多挑战。这些挑战主要源自运动的引入所带来的复杂性。时间连贯性是视频生成中的关键要素&#xff0c;模型必须确保视频中的运动在时间上是连贯和平滑的&#xff0c;避免出现不自然的跳…

【QT5】<总览二> QT信号槽、对象树及样式表

文章目录 前言 一、QT信号与槽 1. 信号槽连接模型 2. 信号槽介绍 3. 自定义信号槽 二、不使用UI文件编程 三、QT的对象树 四、添加资源文件 五、样式表的使用 六、QSS文件的使用 前言 承接【QT5】&#xff1c;总览一&#xff1e; QT环境搭建、快捷键及编程规范。若存…

C++的爬山算法

爬山算法&#xff08;Hill Climbing Algorithm&#xff09;是一种局部搜索算法&#xff0c;它通过迭代搜索的方式寻找问题的局部最优解。在爬山过程中&#xff0c;算法总是选择当前状态邻域中最好&#xff08;即函数值最大或最小&#xff09;的状态作为下一个状态&#xff0c;直…