【愚公系列】2022年04月 Python教學課程 71-DRF框架之內置路由
一、路由
對于視圖集ViewSet,我們除了可以自己手動指明請求方式與視圖方法[官方文檔中也叫action,動作]之間的對應關系外,還可以使用Routers來幫助我們自動生成路由信息。
REST framework提供了兩個router
SimpleRouter
DefaultRouter
1.SimpleRouter
1.1 基本使用
from rest_framework import routers router = routers.SimpleRouter() router.register(r'users', UserViewSet) router.register(r'accounts', AccountViewSet) urlpatterns = router.urls
該方法有兩個必需的參數:register()
prefix- 用于這組路由的 URL 前綴。
viewset- 視圖集類。
(可選)您還可以指定一個附加參數:
basename- 用于所創建的 URL名稱的基礎。如果未設置,則將根據視圖集的屬性(如果有)自動生成基名。請注意,如果視圖集不包含屬性,則必須在注冊視圖集時進行設置。
上面的示例將生成以下 URL 模式:
網址模式: 名稱:^users/$‘user-list’
網址模式: 名稱:^users/{pk}/$‘user-detail’
網址模式: 名稱:^accounts/$‘account-list’
網址模式: 名稱:^accounts/{pk}/$‘account-detail’
1.2 合并使用
router = routers.SimpleRouter() router.register(r'users', UserViewSet) router.register(r'accounts', AccountViewSet) urlpatterns = [ path('forgot-password/', ForgotPasswordFormView.as_view()), ] urlpatterns += router.urls
urlpatterns = [ path('forgot-password', ForgotPasswordFormView.as_view()), path('', include(router.urls)), ]
urlpatterns = [ path('forgot-password/', ForgotPasswordFormView.as_view()), path('api/', include((router.urls, 'app_name'), namespace='instance_name')), ]
1.3 額外操作的路由
視圖集可以通過使用裝飾器修飾方法來標記用于布線的額外操作。這些額外的操作將包含在生成的路由中。例如,給定類上的方法:action()
from myapp.permissions import IsAdminOrIsSelf from rest_framework.decorators import action class UserViewSet(ModelViewSet): ... @action(methods=['post'], detail=True, permission_classes=[IsAdminOrIsSelf]) def set_password(self, request, pk=None): ...
將生成以下路由:
網址模式:^users/{pk}/set_password/$
網址名稱:'user-set-password'
默認情況下,URL 模式基于方法名稱,URL 名稱是方法名稱和帶連字符的方法名稱的組合。如果不想為這兩個值中的任何一個使用默認值,則可以改為向裝飾器提供 and 參數。
例如,如果要將自定義操作的 URL 更改為 ,則可以編寫:^users/{pk}/change-password/$
from myapp.permissions import IsAdminOrIsSelf from rest_framework.decorators import action class UserViewSet(ModelViewSet): ... @action(methods=['post'], detail=True, permission_classes=[IsAdminOrIsSelf], url_path='change-password', url_name='change_password') def set_password(self, request, pk=None): ...
上面的示例現在將生成以下 URL 模式:
網址路徑:^users/{pk}/change-password/$
網址名稱:'user-change_password'
注意點:
默認情況下,創建的 URL 會附加尾部斜杠??梢酝ㄟ^在實例化路由器時將參數設置為來修改此行為。例如:
router = SimpleRouter(trailing_slash=False)
尾隨斜杠在 Django 中是約定俗成的,但在其他一些框架(如 Rails)中默認不使用。你選擇使用哪種風格很大程度上取決于你的偏好,盡管一些javaScript框架可能會期望特定的路由風格。
路由器將匹配包含除斜杠和句點字符之外的任何字符的查找值。對于限制性更強(或寬松)的查找模式,請在視圖集上設置屬性。例如,可以將查找限制為有效的 UUID:
class MyModelViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet): lookup_field = 'my_model_id' lookup_value_regex = '[0-9a-f]{32}'
2.DefaultRouter
此路由器與上述路由器類似,但還包含默認 API 根視圖,該視圖返回包含指向所有列表視圖的超鏈接的響應。它還為可選樣式格式后綴生成路由。
from rest_framework import routers router = routers.DefaultRouter() router.register(r'users', UserViewSet) router.register(r'accounts', AccountViewSet) urlpatterns = router.urls
與 URL 路由上的尾部斜杠一樣,可以通過在實例化路由器時將參數設置為 來刪除。
router = DefaultRouter(trailing_slash=False)
5G教育 NAT Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。