RESTful架構(gòu),,即表現(xiàn)層狀態(tài)轉(zhuǎn)移(Representational State Transfer),是一種軟件架構(gòu)風(fēng)格,,主要用于設(shè)計(jì)網(wǎng)絡(luò)應(yīng)用程序,。它通過HTTP協(xié)議定義了客戶端與服務(wù)器之間的通信方式,強(qiáng)調(diào)簡潔,、可擴(kuò)展和高性能,。RESTful架構(gòu)以其簡潔的設(shè)計(jì)和明確的接口規(guī)范,成為現(xiàn)代Web開發(fā)的首選方法之一,。應(yīng)用場(chǎng)景 RESTful架構(gòu)廣泛應(yīng)用于各種網(wǎng)絡(luò)應(yīng)用中,,從簡單的網(wǎng)站到復(fù)雜的在線服務(wù)。它被用于構(gòu)建各種規(guī)模的API,,支持不同類型的客戶端,,如網(wǎng)頁瀏覽器、移動(dòng)應(yīng)用和桌面程序,。許多知名的在線服務(wù),,如社交媒體平臺(tái)、電子商務(wù)網(wǎng)站和云服務(wù)提供商,,都采用了RESTful API來提供數(shù)據(jù)和服務(wù),。這種架構(gòu)的靈活性和可擴(kuò)展性使其成為跨平臺(tái)應(yīng)用的理想選擇。 01 RESTful架構(gòu) REST(Representational State Transfer)是一種軟件架構(gòu)風(fēng)格,它定義了客戶端和服務(wù)器之間如何通過HTTP協(xié)議進(jìn)行通信,。RESTful架構(gòu)具有以下特點(diǎn): 1. 無狀態(tài) 服務(wù)器不存儲(chǔ)任何客戶端請(qǐng)求的狀態(tài),,每個(gè)請(qǐng)求都包含所有必要的信息。 代碼樣例:模擬一個(gè)簡單的無狀態(tài)請(qǐng)求 defstateless_request(user_id, data): ''' 模擬一個(gè)無狀態(tài)請(qǐng)求,,服務(wù)器不存儲(chǔ)用戶狀態(tài),,每次請(qǐng)求都需提供用戶ID和數(shù)據(jù)。 ''' # 處理請(qǐng)求,,例如查詢用戶信息 user_info = get_user_info(user_id) # 返回響應(yīng) return{'status':'success','user_info': user_info}
2. 統(tǒng)一接口 使用標(biāo)準(zhǔn)的HTTP方法(如GET,、POST、PUT,、DELETE)來操作資源,。 代碼樣例:定義一個(gè)資源的操作接口 classResourceAPI: ''' 定義一個(gè)資源的操作接口,使用標(biāo)準(zhǔn)HTTP方法,。 ''' defget(self, resource_id): ''' GET方法:獲取資源信息,。 ''' # 獲取資源 resource = get_resource(resource_id) return resource
defpost(self, data): ''' POST方法:創(chuàng)建新資源。 ''' # 創(chuàng)建資源 new_resource = create_resource(data) return new_resource
defput(self, resource_id, data): ''' PUT方法:更新資源信息,。 ''' # 更新資源 update_resource(resource_id, data) return{'status':'updated'}
defdelete(self, resource_id): ''' DELETE方法:刪除資源,。 ''' # 刪除資源 delete_resource(resource_id) return{'status':'deleted'}
3. 資源標(biāo)識(shí) 每個(gè)資源都有一個(gè)唯一的URI(統(tǒng)一資源標(biāo)識(shí)符)。 代碼樣例:定義資源的URI defget_resource_uri(resource_id): ''' 根據(jù)資源ID生成資源的URI,。 ''' # 生成URI uri =f'/api/resources/{resource_id}' return uri
4. 表現(xiàn)層與數(shù)據(jù)層分離 客戶端通過請(qǐng)求資源的表現(xiàn)形式(如JSON,、XML)來獲取數(shù)據(jù)。 代碼樣例:返回資源的不同表現(xiàn)形式 defget_resource_representation(resource, format_type): ''' 根據(jù)請(qǐng)求的表現(xiàn)形式(JSON或XML)返回資源數(shù)據(jù),。 ''' if format_type =='json': # 返回JSON格式的資源數(shù)據(jù) return json.dumps(resource) elif format_type =='xml': # 返回XML格式的資源數(shù)據(jù) return dicttoxml(resource) else: return'Unsupported format'
以上代碼樣例展示了RESTful架構(gòu)的各個(gè)特點(diǎn),,幫助理解其在實(shí)際應(yīng)用中的實(shí)現(xiàn)方式。
02 DRF入門簡介
DRF是一個(gè)功能強(qiáng)大的工具包,,用于構(gòu)建Web API,。它是Django的一個(gè)第三方庫,提供了以下優(yōu)勢(shì):
1. 序列化 將Django模型轉(zhuǎn)換為JSON,、XML等格式,,方便客戶端解析。 代碼樣例:定義一個(gè)序列化器 from rest_framework import serializers from.models import MyModel
classMyModelSerializer(serializers.ModelSerializer): ''' 將Django模型MyModel轉(zhuǎn)換為JSON,、XML等格式,。 ''' classMeta: model = MyModel fields ='__all__'# 序列化所有字段
2. 視圖和路由 簡化API視圖的編寫,支持多種視圖類型和自動(dòng)路由,。 代碼樣例:定義一個(gè)視圖和路由 from rest_framework import viewsets from.models import MyModel from.serializers import MyModelSerializer
classMyModelViewSet(viewsets.ModelViewSet): ''' 提供對(duì)MyModel的增刪改查操作,。 ''' queryset = MyModel.objects.all() serializer_class = MyModelSerializer
# 路由配置(通常在urls.py中定義) from rest_framework.routers import DefaultRouter from.views import MyModelViewSet
router = DefaultRouter() router.register(r'mymodel', MyModelViewSet) # 自動(dòng)生成的路由包括:/mymodel/ 和 /mymodel/{id}/
3. 認(rèn)證和權(quán)限 提供多種認(rèn)證方式和權(quán)限控制,確保API的安全性,。 代碼樣例:自定義權(quán)限類 from rest_framework import permissions
classIsOwnerOrReadOnly(permissions.BasePermission): ''' 自定義權(quán)限,,只允許資源所有者編輯,。 ''' defhas_object_permission(self, request, view, obj): if request.method in permissions.SAFE_METHODS: returnTrue return obj.owner == request.user
4. 文檔生成 自動(dòng)生成API文檔,方便開發(fā)者和用戶了解API的使用方法,。 DRF的自動(dòng)文檔功能不需要額外的代碼樣例,,它會(huì)根據(jù)視圖和序列化器自動(dòng)生成文檔。 通常在項(xiàng)目的settings.py中配置文檔相關(guān)的設(shè)置,,如: REST_FRAMEWORK ={ 'DEFAULT_SCHEMA_CLASS':'rest_framework.schemas.coreapi.AutoSchema', }
DRF入門示例以下是一個(gè)簡單的DRF入門示例,展示如何創(chuàng)建一個(gè)簡單的API來獲取學(xué)科信息: 安裝Django REST Framework在終端中運(yùn)行以下命令來安裝DRF: pip install djangorestframework
定義模型在Django應(yīng)用的models.py 文件中定義學(xué)科模型: from django.db import models
class Subject(models.Model): name = models.CharField(max_length=100) description = models.TextField()
def __str__(self): return self.name
創(chuàng)建序列化器在應(yīng)用的serializers.py 文件中創(chuàng)建序列化器: from rest_framework import serializers from .models import Subject
class SubjectSerializer(serializers.ModelSerializer): class Meta: model = Subject fields = ['id', 'name', 'description']
創(chuàng)建視圖在應(yīng)用的views.py 文件中創(chuàng)建視圖集: from rest_framework import viewsets from .models import Subject from .serializers import SubjectSerializer
class SubjectViewSet(viewsets.ModelViewSet): queryset = Subject.objects.all() serializer_class = SubjectSerializer
配置路由在應(yīng)用的urls.py 文件中配置路由: from django.urls import path, include from rest_framework.routers import DefaultRouter from .views import SubjectViewSet
router = DefaultRouter() router.register(r'subjects', SubjectViewSet)
urlpatterns = [ path('', include(router.urls)), ]
測(cè)試API現(xiàn)在,,你可以通過以下HTTP方法來獲取和操作學(xué)科信息: - GET請(qǐng)求到
/subjects/ 將列出所有學(xué)科,。 - POST請(qǐng)求到
/subjects/ 將創(chuàng)建一個(gè)新的學(xué)科。 - GET請(qǐng)求到
/subjects/{id}/ 將獲取指定ID的學(xué)科詳細(xì)信息,。 - PUT請(qǐng)求到
/subjects/{id}/ 將更新指定ID的學(xué)科信息,。 - DELETE請(qǐng)求到
/subjects/{id}/ 將刪除指定ID的學(xué)科。
通過這個(gè)示例,,你可以快速了解如何使用Django REST Framework創(chuàng)建簡單的API,。每個(gè)步驟都清晰地展示了從安裝到測(cè)試的完整流程,幫助你掌握DRF的基本用法,。 我們創(chuàng)建了一個(gè)簡單的DRF API,,可以使用HTTP方法(如GET、POST)來獲取和操作學(xué)科信息,。DRF的強(qiáng)大功能和簡潔的語法使得構(gòu)建RESTful API變得輕松高效,。 RESTful架構(gòu)和DRF入門”的綜合案例
本文由python工程師俱樂部獨(dú)家發(fā)布,請(qǐng)?jiān)讷@得賬號(hào)管理員授權(quán)后轉(zhuǎn)載,。策劃:清風(fēng) 丨 監(jiān)制:明月
編輯:嘯嘯 丨 圖片來源:稿定設(shè)計(jì)及網(wǎng)絡(luò),,侵刪 熟悉嘯嘯的小伙伴都知道,只要有空,,我答疑都是免費(fèi)的,,不收任何粉絲的紅包。但是,,為了篩選出一批真正想跟嘯嘯學(xué)習(xí)python的粉絲小友,,給你提供一個(gè)干凈高效的python圈子,真正回歸技術(shù)交流,;由資深工程師嘯嘯帶頭發(fā)起[python俱樂部]知識(shí)星球,,面向編程行業(yè)技術(shù)從業(yè)者們。與1000+工程師一起分享技術(shù),、經(jīng)驗(yàn),、資源。星球內(nèi)有海量項(xiàng)目案例分享,、大佬實(shí)戰(zhàn)經(jīng)驗(yàn)分享,、1v1有問必答,、運(yùn)維崗位內(nèi)推、還有N多實(shí)用工具和資料干貨,,囊括了各種技術(shù)知識(shí)點(diǎn),,行業(yè)數(shù)據(jù)分析報(bào)告等等。如果你對(duì)編程感興趣,,或者正在學(xué)習(xí)編程,,歡迎加入我的編程俱樂部。下篇開始學(xué)習(xí)RESTfuI架構(gòu)和DRF進(jìn)階,,內(nèi)容如下:RESTful架構(gòu)和DRF進(jìn)階 在現(xiàn)代Web開發(fā)中,,RESTful架構(gòu)已成為構(gòu)建高效、可擴(kuò)展API的首選方法,。它通過定義清晰的資源和統(tǒng)一的接口,,使得客戶端與服務(wù)器之間的通信更加簡潔和直觀。隨著技術(shù)的不斷發(fā)展,,開發(fā)者對(duì)RESTful API的需求也在不斷增長,,這就需要更深入地理解和掌握RESTful架構(gòu)的設(shè)計(jì)原則和最佳實(shí)踐。 資源設(shè)計(jì) 深入理解RESTful架構(gòu)中的資源概念是至關(guān)重要的,。資源是RESTful API中的核心,,它們代表了系統(tǒng)中的實(shí)體或數(shù)據(jù)。合理劃分資源邊界,,為每個(gè)資源設(shè)計(jì)合適的URI,,是構(gòu)建RESTful API的基礎(chǔ)。例如,,對(duì)于一個(gè)在線教育平臺(tái),,可以將課程、教師和學(xué)生作為不同的資源,,分別為它們?cè)O(shè)計(jì)如下URI: /courses/ /teachers/ /students/
同時(shí),,考慮資源之間的關(guān)系,使用嵌套URI或超媒體鏈接來表示資源的關(guān)聯(lián),。例如,,獲取某個(gè)課程下的所有教師: /courses/{course_id}/teachers/
版本控制 隨著API的不斷迭代和升級(jí),版本控制變得尤為重要,。學(xué)習(xí)如何在RESTful API中實(shí)現(xiàn)版本控制,,可以確保API的兼容性和穩(wěn)定性。常見的版本控制方式包括: - 通過請(qǐng)求頭:
Accept: application/vnd.myapi.v1+json - 通過查詢參數(shù):
/api/courses/?version=1
在Django REST Framework中,,可以使用Versioning 類來自定義版本控制策略,,例如: from rest_framework.versioning import URLPathVersioning
class MyVersioning(URLPathVersioning): default_version = 'v1' allowed_versions = ['v1', 'v2'] version_param = 'version'
緩存優(yōu)化 利用HTTP緩存機(jī)制來提高API的性能和響應(yīng)速度。掌握如何設(shè)置緩存相關(guān)的HTTP頭部,,如Cache-Control ,、ETag 和Last-Modified 等,,合理緩存資源數(shù)據(jù),減少服務(wù)器的負(fù)載和網(wǎng)絡(luò)傳輸量,。在DRF中,,可以使用CachePage 視圖裝飾器或自定義緩存類來實(shí)現(xiàn)緩存功能,例如: from rest_framework.decorators import api_view, cache_page
@api_view(['GET']) @cache_page(60 * 15) # 緩存15分鐘 def course_list(request): # 獲取課程列表的邏輯 pass
錯(cuò)誤處理 設(shè)計(jì)統(tǒng)一的錯(cuò)誤響應(yīng)格式,,對(duì)API中的各種異常情況進(jìn)行合理的捕獲和處理,。返回清晰、友好的錯(cuò)誤信息,,幫助客戶端開發(fā)者快速定位和解決問題,。在DRF中,可以自定義異常處理函數(shù),,例如: from rest_framework.views import exception_handler from rest_framework.response import Response
def custom_exception_handler(exc, context): response = exception_handler(exc, context) if response is not None: response.data = { 'code': response.status_code, 'message': str(exc), 'data': None } return response
DRF擴(kuò)展 探索DRF提供的各種擴(kuò)展功能,,如分頁,、過濾,、排序等,根據(jù)實(shí)際需求進(jìn)行定制和優(yōu)化,。例如,,使用DjangoFilterBackend 實(shí)現(xiàn)過濾功能: from django_filters.rest_framework import DjangoFilterBackend
class CourseViewSet(viewsets.ModelViewSet): queryset = Course.objects.all() serializer_class = CourseSerializer filter_backends = [DjangoFilterBackend] filterset_fields = ['name', 'teacher']
同時(shí),學(xué)習(xí)如何編寫自定義的擴(kuò)展類,,進(jìn)一步提升DRF的靈活性和可擴(kuò)展性,。例如,自定義分頁類: from rest_framework.pagination import PageNumberPagination
class LargeResultsSetPagination(PageNumberPagination): page_size = 100 page_size_query_param = 'page_size' max_page_size = 1000
通過深入學(xué)習(xí)RESTful架構(gòu)和DRF的進(jìn)階知識(shí),,開發(fā)者可以更好地應(yīng)對(duì)復(fù)雜的業(yè)務(wù)場(chǎng)景,,構(gòu)建出更加高效、穩(wěn)定和易于維護(hù)的API,。這不僅有助于提升個(gè)人的技術(shù)水平,,也為團(tuán)隊(duì)和項(xiàng)目帶來更大的價(jià)值。搶先掌握這些知識(shí),,讓你在Web開發(fā)領(lǐng)域更具競(jìng)爭(zhēng)力,!
|