【Django】DRF API版本和解析器

講解 Python3 下 Django REST Framework (DRF)

  • API 版本控制
  • 解析器(Parser)

一、DRF API 版本控制詳解

API 版本控制是構建健壯、可維護的 RESTful API 的關鍵,尤其在項目演進中需要兼容不同版本的客戶端請求。

1.1 API 版本控制的核心原理

API 版本控制的核心目標是確保 API 的新舊版本能夠并存,允許客戶端明確指定所需的版本,同時保持后端代碼的可維護性。DRF 的版本控制機制通過以下步驟實現:

  • 版本標識:客戶端通過某種方式(URL、查詢參數、請求頭等)指定請求的 API 版本。
  • 路由分發:DRF 根據版本標識將請求分發到對應的視圖邏輯。
  • 版本隔離:不同版本的 API 可能對應不同的序列化器(Serializer)、視圖(View)或業務邏輯。

DRF 的版本控制是基于 Versioning 類的,通過配置 DEFAULT_VERSIONING_CLASS 和相關參數,決定如何解析和處理版本信息。版本控制的核心類位于 rest_framework.versioning 模塊中。

1.2 DRF 支持的版本控制方案

DRF 提供了以下五種內置版本控制方案,每種方案適用于不同的場景,開發者可以根據需求選擇:

  1. URLPathVersioning(基于 URL 路徑)

    • 原理:版本號嵌入在 URL 路徑中,例如 /api/v1/resource/
    • 適用場景:API 版本明確,客戶端希望通過直觀的 URL 區分版本,適合公開 API。
    • 實現
      • 配置:DEFAULT_VERSIONING_CLASS = 'rest_framework.versioning.URLPathVersioning'
      • URL 示例:path('api/<version>/resource/', views.ResourceView.as_view())
      • 客戶端請求:GET /api/v1/resource/
      • 版本提取:DRF 從 URL 中的 <version> 捕獲版本號。
    • 優點:URL 直觀,易于調試;版本明確,適合 RESTful 風格。
    • 缺點:URL 變更可能影響客戶端,需謹慎設計路由。
  2. QueryParameterVersioning(基于查詢參數)

    • 原理:版本號通過查詢參數傳遞,例如 /api/resource/?version=v1
    • 適用場景:適合輕量級版本控制,客戶端無需修改 URL 路徑。
    • 實現
      • 配置:DEFAULT_VERSIONING_CLASS = 'rest_framework.versioning.QueryParameterVersioning'
      • URL 示例:path('api/resource/', views.ResourceView.as_view())
      • 客戶端請求:GET /api/resource/?version=v1
      • 版本提取:DRF 從查詢參數 version 獲取版本號。
    • 優點:靈活,客戶端只需調整參數;對現有路由改動小。
    • 缺點:查詢參數可能被忽略,版本信息不夠顯式。
  3. AcceptHeaderVersioning(基于 Accept 頭)

    • 原理:版本號通過 HTTP 請求頭 Accept 的媒體類型指定,例如 Accept: application/json; version=1.0
    • 適用場景:適合嚴格遵循 RESTful 規范的 API,版本信息與內容協商結合。
    • 實現
      • 配置:DEFAULT_VERSIONING_CLASS = 'rest_framework.versioning.AcceptHeaderVersioning'
      • 客戶端請求:Accept: application/json; version=1.0
      • 版本提取:DRF 解析 Accept 頭中的 version 參數。
    • 優點:符合 RESTful 規范,版本信息與媒體類型協商一致;URL 保持簡潔。
    • 缺點:客戶端實現復雜,調試不如 URL 直觀。
  4. NamespaceVersioning(基于命名空間)

    • 原理:通過 Django 的 URL 命名空間區分版本,例如 /v1/api/resource/
    • 適用場景:適合版本之間差異較大,需要完全隔離路由的場景。
    • 實現
      • 配置:DEFAULT_VERSIONING_CLASS = 'rest_framework.versioning.NamespaceVersioning'
      • URL 示例:
        urlpatterns = [path('v1/api/', include('myapp.urls', namespace='v1')),path('v2/api/', include('myapp.urls', namespace='v2')),
        ]
        
      • 版本提取:DRF 從 URL 的命名空間提取版本號。
    • 優點:版本隔離徹底,適合大型項目;支持版本間完全不同的路由結構。
    • 缺點:配置復雜,路由維護成本高。
  5. HostNameVersioning(基于主機名)

    • 原理:通過子域名區分版本,例如 v1.api.example.com/resource/
    • 適用場景:適合企業級 API,版本通過子域名隔離,客戶端無需修改請求路徑。
    • 實現
      • 配置:DEFAULT_VERSIONING_CLASS = 'rest_framework.versioning.HostNameVersioning'
      • 示例:v1.api.example.com 解析為版本 v1
      • 版本提取:DRF 從請求的 Host 頭提取版本信息。
    • 優點:版本隔離清晰,適合多租戶或高并發場景;URL 簡潔。
    • 缺點:需要 DNS 配置支持,部署復雜;不適合本地開發。

