教程5 關係和超連結API

2022-08-22 21:12:10 字數 4241 閱讀 9120

目錄目前,我們的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()

這裡應該注意兩件事, 首先,我們使用rest框架的reverse數來返回完全限定的urls.。 其次,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中。我們將在snippets/urls.py中為新的api根新增url模式:

path('', views.api_root),
然後為片段高亮新增乙個url模式:

path('snippets//highlight/', views.snippethighlight.as_view()),
處理實體之間的關係是web api設計更具挑戰性的方面之一。我們可以選擇多種表示關係的方式:

rest框架支援所有這些樣式,並且可以將它們應用於正向或反向關係, 或將其應用到自定義管理器中,例如通用外來鍵。

在本例中,我們希望在實體之間使用超連結樣式。為了這樣做,我們將修改序列化程式以擴充套件hyperlinkedmodelserializer,而不是現有的modelserializer

hyperlinkedmodelserializermodelserializer有以下區別:

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字段具有相同的型別,只是它指向snippe-thighlighturl模式, 而不是snippet-detailurl模式。

因為我們包含了帶有格式字尾的url,例如.json。我們還需要在highlight欄位中指出,它返回的任何帶有格式字尾的超連結都應使用.html字尾。

如果我們要有乙個超連結的api, 我們需要確保我們命名我們的url模式, 讓我們看看我們需要命名哪些url模式。

將所有這些名稱新增到我們的urlconf中之後, 我們的最終snippets/urls.py檔案應如下所示:

from django.urls import path

from rest_framework.urlpatterns import format_suffix_patterns

from snippets import views

# api 端點

urlpatterns = format_suffix_patterns([

path('', views.api_root),

path('snippets/',

views.snippetlist.as_view(),

name='snippet-list'),

path('snippets//',

views.snippetdetail.as_view(),

name='snippet-detail'),

path('snippets//highlight/',

views.snippethighlight.as_view(),

name='snippet-highlight'),

path('users/',

views.userlist.as_view(),

name='user-list'),

path('users//',

views.userdetail.as_view(),

name='user-detail')

])

使用者和**段的列表檢視最終可能會返回很多例項, 所以我們真的想確保我們對結果進行分頁, 並允許api客戶端逐步瀏覽各個頁面。

我們可以更改預設列表樣式以使用分頁,通過稍微修改我們的tutorial/settings.py檔案。新增以下設定:

rest_framework =
請注意,rest框架中的設定都是以命名空間命名的,並且是乙個字典設定, 它命名為rest_framework. 這有助於使它們與您的其他專案設定完全分開。

如果需要,我們也可以自定義分頁樣式,但是在這種情況下,我們將堅持使用預設樣式。

如果我們開啟瀏覽器並導航到可瀏覽的api,您會發現您現在只需按以下鏈結即可使用api。

你還可以看到snippet例項上的「highlight」鏈結,這將帶您到突出顯示的**html表示形式。

在本教程的第6部分中,我們將介紹如何使用viewset和router減少構建api所需的**量。

5 超連結和錨鏈結說明

1.超連結 a標籤 實現跳轉頁面 屬性 href 外部鏈結或者內部鏈結外部鏈結寫完整url,內部鏈結寫相對位址即可.target 可選 self預設值代表在當前視窗開啟頁面.blank在新視窗中開啟.例子 黑馬程式設計師 外部 登入 本地 黑馬程式設計師 空鏈結例子 內容2.超連結 base標籤 b...

超連結和路徑

超連結和路徑 1 標籤 2 屬性 href 必須 target 可選 target 告訴瀏覽器希望將所連線的資源顯示在 blank 在新視窗或者標籤頁中開啟文件。parent 在父窗框組 frameset 中開啟文件。self 在當前視窗開啟文件 預設 top 在頂層視窗中開啟文件。h5中,框架基本...

html列表和超連結

堅持就是勝利!嗚嗚好累啊!白日依山盡情山水,黃河入海流進人家。欲窮千里目中無人,更上一層樓去人空.哎,哈哈!學習把今天學的內容總結一下 enne o 今天講的主要是列表和超連結,內容挺複雜的,不拋棄,不放棄!首先講的是列表,這個倒是很簡單,難度不大,只需記住幾個屬性就行!首先是定義列表dl標籤,在他...