1. 程式人生 > 實用技巧 >Django 路由(SimpleRouter, DefaultRouter,ExtendedDefaultRouter)

Django 路由(SimpleRouter, DefaultRouter,ExtendedDefaultRouter)

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']
’‘’