1.3 配置版本控制

在 Django 的 settings.py 中配置版本控制相關參數:

REST_FRAMEWORK = {'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning','DEFAULT_VERSION': 'v1',  # 默認版本'ALLOWED_VERSIONS': ['v1', 'v2'],  # 允許的版本列表'VERSION_PARAM': 'version',  # 版本參數名(查詢參數或 Accept 頭)
}
  • DEFAULT_VERSION:當客戶端未指定版本時使用的默認版本。
  • ALLOWED_VERSIONS:限制有效的版本號,防止非法版本請求。
  • VERSION_PARAM:指定版本參數的名稱(主要用于 QueryParameterVersioning 和 AcceptHeaderVersioning)。

1.4 視圖中的版本處理

在視圖中,可以通過 request.version 訪問客戶端請求的版本號,并據此實現版本特定的邏輯:

from rest_framework.views import APIView
from rest_framework.response import Responseclass ResourceView(APIView):def get(self, request, *args, **kwargs):version = request.versionif version == 'v1':return Response({"message": "Version 1 response"})elif version == 'v2':return Response({"message": "Version 2 response"})return Response({"error": "Invalid version"})

1.5 實際應用案例

假設一個電商 API 需要支持兩種版本:v1 使用舊的訂單序列化格式,v2 引入新的字段和邏輯。

  • URL 配置(使用 URLPathVersioning):

    # urls.py
    from django.urls import path, re_path
    from myapp import viewsurlpatterns = [re_path(r'^api/(?P<version>v[1-2])/orders/$', views.OrderView.as_view()),
    ]
    
  • 視圖邏輯

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from .serializers import OrderSerializerV1, OrderSerializerV2class OrderView(APIView):def get(self, request, *args, **kwargs):if request.version == 'v1':serializer = OrderSerializerV1(data={'id': 1, 'amount': 100})else:  # v2serializer = OrderSerializerV2(data={'id': 1, 'amount': 100, 'status': 'shipped'})serializer.is_valid()return Response(serializer.data)
    
  • 序列化器

    from rest_framework import serializersclass OrderSerializerV1(serializers.Serializer):id = serializers.IntegerField()amount = serializers.FloatField()class OrderSerializerV2(serializers.Serializer):id = serializers.IntegerField()amount = serializers.FloatField()status = serializers.CharField()  # 新增字段
    

1.6 潛在問題與優化

  • 問題 1:版本膨脹
    隨著版本增加,代碼維護成本上升,可能導致視圖邏輯復雜。
    優化

    • 使用序列化器和視圖的動態加載機制,例如根據 request.version 動態選擇序列化器類:
      serializer_class = {'v1': OrderSerializerV1, 'v2': OrderSerializerV2}.get(request.version)
      
    • 采用模塊化設計,將每個版本的邏輯拆分到獨立的模塊。
  • 問題 2:版本兼容性
    客戶端可能錯誤使用版本號,導致 API 響應不符合預期。
    優化

    • 配置 ALLOWED_VERSIONS 限制有效版本。
    • 提供詳細的錯誤響應,例如:
      from rest_framework.exceptions import NotAcceptable
      if request.version not in ['v1', 'v2']:raise NotAcceptable("Unsupported API version")
      
  • 問題 3:性能開銷
    頻繁解析版本號可能引入微小的性能開銷,尤其在高并發場景下。
    優化

    • 使用 URLPathVersioningNamespaceVersioning,因為它們解析開銷較低。
    • 緩存版本解析結果(例如通過中間件)。

