【问题标题】:Routing API Views in Django Rest Framework?在 Django Rest 框架中路由 API 视图?
【发布时间】:2013-09-20 00:32:01
【问题描述】:

在 Django Rest Framework 中路由APIViews(即不是ViewSets)是否有任何通用模式?

例如,如果我有一个带有可选参数的 API 视图:

class ReportView(APIView):
    def get(self, request, report_name=None):
         # … stuff …
         return Response(report)

除了编写标准的 Django URL 路由器之外,是否有任何标准模式用于路由该视图?

【问题讨论】:

    标签: django-rest-framework


    【解决方案1】:

    能够添加简单的 API 视图对于在 root-api 视图中显示 url 非常有用。

    这是DefaultRouter 的最简单扩展,它不仅可以注册视图集,还可以注册简单的 API 视图:

    from django.conf.urls import url
    from rest_framework import routers, viewsets
    from rest_framework.urlpatterns import format_suffix_patterns
    
    class DefaultRouterWithSimpleViews(routers.DefaultRouter):
        """
        Extends functionality of DefaultRouter adding possibility
        to register simple API views, not just Viewsets.
        """
    
        def get_routes(self, viewset):
            """
            Checks if the viewset is an instance of ViewSet,
            otherwise assumes it's a simple view and does not run
            original `get_routes` code.
            """
            if issubclass(viewset, viewsets.ViewSetMixin):
                return super(DefaultRouterWithSimpleViews, self).get_routes(viewset)
    
            return []
    
        def get_urls(self):
            """
            Append non-viewset views to the urls
            generated by the original `get_urls` method.
            """    
            # URLs for simple views
            ret = []
            for prefix, viewset, basename in self.registry:
    
                # Skip viewsets
                if issubclass(viewset, viewsets.ViewSetMixin):
                    continue
    
                # URL regex
                regex = '{prefix}{trailing_slash}$'.format(
                    prefix=prefix,
                    trailing_slash=self.trailing_slash
                )
    
                # The view name has to have suffix "-list" due to specifics
                # of the DefaultRouter implementation.
                ret.append(url(
                    regex, viewset.as_view(),
                    name='{0}-list'.format(basename)
                ))
    
            # Format suffixes
            ret = format_suffix_patterns(ret, allowed=['json', 'html'])
    
            # Prepend URLs for viewsets and return
            return super(DefaultRouterWithSimpleViews, self).get_urls() + ret
    

    现在您可以将简单的 Django 视图与其他框架 ViewSet 一起使用:

    router = DefaultRouterWithSimpleViews()
    router.register(r'users', UserViewSet, 'users')                # <- Viewset!         
    router.register(r'reset-pwd', ResetPasswordView, 'reset_pwd')  # <- Simple view!
    urlpatterns = router.urls
    

    更新:增加了对格式后缀的支持(感谢alexander-klimenko

    【讨论】:

    • 只是很少注意。此路由器将生成不支持后缀 (*.json, *.jsonp) 的 url。您必须调用 format_suffix_patterns 以获得额外的模式。
    • @AlexanderKlimenko 谢谢!我已经更新了答案 - 请仔细检查它是否正确。
    • 也许为了让这个示例代码更容易理解,你还可以包含一个简短的例子来说明它是如何使用的?
    • @М.Б。这可能是您的代码中的错字。也许您错过了创建router 实例的第一行?
    • @DavidAvsajanishvili 我终于做到了!我找到了一个方法。完成项目后,我将在此处链接 git repo。
    【解决方案2】:

    除了编写标准的 Django URL 路由器之外,是否有任何标准模式用于路由该视图?

    ViewSets & Routers 如果你想要标准化的路由模式。

    如果您使用视图,那么只需使用常规的 Django URLconf。

    【讨论】:

    • 如何将使用常规 Django URLconf 的视图添加到可浏览 API?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2020-07-11
    • 2018-09-30
    • 2016-01-29
    • 1970-01-01
    相关资源
    最近更新 更多