Django 路由(SimpleRouter, DefaultRouter,ExtendedDefaultRouter)
阿新 • • 發佈:2020-12-11
django 路由
1.SimpleRouter
from rest_framework.routers import SimpleRouter router = SimpleRouter() router.register(r'users', UserViewSet) register有兩個強制引數 prefix 此組路由的url字首 viewset 處理請求的viewset類 還有一個可選引數 base_name 如果檢視集不包括queryset屬性,那麼在註冊檢視集時必須設定base_name也就是viewset 沒有自定義model 或 get_queryset方法時,必須填寫此屬性 生成的路由 URL pattern: ^users/$ Name: 'user-list' URL pattern: ^users/{pk}/$ Name: 'user-detail' 在路由中的使用 方法一: router = routers.SimpleRouter() router.register(r'users', UserViewSet) router.register(r'accounts', AccountViewSet) urlpatterns = [ url(r'^forgot-password/$', ForgotPasswordFormView.as_view()), ] urlpatterns += router.urls 方法二: urlpatterns = [ url(r'^forgot-password/$', ForgotPasswordFormView.as_view()), url(r'^', include(router.urls)), ] urlpatterns = [ url(r'^forgot-password/$', ForgotPasswordFormView.as_view()), url(r'^api/', include(router.urls, namespace='api')), ] 額外連線和操作 用@detail_route或@list_route裝飾的檢視集上的任何方法也將被路由 class TestViewSet(viewsets.ViewSet): permission_classes = [] from rest_framework.decorators import detail_route, list_route @detail_route(methods=['GET']) def url_test(self, request, pk=None, *args, **kwargs): return Response(pk) 生成的路由 ^/test/(?P<pk>[^/.]+)/url_test/$ 如果要自定義路由名,使用url_path引數定義 @detail_route(methods=['get'], url_path='zb') # 自定義組名和正則 class MyModelViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet): lookup_field = 'my_model_id' lookup_value_regex = '[0-9a-f]{32}'
1.ExtendedDefaultRouter
from rest_framework_extensions.routers import ExtendedDefaultRouter router.register(r'/we_chat', WeChatPayViewSet, 'we_chat') class WeChatPayViewSet(viewsets.ViewSet): permission_classes = (IsAuthenticated,) @action(methods=["POST"], is_for_list=True) def app_pay(self, request, *args, **kwargs): ‘’‘ 當viewset使用@action時 class TestViewSet(viewsets.ViewSet): model = EStoreOrder @action(methods=['GET']) def test(self, request, *args, **kwargs): return Response('ok') 生成的路由為 ^api/ ^estore ^/test/(?P<pk>[^/.]+)/test/$ [name='estoreorder-test'] ^api/ ^estore ^/test/(?P<pk>[^/.]+)/test/\.(?P<format>[a-z0-9]+)$ [name='estoreorder-test'] 當使用 @action(methods=['GET'], is_for_list=True) 生成的路由為 ^api/ ^estore ^/test/test/$ [name='estoreorder-test-list'] ^api/ ^estore ^/test/test/\.(?P<format>[a-z0-9]+)$ [name='estoreorder-test-list'] ’‘’