Django REST Framework 簡介:使用示例進行開發
已發表: 2020-10-05Django REST 框架作為標準 Python 包廣泛分發,用戶可能需要它來開始開發 RESTful API。 它複雜、功能強大、非常易於使用,並為 API 提供了一個有吸引力且可瀏覽的版本。 Django REST 框架提供了返回 JSON 對象的選項。 該框架提供了強大的模型序列化功能,並在完全 REST 查看器中完全使用基於基本功能的視圖來顯示數據。 了解更多關於以下Django REST 框架的信息:
目錄
什麼是 Django REST 框架?
Django REST Framework 是一個靈活且健壯的工具包,可讓開發人員輕鬆構建 Web API。 它還為 API 提供基於類的通用視圖和序列化程序。 作為一個源代碼,它被縮寫為 DRF,它代表一個用於開發 Web 應用程序編程接口的 Python 庫。 與本文一樣,我們正在討論帶有分步說明的開發 API。
但在開始使用本指南之前,重要的是要了解該框架為何如此重要。 許多可用的框架允許開發人員輕鬆地為其塊應用程序構建 API,但首選 Django REST 框架。 該框架易於以多種方式使用,並具有以下優點-
- 它為 Web 瀏覽器提供了一個強大的應用程序編程接口,這對開發人員來說是一個巨大的勝利
- 它具有身份驗證策略,包括 OAuth1、OAuth2 等的包
- 其中的序列化處理器支持 ORM 和非 ORM 數據源
- 這個框架有大量的文檔並且提供了很好的社區支持
- 它被偉大的平台使用和信任,包括 Mozilla、Heroku、RedHat 等。
閱讀: Django 應用程序:你需要知道的一切
設置 Django REST 框架開發
對於初學者,您必須為操作系統安裝 Python 依賴項。 如果您使用的是 Windows 平台,您可以通過虛擬框或手動命令輕鬆地將 Linux 平台安裝為您的輔助操作系統。 要繼續使用該框架,您可以使用有效且方便的 Python 管理工具。
大多數工具都是首選助手。 它們允許開發人員快速更改 Python 版本、設置項目特定版本、管理虛擬環境以及在系統上安裝多個版本。 如果您使用的是 Linux 或 Mac 操作系統,安裝它會很容易。

在Django REST 框架的幫助下,我們可以將非 RESTful 應用程序轉換為 RESTful 應用程序。 這包括以下提到的程序-
DRF 設置
對於 DRF 設置,您必須安裝 -
貝殼
$ pip install djangorestframework
$ pip freeze > requirements.txt
更新設置:py:
Python
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'講話',
'rest_framework'
)
RESTful 結構
在 RESTful API 開發中,端點表示其結構和用戶在 GET、PUT、POST、DELETE 等方法的幫助下從應用程序訪問。 這些端點在邏輯上圍繞元素和集合進行組織,這兩者都被視為資源。 如果只有一個資源,則相應的鏈接將用作元素和集合的 URL。
得到
郵政
放
刪除
/帖子/
顯示所有帖子
添加新帖子
更新所有帖子
刪除所有帖子
/posts/<id>
顯示 <id>
不適用
更新 <id>
刪除標識
序列化器和視圖
Django REST 框架的主要構建塊是序列化器,它們用於詳細說明基於 Django 模型的各種數據記錄的表示。 序列化器是標準的 Python 類,可以從框架中繼承模型的行為。
在序列化程序類中,存在使用同一框架包中的數據類型的單獨字段集。 他們還注意到框架和類之間的相似之處。 序列化程序類本身不會思考,它們與管理大量 REST 服務邏輯的視圖集成在一起。 此外,它使用序列化程序類來轉換數據。 例如,一個常規的 Django 視圖方法是——
從 coffeehouse.stores.models 導入商店
從咖啡屋.stores.serializers 導入 StoreSerializer
從 rest_framework.decorators 導入 api_view
從 rest_framework.response 導入響應
@api_view(['GET','POST','DELETE'])
def rest_store(請求):
如果 request.method == 'GET':
商店 = Store.objects.all()
序列化器 = StoreSerializer(商店,許多 = True)
返迴響應(serializer.data)
elif request.method == 'POST':
… #用於 HTTP POST 操作的邏輯
elif request.method == '刪除':
… #用於 HTTP DELETE 操作的邏輯
基於類的視圖
在基於類的視圖的幫助下, Django REST 框架提供了對用戶最高和復雜功能的訪問。 基於類的視圖提供了真正成熟的 Python 類的功能,並允許 Django 視圖在面向對象的編程原則的幫助下輕鬆操作,從而實現更高的可重用性和更短的實現時間。
Django 基於類的視圖突出了構建 Django 視圖的強大方法,它們也是用於構建 API 的方法的替代方法。 要開發基於類的視圖,重要的是創建一個可以從其他類之一繼承的類。 例如:
#views.py
從 Django.views.generic 導入 TemplateView
關於索引類(模板視圖):
模板名稱 = 'index.html'
def get_context_data(self, **kwargs):