在這里插入圖片描述

二、DRF 解析器(Parser)詳解

解析器(Parser)是 DRF 處理客戶端請求體的核心組件,負責將 HTTP 請求的原始數據(如 JSON、XML、Form 數據)解析為 Python 數據結構(通常是字典),以便視圖邏輯處理。以下從原理、實現、配置到高級用法全面剖析 DRF 的解析器。

2.1 解析器的核心原理

解析器的作用是將 HTTP 請求的 Content-Type 對應的數據(如 application/json)轉換為 Python 可操作的對象。DRF 的解析器基于 rest_framework.parsers 模塊,核心流程如下:

  1. Content-Type 檢測:DRF 根據請求頭的 Content-Type 確定使用哪個解析器。
  2. 數據解析:選定的解析器將請求體的原始字節流解析為 Python 數據結構。
  3. 視圖傳遞:解析后的數據通過 request.data 提供給視圖使用。

解析器是可插拔的,開發者可以自定義解析器以支持特定格式的數據。

2.2 DRF 內置解析器

DRF 提供以下內置解析器:

  1. JSONParser

    • Content-Typeapplication/json
    • 功能:將 JSON 格式的請求體解析為 Python 字典。
    • 適用場景:最常用的解析器,適合現代 RESTful API。
    • 示例
      POST /api/resource/
      Content-Type: application/json
      {"name": "test", "value": 42}
      
      解析后:request.data == {"name": "test", "value": 42}
  2. FormParser

    • Content-Typeapplication/x-www-form-urlencoded
    • 功能:解析 HTML 表單數據,轉換為 Python 字典。
    • 適用場景:傳統 Web 表單提交或簡單 API 測試。
    • 示例
      POST /api/resource/
      Content-Type: application/x-www-form-urlencoded
      name=test&value=42
      
      解析后:request.data == {"name": "test", "value": "42"}
  3. MultiPartParser

    • Content-Typemultipart/form-data
    • 功能:解析文件上傳和表單數據,文件存儲在 request.FILES,表單字段在 request.data
    • 適用場景:文件上傳場景,例如用戶頭像上傳。
    • 示例
      POST /api/upload/
      Content-Type: multipart/form-data
      name=test; file=@/path/to/file.txt
      
      解析后:request.data == {"name": "test"}, request.FILES == {"file": <UploadedFile>}
  4. FileUploadParser

    • Content-Type:任意(通常與 multipart/form-data 配合)
    • 功能:專門處理文件上傳,適用于直接上傳原始文件內容的場景。
    • 適用場景:流式文件上傳或單一文件 API。
    • 示例
      POST /api/file/
      Content-Type: application/octet-stream
      <binary file content>
      
      解析后:request.data == <UploadedFile>

2.3 配置解析器

解析器可以通過全局配置或視圖級別配置:

  • 全局配置settings.py):

    REST_FRAMEWORK = {'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser','rest_framework.parsers.MultiPartParser',]
    }
    
  • 視圖級別配置

    from rest_framework.views import APIView
    from rest_framework.parsers import JSONParserclass MyView(APIView):parser_classes = [JSONParser]  # 僅支持 JSON 解析def post(self, request, *args, **kwargs):return Response({"received": request.data})
    

2.4 自定義解析器

當需要支持非標準格式(如 XML、YAML)時,可以自定義解析器。自定義解析器需繼承 rest_framework.parsers.BaseParser 并實現 parse 方法。

示例:自定義 XML 解析器

from rest_framework.parsers import BaseParser
from xml.etree import ElementTree as ET
import ioclass XMLParser(BaseParser):media_type = 'application/xml'def parse(self, stream, media_type=None, parser_context=None):"""將 XML 數據解析為 Python 字典。stream: 包含請求體的字節流"""try:tree = ET.parse(stream)root = tree.getroot()data = self._xml_to_dict(root)return dataexcept ET.ParseError:raise ParseError("Invalid XML format")def _xml_to_dict(self, element):result = {}for child in element:child_data = self._xml_to_dict(child) if child else child.textif child.tag in result:if isinstance(result[child.tag], list):result[child.tag].append(child_data)else:result[child.tag] = [result[child.tag], child_data]else:result[child.tag] = child_datareturn result

