摘要:目前我們的中的關系通過使用主鍵來表示。在本教程的這一部分中,我們將改進的內聚力和可發現性,而不是使用超鏈接來進行關系。將相關實體嵌套在父表示內。
目前我們的API中的關系通過使用主鍵來表示。在本教程的這一部分中,我們將改進API的內聚力和可發現性,而不是使用超鏈接來進行關系。
為我們的API的根創建一個端點
現在我們有"snippets"和"users"的端點,但是我們的API沒有一個入口點。要創建一個,我們將使用一個常規的基于函數的視圖和@api_view我們之前介紹的裝飾器。在你的snippets/views.py添加:
from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework.reverse import reverse @api_view(["GET"]) def api_root(request, format=None): return Response({ "users": reverse("user-list", request=request, format=format), "snippets": reverse("snippet-list", request=request, format=format) })
這里應該注意兩件事情。首先,我們使用REST框架的reverse功能來返回完全限定的URL; 第二,URL模式是通過方便的名稱來識別的,我們稍后會在此聲明snippets/urls.py。
為突出顯示的片段創建端點
我們的pastebin API中仍然缺少的另一個明顯的事情是代碼突出顯示端點。
與所有其他API端點不同,我們不想使用JSON,而只是呈現HTML表示。REST框架提供了兩種HTML渲染器樣式,一種用于處理使用模板呈現的HTML,另一種用于處理預呈現的HTML。第二個渲染器是我們要用于此端點的渲染器。
在創建代碼高亮度視圖時,我們需要考慮的另一件事是,我們可以使用現有的具體通用視圖。我們不是返回一個對象實例,而是一個對象實例的屬性。
而不是使用具體的通用視圖,我們將使用基類來表示實例,并創建我們自己的.get()方法。在你的snippets/views.py添加:
from rest_framework import renderers from rest_framework.response import Response class SnippetHighlight(generics.GenericAPIView): queryset = Snippet.objects.all() renderer_classes = (renderers.StaticHTMLRenderer,) def get(self, request, *args, **kwargs): snippet = self.get_object() return Response(snippet.highlighted)
像往常一樣,我們需要添加我們在URLconf中創建的新視圖。我們將為我們的新API根添加一個url模式snippets/urls.py:
url(r"^$", views.api_root),
然后為代碼片段添加一個url模式:
url(r"^snippets/(?P[0-9]+)/highlight/$", views.SnippetHighlight.as_view()),
超鏈接我們的API
處理實體之間的關系是Web API設計中更具挑戰性的方面之一。我們可以選擇代表關系的一些不同的方式:
使用主鍵
在實體之間使用超鏈接。
在相關實體上使用唯一的標識字段。
使用相關實體的默認字符串表示形式。
將相關實體嵌套在父表示內。
一些其他自定義表示。
REST框架支持所有這些樣式,并且可以將它們應用于正向或反向關系,也可以在諸如通用外鍵之類的自定義管理器上應用。
在這種情況下,我們希望在實體之間使用超鏈接樣式。為了這樣做,我們將修改我們的序列化程序來擴展HyperlinkedModelSerializer而不是現有的ModelSerializer。
在HyperlinkedModelSerializer有以下區別ModelSerializer:
id默認情況下不包括該字段。
它包括一個url字段,使用HyperlinkedIdentityField。
關系使用HyperlinkedRelatedField,而不是PrimaryKeyRelatedField。
我們可以輕松地重新編寫我們現有的序列化程序來使用超鏈接。在你的snippets/serializers.py添加:
class SnippetSerializer(serializers.HyperlinkedModelSerializer): owner = serializers.ReadOnlyField(source="owner.username") highlight = serializers.HyperlinkedIdentityField(view_name="snippet-highlight", format="html") class Meta: model = Snippet fields = ("url", "id", "highlight", "owner", "title", "code", "linenos", "language", "style") class UserSerializer(serializers.HyperlinkedModelSerializer): snippets = serializers.HyperlinkedRelatedField(many=True, view_name="snippet-detail", read_only=True) class Meta: model = User fields = ("url", "id", "username", "snippets")
請注意,我們還添加了一個新的"highlight"字段。該字段與url字段的類型相同,只是它指向"snippet-highlight"url模式,而不是"snippet-detail"url模式。
因為我們已經包括格式后綴的URL ".json",所以我們還需要在highlight字段上指出任何格式后綴的超鏈接它應該使用".html"后綴。
確保我們的URL模式被命名
如果我們要有一個超鏈接的API,我們需要確保我們命名我們的URL模式。我們來看看我們需要命名的URL模式。
我們的API的根源是指"user-list"和"snippet-list"。
我們的片段序列化程序包括一個引用的字段"snippet-highlight"。
我們的用戶串行器包括一個引用的字段"snippet-detail"。
我們的片段和用戶序列化程序包括"url"默認情況下將引用的字段,"{model_name}-detail"在這種情況下將是"snippet-detail"和"user-detail"。
將所有這些名字添加到我們的URLconf中后,我們的最終snippets/urls.py文件應該如下所示:
from django.conf.urls import url, include from rest_framework.urlpatterns import format_suffix_patterns from snippets import views # API endpoints urlpatterns = format_suffix_patterns([ url(r"^$", views.api_root), url(r"^snippets/$", views.SnippetList.as_view(), name="snippet-list"), url(r"^snippets/(?P[0-9]+)/$", views.SnippetDetail.as_view(), name="snippet-detail"), url(r"^snippets/(?P [0-9]+)/highlight/$", views.SnippetHighlight.as_view(), name="snippet-highlight"), url(r"^users/$", views.UserList.as_view(), name="user-list"), url(r"^users/(?P [0-9]+)/$", views.UserDetail.as_view(), name="user-detail") ]) # Login and logout views for the browsable API urlpatterns += [ url(r"^api-auth/", include("rest_framework.urls", namespace="rest_framework")), ]
添加分頁
用戶和代碼段的列表視圖可能會返回相當多的實例,因此我們希望確保分頁結果,并允許API客戶端逐步瀏覽每個多帶帶的頁面。
我們可以通過tutorial/settings.py稍微修改我們的文件來更改默認列表樣式來使用分頁。添加以下設置:
REST_FRAMEWORK = { "PAGE_SIZE": 10 }
請注意,REST框架中的設置都命名為單個字典設置,名為“REST_FRAMEWORK”,這有助于保持與其他項目設置的良好分離。
我們也可以自定義分頁風格,如果我們也需要,但在這種情況下,我們將堅持默認。
瀏覽API
如果我們打開瀏覽器并導航到可瀏覽的API,那么您將發現您現在可以通過以下鏈接了解API的方法。
您還可以在代碼段實例上看到“突出顯示”鏈接,這將使您轉到突出顯示的代碼HTML表示。
在本教程的第6部分中,我們將介紹如何使用ViewSets和路由器來減少構建API所需的代碼量。
Django REST FrameWork中文文檔目錄:
Django REST FrameWork 中文教程1:序列化
Django REST FrameWork 中文教程2:請求和響應
Django REST FrameWork 中文教程3:基于類的視圖
Django REST FrameWork 中文教程4:驗證和權限
Django REST FrameWork 中文教程5:關系和超鏈接API
Django REST FrameWork 中文教程6: ViewSets&Routers
Django REST FrameWork 中文教程7:模式和客戶端庫
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45458.html
摘要:目前我們的中的關系通過使用主鍵來表示。在本教程的這一部分中,我們將改進的內聚力和可發現性,而不是使用超鏈接來進行關系。將相關實體嵌套在父表示內。 目前我們的API中的關系通過使用主鍵來表示。在本教程的這一部分中,我們將改進API的內聚力和可發現性,而不是使用超鏈接來進行關系。 為我們的API的根創建一個端點現在我們有snippets和users的端點,但是我們的API沒有一個入口點。要...
摘要:目前我們的中的關系通過使用主鍵來表示。在本教程的這一部分中,我們將改進的內聚力和可發現性,而不是使用超鏈接來進行關系。將相關實體嵌套在父表示內。 目前我們的API中的關系通過使用主鍵來表示。在本教程的這一部分中,我們將改進API的內聚力和可發現性,而不是使用超鏈接來進行關系。 為我們的API的根創建一個端點現在我們有snippets和users的端點,但是我們的API沒有一個入口點。要...
摘要:未經身份驗證的請求應具有完全只讀訪問權限。其中一個字段將用于表示創建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級的行為,以確保: 代碼段始終與創建者相關聯。 只有身份驗證的用戶可以創建...
摘要:未經身份驗證的請求應具有完全只讀訪問權限。其中一個字段將用于表示創建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級的行為,以確保: 代碼段始終與創建者相關聯。 只有身份驗證的用戶可以創建...
摘要:未經身份驗證的請求應具有完全只讀訪問權限。其中一個字段將用于表示創建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級的行為,以確保: 代碼段始終與創建者相關聯。 只有身份驗證的用戶可以創建...
閱讀 3018·2023-04-25 20:22
閱讀 3335·2019-08-30 11:14
閱讀 2590·2019-08-29 13:03
閱讀 3177·2019-08-26 13:47
閱讀 3218·2019-08-26 10:22
閱讀 1263·2019-08-23 18:26
閱讀 607·2019-08-23 17:16
閱讀 1908·2019-08-23 17:01