Using Django Rest Framework's browsable API with APIViews?

后端 未结 6 1052
走了就别回头了
走了就别回头了 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条回答
  •  Happy的楠姐
    2020-12-24 01:46

    To mix with routers and APIView classes or method based in such a way that the API Root displays both with minimal code views in the APIRoot view I wrote a custom router that extends DefaultRouter and overrides get_urls and get_api_root_view; it looks like as follows :

    from rest_framework import routers, views, reverse, response
    
    class HybridRouter(routers.DefaultRouter):
        def __init__(self, *args, **kwargs):
            super(HybridRouter, self).__init__(*args, **kwargs)
            self._api_view_urls = {}
    
        def add_api_view(self, name, url):
            self._api_view_urls[name] = url
    
        def remove_api_view(self, name):
            del self._api_view_urls[name]
    
        @property
        def api_view_urls(self):
            ret = {}
            ret.update(self._api_view_urls)
            return ret
    
        def get_urls(self):
            urls = super(HybridRouter, self).get_urls()
            for api_view_key in self._api_view_urls.keys():
                urls.append(self._api_view_urls[api_view_key])
            return urls
    
        def get_api_root_view(self):
            # Copy the following block from Default Router
            api_root_dict = {}
            list_name = self.routes[0].name
            for prefix, viewset, basename in self.registry:
                api_root_dict[prefix] = list_name.format(basename=basename)
            api_view_urls = self._api_view_urls
    
            class APIRoot(views.APIView):
                _ignore_model_permissions = True
    
                def get(self, request, format=None):
                    ret = {}
                    for key, url_name in api_root_dict.items():
                        ret[key] = reverse.reverse(url_name, request=request, format=format)
                    # In addition to what had been added, now add the APIView urls
                    for api_view_key in api_view_urls.keys():
                        ret[api_view_key] = reverse.reverse(api_view_urls[api_view_key].name, request=request, format=format)
                    return response.Response(ret)
    
            return APIRoot.as_view()
    

    Then I use it as -

    router = routers.HybridRouter()
    router.register(r'abc', views.ABCViewSet)
    router.add_api_view("api-view", url(r'^aview/$', views.AView.as_view(), name='aview-name'))
    urlpatterns = patterns('',
        url(r'^api/', include(router.urls)),
    

提交回复
热议问题