配置到視圖:

class XMLView(APIView):parser_classes = [XMLParser]def post(self, request, *args, **kwargs):return Response({"parsed": request.data})

測試請求

POST /api/xml/
Content-Type: application/xml
<root><name>test</name><value>42</value></root>

響應{"parsed": {"name": "test", "value": "42"}}

2.5 實際應用案例

假設一個 API 需要同時支持 JSON 和文件上傳(multipart/form-data):

  • 視圖代碼

    from rest_framework.views import APIView
    from rest_framework.parsers import JSONParser, MultiPartParser
    from rest_framework.response import Responseclass UploadView(APIView):parser_classes = [JSONParser, MultiPartParser]def post(self, request, *args, **kwargs):if request.content_type == 'application/json':return Response({"json_data": request.data})elif request.content_type == 'multipart/form-data':return Response({"form_data": request.data,"files": {key: str(file) for key, file in request.FILES.items()}})return Response({"error": "Unsupported content type"})
    
  • 測試 JSON 請求

    POST /api/upload/
    Content-Type: application/json
    {"name": "test"}
    

    響應:{"json_data": {"name": "test"}}

  • 測試文件上傳

    POST /api/upload/
    Content-Type: multipart/form-data
    name=test; file=@/path/to/image.jpg
    

    響應:{"form_data": {"name": "test"}, "files": {"file": "<InMemoryUploadedFile: image.jpg>"}}

2.6 潛在問題與優化

  • 問題 1:解析性能
    對于大文件上傳,MultiPartParserFileUploadParser 可能導致內存占用過高。
    優化

    • 使用流式解析,結合 Django 的 TemporaryUploadedFile 處理大文件。
    • 限制上傳文件大小:
      REST_FRAMEWORK = {'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.MultiPartParser'],'FILE_UPLOAD_MAX_MEMORY_SIZE': 1024 * 1024 * 10  # 10MB
      }
      
  • 問題 2:Content-Type 錯誤
    客戶端可能發送錯誤的 Content-Type,導致解析失敗。
    優化

    • 在解析器中添加容錯邏輯,例如嘗試推斷數據格式。
    • 返回清晰的錯誤信息:
      from rest_framework.exceptions import ParseError
      if not request.content_type:raise ParseError("Missing Content-Type header")
      
  • 問題 3:多格式支持復雜性
    支持多種解析器可能導致視圖邏輯復雜。
    優化

    • 根據 request.content_type 動態選擇序列化器或處理邏輯。
    • 使用 DRF 的 GenericAPIViewmixins 簡化代碼。

三、API 版本控制與解析器的結合

在實際項目中,API 版本控制和解析器常常需要協同工作。例如,不同版本的 API 可能支持不同的數據格式(v1 只支持 JSON,v2 支持 JSON 和 XML)。以下是一個綜合案例:

綜合案例:版本化文件上傳 API

需求:

  • v1:只支持 JSON 格式的元數據上傳。
  • v2:支持 JSON 和 multipart/form-data(包含文件上傳)。

