国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Django REST FrameWork中文教程5:關(guān)系和超鏈接API

hsluoyz / 977人閱讀

摘要:目前我們的中的關(guān)系通過(guò)使用主鍵來(lái)表示。在本教程的這一部分中,我們將改進(jìn)的內(nèi)聚力和可發(fā)現(xiàn)性,而不是使用超鏈接來(lái)進(jìn)行關(guān)系。將相關(guān)實(shí)體嵌套在父表示內(nèi)。

目前我們的API中的關(guān)系通過(guò)使用主鍵來(lái)表示。在本教程的這一部分中,我們將改進(jìn)API的內(nèi)聚力和可發(fā)現(xiàn)性,而不是使用超鏈接來(lái)進(jìn)行關(guān)系。

為我們的API的根創(chuàng)建一個(gè)端點(diǎn)
現(xiàn)在我們有"snippets"和"users"的端點(diǎn),但是我們的API沒(méi)有一個(gè)入口點(diǎn)。要?jiǎng)?chuàng)建一個(gè),我們將使用一個(gè)常規(guī)的基于函數(shù)的視圖和@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)
    })

這里應(yīng)該注意兩件事情。首先,我們使用REST框架的reverse功能來(lái)返回完全限定的URL; 第二,URL模式是通過(guò)方便的名稱來(lái)識(shí)別的,我們稍后會(huì)在此聲明snippets/urls.py。

為突出顯示的片段創(chuàng)建端點(diǎn)
我們的pastebin API中仍然缺少的另一個(gè)明顯的事情是代碼突出顯示端點(diǎn)。

與所有其他API端點(diǎn)不同,我們不想使用JSON,而只是呈現(xiàn)HTML表示。REST框架提供了兩種HTML渲染器樣式,一種用于處理使用模板呈現(xiàn)的HTML,另一種用于處理預(yù)呈現(xiàn)的HTML。第二個(gè)渲染器是我們要用于此端點(diǎn)的渲染器。

在創(chuàng)建代碼高亮度視圖時(shí),我們需要考慮的另一件事是,我們可以使用現(xiàn)有的具體通用視圖。我們不是返回一個(gè)對(duì)象實(shí)例,而是一個(gè)對(duì)象實(shí)例的屬性。

而不是使用具體的通用視圖,我們將使用基類來(lái)表示實(shí)例,并創(chuàng)建我們自己的.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)

像往常一樣,我們需要添加我們?cè)赨RLconf中創(chuàng)建的新視圖。我們將為我們的新API根添加一個(gè)url模式snippets/urls.py:

url(r"^$", views.api_root),

然后為代碼片段添加一個(gè)url模式:

url(r"^snippets/(?P[0-9]+)/highlight/$", views.SnippetHighlight.as_view()),

超鏈接我們的API
處理實(shí)體之間的關(guān)系是Web API設(shè)計(jì)中更具挑戰(zhàn)性的方面之一。我們可以選擇代表關(guān)系的一些不同的方式:

使用主鍵

在實(shí)體之間使用超鏈接。

在相關(guān)實(shí)體上使用唯一的標(biāo)識(shí)字段。

使用相關(guān)實(shí)體的默認(rèn)字符串表示形式。

將相關(guān)實(shí)體嵌套在父表示內(nèi)。

一些其他自定義表示。

REST框架支持所有這些樣式,并且可以將它們應(yīng)用于正向或反向關(guān)系,也可以在諸如通用外鍵之類的自定義管理器上應(yīng)用。

在這種情況下,我們希望在實(shí)體之間使用超鏈接樣式。為了這樣做,我們將修改我們的序列化程序來(lái)擴(kuò)展HyperlinkedModelSerializer而不是現(xiàn)有的ModelSerializer。

在HyperlinkedModelSerializer有以下區(qū)別ModelSerializer:

id默認(rèn)情況下不包括該字段。

它包括一個(gè)url字段,使用HyperlinkedIdentityField。

關(guān)系使用HyperlinkedRelatedField,而不是PrimaryKeyRelatedField。

我們可以輕松地重新編寫(xiě)我們現(xiàn)有的序列化程序來(lái)使用超鏈接。在你的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")

請(qǐng)注意,我們還添加了一個(gè)新的"highlight"字段。該字段與url字段的類型相同,只是它指向"snippet-highlight"url模式,而不是"snippet-detail"url模式。

因?yàn)槲覀円呀?jīng)包括格式后綴的URL ".json",所以我們還需要在highlight字段上指出任何格式后綴的超鏈接它應(yīng)該使用".html"后綴。

確保我們的URL模式被命名
如果我們要有一個(gè)超鏈接的API,我們需要確保我們命名我們的URL模式。我們來(lái)看看我們需要命名的URL模式。

我們的API的根源是指"user-list"和"snippet-list"。

我們的片段序列化程序包括一個(gè)引用的字段"snippet-highlight"。

我們的用戶串行器包括一個(gè)引用的字段"snippet-detail"。

我們的片段和用戶序列化程序包括"url"默認(rèn)情況下將引用的字段,"{model_name}-detail"在這種情況下將是"snippet-detail"和"user-detail"。

將所有這些名字添加到我們的URLconf中后,我們的最終snippets/urls.py文件應(yīng)該如下所示:

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")),
]

添加分頁(yè)
用戶和代碼段的列表視圖可能會(huì)返回相當(dāng)多的實(shí)例,因此我們希望確保分頁(yè)結(jié)果,并允許API客戶端逐步瀏覽每個(gè)多帶帶的頁(yè)面。

我們可以通過(guò)tutorial/settings.py稍微修改我們的文件來(lái)更改默認(rèn)列表樣式來(lái)使用分頁(yè)。添加以下設(shè)置:

REST_FRAMEWORK = {
    "PAGE_SIZE": 10
}

請(qǐng)注意,REST框架中的設(shè)置都命名為單個(gè)字典設(shè)置,名為“REST_FRAMEWORK”,這有助于保持與其他項(xiàng)目設(shè)置的良好分離。

我們也可以自定義分頁(yè)風(fēng)格,如果我們也需要,但在這種情況下,我們將堅(jiān)持默認(rèn)。

瀏覽API
如果我們打開(kāi)瀏覽器并導(dǎo)航到可瀏覽的API,那么您將發(fā)現(xiàn)您現(xiàn)在可以通過(guò)以下鏈接了解API的方法。

您還可以在代碼段實(shí)例上看到“突出顯示”鏈接,這將使您轉(zhuǎn)到突出顯示的代碼HTML表示。

在本教程的第6部分中,我們將介紹如何使用ViewSets和路由器來(lái)減少構(gòu)建API所需的代碼量。

Django REST FrameWork中文文檔目錄:
Django REST FrameWork 中文教程1:序列化

Django REST FrameWork 中文教程2:請(qǐng)求和響應(yīng)

Django REST FrameWork 中文教程3:基于類的視圖

Django REST FrameWork 中文教程4:驗(yàn)證和權(quán)限

Django REST FrameWork 中文教程5:關(guān)系和超鏈接API

Django REST FrameWork 中文教程6: ViewSets&Routers

Django REST FrameWork 中文教程7:模式和客戶端庫(kù)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44462.html

相關(guān)文章

  • Django REST FrameWork中文教程5關(guān)系和超鏈接API

    摘要:目前我們的中的關(guān)系通過(guò)使用主鍵來(lái)表示。在本教程的這一部分中,我們將改進(jìn)的內(nèi)聚力和可發(fā)現(xiàn)性,而不是使用超鏈接來(lái)進(jìn)行關(guān)系。將相關(guān)實(shí)體嵌套在父表示內(nèi)。 目前我們的API中的關(guān)系通過(guò)使用主鍵來(lái)表示。在本教程的這一部分中,我們將改進(jìn)API的內(nèi)聚力和可發(fā)現(xiàn)性,而不是使用超鏈接來(lái)進(jìn)行關(guān)系。 為我們的API的根創(chuàng)建一個(gè)端點(diǎn)現(xiàn)在我們有snippets和users的端點(diǎn),但是我們的API沒(méi)有一個(gè)入口點(diǎn)。要...

    XiNGRZ 評(píng)論0 收藏0
  • Django REST FrameWork中文教程5關(guān)系和超鏈接API

    摘要:目前我們的中的關(guān)系通過(guò)使用主鍵來(lái)表示。在本教程的這一部分中,我們將改進(jìn)的內(nèi)聚力和可發(fā)現(xiàn)性,而不是使用超鏈接來(lái)進(jìn)行關(guān)系。將相關(guān)實(shí)體嵌套在父表示內(nèi)。 目前我們的API中的關(guān)系通過(guò)使用主鍵來(lái)表示。在本教程的這一部分中,我們將改進(jìn)API的內(nèi)聚力和可發(fā)現(xiàn)性,而不是使用超鏈接來(lái)進(jìn)行關(guān)系。 為我們的API的根創(chuàng)建一個(gè)端點(diǎn)現(xiàn)在我們有snippets和users的端點(diǎn),但是我們的API沒(méi)有一個(gè)入口點(diǎn)。要...

    waruqi 評(píng)論0 收藏0
  • Django REST FrameWork中文教程4:驗(yàn)證和權(quán)限

    摘要:未經(jīng)身份驗(yàn)證的請(qǐng)求應(yīng)具有完全只讀訪問(wèn)權(quán)限。其中一個(gè)字段將用于表示創(chuàng)建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請(qǐng)求和響應(yīng)中文教程基于類的視圖中文教程驗(yàn)證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫(kù) 目前,我們的API對(duì)誰(shuí)可以編輯或刪除代碼段沒(méi)有任何限制。我們想要一些更高級(jí)的行為,以確保: 代碼段始終與創(chuàng)建者相關(guān)聯(lián)。 只有身份驗(yàn)證的用戶可以創(chuàng)建...

    luodongseu 評(píng)論0 收藏0
  • Django REST FrameWork中文教程4:驗(yàn)證和權(quán)限

    摘要:未經(jīng)身份驗(yàn)證的請(qǐng)求應(yīng)具有完全只讀訪問(wèn)權(quán)限。其中一個(gè)字段將用于表示創(chuàng)建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請(qǐng)求和響應(yīng)中文教程基于類的視圖中文教程驗(yàn)證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫(kù) 目前,我們的API對(duì)誰(shuí)可以編輯或刪除代碼段沒(méi)有任何限制。我們想要一些更高級(jí)的行為,以確保: 代碼段始終與創(chuàng)建者相關(guān)聯(lián)。 只有身份驗(yàn)證的用戶可以創(chuàng)建...

    _ang 評(píng)論0 收藏0
  • Django REST FrameWork中文教程4:驗(yàn)證和權(quán)限

    摘要:未經(jīng)身份驗(yàn)證的請(qǐng)求應(yīng)具有完全只讀訪問(wèn)權(quán)限。其中一個(gè)字段將用于表示創(chuàng)建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請(qǐng)求和響應(yīng)中文教程基于類的視圖中文教程驗(yàn)證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫(kù) 目前,我們的API對(duì)誰(shuí)可以編輯或刪除代碼段沒(méi)有任何限制。我們想要一些更高級(jí)的行為,以確保: 代碼段始終與創(chuàng)建者相關(guān)聯(lián)。 只有身份驗(yàn)證的用戶可以創(chuàng)建...

    Hydrogen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<