Using Django Rest Framework's browsable API with APIViews?

后端 未结 6 1047
走了就别回头了
走了就别回头了 2020-12-24 01:32

If I have a view like:

class MyAPIView(APIView):
    def get(self, request, name=None):
        return {\"hello\": name or \"world\"}

How c

6条回答
  •  轮回少年
    2020-12-24 01:42

    I have optimized HybridRouter for my use case and removed some code. Check it out:

    class HybridRouter(routers.DefaultRouter):
        def __init__(self, *args, **kwargs):
            super(HybridRouter, self).__init__(*args, **kwargs)
            self.view_urls = []
    
        def add_url(self, view):
            self.view_urls.append(view)
    
        def get_urls(self):
            return super(HybridRouter, self).get_urls() + self.view_urls
    
        def get_api_root_view(self):
            original_view = super(HybridRouter, self).get_api_root_view()
    
            def view(request, *args, **kwargs):
                resp = original_view(request, *args, **kwargs)
                namespace = request.resolver_match.namespace
                for view_url in self.view_urls:
                    name = view_url.name
                    url_name = name
                    if namespace:
                        url_name = namespace + ':' + url_name
                    resp.data[name] = reverse(url_name,
                                              args=args,
                                              kwargs=kwargs,
                                              request=request,
                                              format=kwargs.get('format', None))
                return resp
            return view
    

    And usage:

    router = routers.HybridRouter(trailing_slash=False)
    router.add_url(url(r'^me', v1.me.view, name='me'))
    router.add_url(url(r'^status', v1.status.view, name='status'))
    
    urlpatterns = router.urls
    

    Or:

    router = routers.HybridRouter(trailing_slash=False)
    router.view_urls = [
        url(r'^me', v1.me.view, name='me'),
        url(r'^status', v1.status.view, name='status'),
    ]
    
    urlpatterns = router.urls
    

提交回复
热议问题