實現

  1. 配置版本控制和解析器

    # settings.py
    REST_FRAMEWORK = {'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning','DEFAULT_VERSION': 'v1','ALLOWED_VERSIONS': ['v1', 'v2'],'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser','rest_framework.parsers.MultiPartParser',]
    }
    
  2. URL 配置

    # urls.py
    from django.urls import path, re_path
    from myapp import viewsurlpatterns = [re_path(r'^api/(?P<version>v[1-2])/upload/$', views.UploadView.as_view()),
    ]
    
  3. 視圖邏輯

    from rest_framework.views import APIView
    from rest_framework.parsers import JSONParser, MultiPartParser
    from rest_framework.response import Response
    from rest_framework.exceptions import ParseErrorclass UploadView(APIView):def get_parser_classes(self):if self.request.version == 'v1':return [JSONParser]return [JSONParser, MultiPartParser]def post(self, request, *args, **kwargs):if request.version == 'v1':if request.content_type != 'application/json':raise ParseError("v1 only supports JSON")return Response({"version": "v1", "data": request.data})else:  # v2if request.content_type == 'application/json':return Response({"version": "v2", "json_data": request.data})elif request.content_type == 'multipart/form-data':return Response({"version": "v2","form_data": request.data,"files": {key: str(file) for key, file in request.FILES.items()}})raise ParseError("Unsupported content type")
    
  4. 測試請求

    • v1 JSON 請求

      POST /api/v1/upload/
      Content-Type: application/json
      {"name": "test"}
      

      響應:{"version": "v1", "data": {"name": "test"}}

    • v2 文件上傳

      POST /api/v2/upload/
      Content-Type: multipart/form-data
      name=test; file=@/path/to/image.jpg
      

      響應:{"version": "v2", "form_data": {"name": "test"}, "files": {"file": "<InMemoryUploadedFile: image.jpg>"}}

關鍵點分析

  • 動態解析器:通過重寫 get_parser_classes 方法,根據版本動態選擇解析器,增強靈活性。
  • 版本隔離:v1 和 v2 的邏輯清晰分離,避免代碼混淆。
  • 錯誤處理:通過 ParseError 提供明確的錯誤信息,提升客戶端體驗。

四、深入思考與創新建議

4.1 版本控制的創新設計

  • 動態版本路由:傳統版本控制方案(如 URLPathVersioning)需要手動配置路由。可以通過動態生成路由表(結合 django.urls 的動態解析)實現更靈活的版本管理。例如:

    def generate_versioned_urls(versions, viewset):return [path(f'api/{version}/resource/', viewset.as_view({'get': 'list'}))for version in versions]
    
  • 版本過渡策略:為避免客戶端因版本升級中斷服務,可以實現版本“漸進式淘汰”機制。例如,設置 Deprecation-Warning 響應頭,提醒客戶端某個版本即將廢棄:

    from rest_framework.response import Response
    class DeprecatedView(APIView):def get(self, request, *args, **kwargs):response = Response({"message": "This is v1"})if request.version == 'v1':response['Deprecation-Warning'] = 'Version 1 will be deprecated on 2026-01-01'return response
    

4.2 解析器的創新優化

  • 自適應解析器:針對復雜場景(如客戶端發送混合格式數據),可以開發自適應解析器,自動檢測數據格式并動態選擇解析策略。例如,結合 mimetypes 庫推斷文件類型。
  • 流式解析:對于大文件或高并發場景,開發支持流式解析的解析器,減少內存占用。DRF 的 FileUploadParser 已部分支持流式上傳,但可以進一步優化為異步解析,結合 asyncioaiohttp

4.3 性能與可擴展性

  • 緩存版本解析:通過中間件緩存版本解析結果,減少重復解析開銷:

    from django.utils.decorators import method_decorator
    from django.views.decorators.cache import cache_pageclass CachedVersionView(APIView):@method_decorator(cache_page(60*15))  # 緩存 15 分鐘def get(self, request, *args, **kwargs):return Response({"version": request.version})
    
  • 解析器優先級:為高頻使用的解析器(如 JSONParser)設置更高優先級,減少不必要的 Content-Type 檢查:

    REST_FRAMEWORK = {'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser',  # 優先'rest_framework.parsers.MultiPartParser','rest_framework.parsers.FormParser',]
    }
    

五、總結

DRF 的 API 版本控制和解析器是構建現代化 RESTful API 的核心組件。通過靈活的版本控制方案(URLPathVersioning、AcceptHeaderVersioning 等),開發者可以實現版本隔離與兼容;通過內置和自定義解析器(JSONParser、MultiPartParser 等),可以處理多樣化的客戶端請求數據。

關鍵洞察

  • 版本控制:選擇合適的版本控制方案需要權衡客戶端體驗、路由維護成本和 RESTful 規范。URLPathVersioning 和 NamespaceVersioning 是大型項目的首選。
  • 解析器:解析器的性能和靈活性直接影響 API 的效率和可擴展性,自定義解析器為特殊場景提供了無限可能。
  • 結合優化:版本控制與解析器的協同工作可以通過動態配置和錯誤處理實現更高的健壯性。