# **kwargs 包含關鍵字上下文初始化值(如果有)
# 調用基本實現以獲取上下文
context = super(AboutIndex, self).get_context_data(**kwargs)
# 添加上下文數據以傳遞給模板
context['aboutdata'] = '自定義數據'
返回上下文
# urls.py
從咖啡屋.about.views 導入 AboutIndex
from django.urls 導入路徑
網址模式 = [
path('about/index/',AboutIndex.as_view(),{'onsale':True}),
結帳:針對初學者的 12 大 Django 面試問題和答案
更新視圖
為了適應 RESTful 應用程序結構,重構當前視圖很重要。 您可以註釋掉這些視圖並將它們添加為-
Python
從 django.shortcuts 導入渲染
從 django.http 導入 HttpResponse
從 rest_framework.decorators 導入 api_view
從 rest_framework.response 導入響應
從talk.models導入帖子
從 talk.serializers 導入 PostSerializer
從 talk.forms 導入 PostForm
默認主頁(請求):
tmpl_vars = {'form': PostForm()}
返回渲染(請求,'talk/index.html',tmpl_vars)
@api_view(['GET'])
def post_collection(請求):
如果 request.method == 'GET':
帖子 = Post.objects.all()
序列化器 = PostSerializer(posts, many=True)
返迴響應(serializer.data)
@api_view(['GET'])
def post_element(請求,pk):
嘗試:
post = Post.objects.get(pk=pk)
除了 Post.DoesNotExist:
返回 HttpResponse(狀態=404)
如果 request.method == 'GET':
序列化器 = PostSerializer(post)
返迴響應(serializer.data)
解釋
- 在上面給出的指令中,@api_view 裝飾器分析了相應的 HTTP 請求,該請求被傳遞到視圖函數中。
- 現在視圖要么使用單個帖子,如果它是一個元素,或者抓取整個數據,如果它是集合
- 最後,數據現在被序列化為 JSON 並相應返回
Web 可瀏覽 API 或更新的 URL
Python 的一些更新的 URL 是:
# 談話網址
從 django.conf.urls 導入模式,URL
urlpatterns = 模式(
'talk.views',
網址(r'^$','家'),
# 接口
url(r'^api/v1/posts/$', 'post_collection'),
url(r'^api/v1/posts/(?P<pk>[0-9]+)$', 'post_element')
)
RESTful API 集成重構
它包括主要的 HTTP 方法,例如-
得到
初始頁面加載,顯示帖子很重要,為此,您可以添加以下請求:
加載帖子()
// 在頁面加載時加載所有帖子
函數 load_posts() {
$.ajax({
url : “api/v1/posts/”, // 端點
type : “GET”, // http 方法
// 處理成功的響應
成功:函數(json){
for (var i = 0; i < json.length; i++) {
控制台.log(json[i])
$(“#talk”).prepend(“<li id='post-“+json[i].id+”'><strong>”+json[i].text+”</strong> – <em>” +json[i].author+”</em> – <span>“+json[i].created+
“</span> – <a id='delete-post-“+json[i].id+”'>刪除我</a></li>”);
}
},
// 處理不成功的響應
錯誤:函數(xhr,errmsg,err){
$('#results').html(“<div class='alert-box alert radius' data-alert>糟糕!我們遇到了錯誤:“+errmsg+
” <a href='#' class='close'>×</a></div>”); // 將錯誤添加到 dom
console.log(xhr.status + “:” + xhr.responseText); // 向控制台提供有關錯誤的更多信息
}
});
};
郵政
POST 請求以類似的方式進行管理,您可以通過更新視圖來測試這一點。 你可以在views.py中更新post_collection()函數:
@api_view(['GET', 'POST'])
def post_collection(請求):
如果 request.method == 'GET':
帖子 = Post.objects.all()
序列化器 = PostSerializer(posts, many=True)
返迴響應(serializer.data)
elif request.method == 'POST':
data = {'text': request.DATA.get('the_post'), 'author': request.user.pk}
序列化器= PostSerializer(數據=數據)
如果 serializer.is_valid():
序列化器.save()

返迴響應(serializer.data,status=status.HTTP_201_CREATED)
返迴響應(serializer.errors,狀態=狀態。HTTP_400_BAD_REQUEST)
另請閱讀:印度的 Django 開發人員薪水
底線
實際的Django REST framework的 REST 部分非常簡單,您所要做的就是更新 post 元素函數以處理請求。 如果您仍有任何疑問,那麼有許多 Django REST 框架和資源可用於即興創作。
如果您有興趣了解有關 Django 和其他全棧開發人員語言和工具的更多信息,請查看 upGrad 和 IIIT-B 的全棧軟件開發 PG 文憑,該文憑專為在職專業人士設計,提供 500 多個小時的嚴格培訓, 9 個以上的項目和任務、IIIT-B 校友身份、實用的實踐頂點項目和頂級公司的工作協助。