創新建議

  • 開發動態路由生成器,簡化版本管理。
  • 實現自適應解析器,提升數據格式兼容性。
  • 結合緩存和異步技術,優化高并發場景的性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89953.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89953.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89953.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windows系統暫停更新工具

功能說明 暫停更新至2999年恢復系統更新徹底禁用更新&#xff08;不可逆&#xff09; 使用方法 下載解壓后雙擊運行 .bat 文件 輸入數字選擇功能&#xff1a; 輸入 1&#xff1a;暫停更新至2999年&#xff08;推薦&#xff09;輸入 2&#xff1a;恢復系統更新輸入 3&#xf…

git push新版問題解決

git 好像不能通過username:password的方式來git push了。但我的電腦依然彈出username和password的彈窗。轉戰ssh來git push。由于之前是用git clone克隆的&#xff0c;需要再轉換成ssh的url來git push。

PyCharm + AI 輔助編程

PyCharm AI&#xff1a;初學者友好的 2 個實用場景&#xff08;附操作步驟&#xff09; PyCharm 專業版&#xff08;或通過插件集成&#xff09;支持 AI 輔助編程&#xff08;如 JetBrains AI 或 GitHub Copilot&#xff09;&#xff0c;能根據代碼上下文自動生成代碼、解釋邏…

瘋狂星期四文案網第15天運營日記

網站運營第15天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 昨日訪問量 昨天只有20來ip, 太慘了&#xff0c;感覺和最近沒有發新段子有關&#xff0c;也沒有發新的外鏈&#xff0c;不知道這周四會怎么樣 昨日搜…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘Cython’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘Cython’問題 摘要 在使用 PyCharm 控制臺或命令行執行 pip install Cython 時&#xff0c;常會遇到 ModuleNotFoundError: No module named Cython 的報錯。本…

freertos任務調度關鍵函數理解 vTaskSwitchContext

void vTaskSwitchContext(void) {//my_printf( "uxSchedulerSuspended %d\n", uxSchedulerSuspended );/* 調度器處于掛起狀態 */if (uxSchedulerSuspended ! (UBaseType_t)pdFALSE) {/*** The scheduler is currently suspended - do not allow a context* switch.…

CPU 密集型 和 I/O 密集型 任務

文章目錄**CPU 密集型任務&#xff08;CPU-bound&#xff09;**定義&#xff1a;特點&#xff1a;常見場景&#xff1a;如何優化 CPU 密集型任務&#xff1a;**I/O 密集型任務&#xff08;I/O-bound&#xff09;**定義&#xff1a;特點&#xff1a;常見場景&#xff1a;如何優化…

[2025CVPR-小目標檢測方向]基于特征信息驅動位置高斯分布估計微小目標檢測模型

核心問題 ?小目標檢測性能差&#xff1a;?? 盡管通用目標檢測器&#xff08;如 Faster R-CNN, YOLO, SSD&#xff09;在常規目標上表現出色&#xff0c;但在檢測微小目標&#xff08;如 AI-TOD 基準定義的&#xff1a;非常小目標 2-8 像素&#xff0c;小目標 8-16 像素&…

三大工廠設計模式

1.簡單工廠模式1.1需求入手從需求進行入手&#xff0c;可以更深入的理解什么是設計模式。有一個制作披薩的需求&#xff1a;需要便于擴展披薩的種類&#xff0c;便于維護。1.披薩的種類有很多&#xff1a;GreekPizz&#xff0c;CheesePizz等2.披薩的制作流程&#xff1a;prepar…

SpringBoot--Mapper XML 和 Mapper 接口在不同包

&#x1f9e9; 背景說明在 Spring Boot 中&#xff0c;MyBatis 默認要求 Mapper 接口和 XML 文件位于相同包路徑。 但在實際項目中&#xff0c;為了模塊化或結構清晰&#xff0c;常將 XML 放在 resources/mybatis/... 下&#xff0c;這種做法就必須進行額外配置。&#x1f4c1;…

公交車客流人數統計管理解決方案:智能化技術與高效運營實踐

1. 引言公交車作為城市公共交通的核心組成部分&#xff0c;其客流數據的精準統計與管理直接影響運營效率、調度優化和乘客體驗。傳統的人工統計方式效率低、誤差大&#xff0c;難以滿足現代智慧交通的需求。隨著人工智能&#xff08;AI&#xff09;、物聯網&#xff08;IoT&…

正則表達式完全指南:從入門到實戰

目錄 一、什么是正則表達式&#xff1f; 二、基礎語法速查表 三、進階特性 1.分組與捕獲 2.非捕獲分組 3.前瞻與后顧 4.貪婪與懶惰匹配 四、實戰案例 案例1&#xff1a;驗證手機號 案例2&#xff1a;提取網頁中所有鏈接 案例3&#xff1a;密碼強度驗證 一、什么是正…

SmartETL循環流程的設計與應用

1. 引言 **檢索增強生成&#xff08;RAG&#xff09;**是指通過檢索對大模型生成進行增強的技術&#xff0c;通過充分利用信息檢索&#xff08;尤其是語義檢索&#xff09;相關技術&#xff0c;實現大模型快速擴展最新知識、有效減少幻覺的能力。主流RAG框架包括問題理解、知識…

uni-app開發小程序,根據圖片提取主題色值

需求&#xff0c;在頁面根據傳入的圖片提取圖片主色值并用來設置區塊背景色<template><view class"icon-container"><view class"sport-icon" :style"{ backgroundColor: mainColor }"><image :src"/static/images/sp…

ESP32-Cam三腳架機器人:DIY你的智能移動監控平臺

項目概述 在物聯網與機器人技術融合發展的今天&#xff0c;基于ESP32的創意項目層出不窮。今天為大家介紹一款極具創新性的ESP32-Cam三腳架機器人&#xff08;Dodge&#xff09;&#xff0c;它將傳統三腳架結構與智能監控功能完美結合&#xff0c;通過巧妙的機械設計和開源硬件…

Kotlin集合過濾

過濾操作 在處理集合時&#xff0c;根據特定條件過濾集合或檢查集合中是否包含符合特定條件的元素是軟件開發中的常見任務。為了解決這個問題&#xff0c;我們可以使用 Kotlin 中實現的函數式 API。 在本主題中&#xff0c;我們將介紹如何使用謂詞過濾集合&#xff0c;并獲得滿…

14.8 LLaMA2-7B×Dolly-15K實戰:從準確率63%到89%,如何用優質數據讓大模型性能飆升42%?

LLaMA2-7BDolly-15K實戰:從準確率63%到89%,如何用優質數據讓大模型性能飆升42%? 在大模型微調中,“數據質量”往往比“數據數量”更能決定最終效果。Databricks發布的Dolly-15K數據集以“全人工標注+多維度校驗”的特點,成為指令微調的“黃金樣本”——用它微調后的LLaMA…

OpenCV中常用特征提取算法(SURF、ORB、SIFT和AKAZE)用法示例(C++和Python)

OpenCV 中提供了多種常用的特征提取算法&#xff0c;廣泛應用于圖像匹配、拼接、SLAM、物體識別等任務。以下是 OpenCV 中幾個主流特征提取算法的 用法總結與代碼示例&#xff0c;涵蓋 C 和 Python 兩個版本。常用特征提取算法列表算法特點是否需額外模塊SIFT&#xff08;尺度不…

復雜度+包裝類型+泛型

什么是集合框架什么是數據結構什么是算法時間復雜度與空間復雜度的概念時間復雜度的表達方式時間復雜度的大 O 的漸近表示法時間復雜度函數的大小排序包裝類和泛型基本數據類型和對應的包裝類型包裝類型出現的原因什么叫做裝箱&#xff08;裝包&#xff09;和拆箱&#xff08;拆…

硬件設計學習DAY15——自舉電容:MOSFET高端驅動的核心奧秘

每日更新教程&#xff0c;評論區答疑解惑&#xff0c;小白也能變大神&#xff01;" 目錄 一.自舉電容 1.自舉電容的作用 2.自舉電路原理 3.工作過程分析 4.實際應用中的問題 5.關鍵要點 二.自舉電容實現MOSFET高端驅動 2.1MOSFET半橋高端驅動的基本原理 2.2自舉電…