【问题标题】:Can Django-Rest-Framework (DRF) Views and Serializers replace Django native views and formsDjango-Rest-Framework (DRF) 视图和序列化器能否替换 Django 原生视图和表单
【发布时间】:2018-10-04 18:12:20
【问题描述】:

我正在开发一个我必须展示的网站

1) 带有 html 内容类型的网页

2) 还提供 api json 端点来开发 Web 或移动应用程序。

目前对于 html 网页,我使用了 djangos 视图和表单。

对于 api,我使用的是 Django REST 框架视图和序列化器。

但是通过DRF我发现DRF可以渲染多种格式。

HTML & Forms REST framework 适合返回 API 风格 响应和常规 HTML 页面。此外,可以使用序列化程序 作为 HTML 表单并在模板中呈现。

http://www.django-rest-framework.org/topics/html-and-forms/

您可以使用 TemplateHTMLRenderer 来返回常规 HTML 页面 使用 REST 框架,或从 单端点。

http://www.django-rest-framework.org/api-guide/renderers/#templatehtmlrenderer

由于只有一个视图(一个端点),我可以同时获得 html 和 api,这不会减少我的编码工作量。

我计划仅对任何类型的内容使用 DRF 视图和序列化器,而不是 DJango 表单和视图。

如果我只使用 DRF 会有什么挫折。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    没有 Django 就无法使用 DRF,因为 DRF 不是一个自治框架。
    因此,为了使用 DRF,您将其基于 Django 应用程序。因此,是否使用 Django 视图取决于您和您要解决的问题。

    通常,仅使用 DRF 视图和序列化程序没有缺点,但正如我所提到的,这取决于手头的问题。可以在herehere 找到一些列出为什么使用 DRF 的原因的线程。

    最后,DRF 让您可以选择使用带有选项 request.accepted_renderer 的“情景”渲染器(直接来自文档的示例):

    在某些情况下,您可能希望视图根据接受的媒体类型使用不同的序列化样式。如果您需要这样做,您可以访问 request.accepted_renderer 以确定将用于响应的协商渲染器。

    例如:

    @api_view(('GET',))
    @renderer_classes((TemplateHTMLRenderer, JSONRenderer))
    def list_users(request):
        """
        A view that can return JSON or HTML representations
        of the users in the system.
        """
        queryset = Users.objects.filter(active=True)
    
        if request.accepted_renderer.format == 'html':
            # TemplateHTMLRenderer takes a context dict,
            # and additionally requires a 'template_name'.
            # It does not require serialization.
            data = {'users': queryset}
            return Response(data, template_name='list_users.html')
    
        # JSONRenderer requires serialized data as normal.
        serializer = UserSerializer(instance=queryset)
        data = serializer.data
        return Response(data)    
    

    这涵盖了您问题的第二部分。

    【讨论】:

    • 嗨,谢谢你的回答,我的主要问题是What will be the setbacks if I only use DRF. 意味着根本不使用 django 视图。
    • @BearBrown 正如我在第二个“段落”中提到的那样,没有挫折,所以继续吧!
    • 我正在等待一些实际的练习或者可能是 OP 批准的,我现在不需要它但觉得它很有趣。
    【解决方案2】:

    我猜你想查看你的 API 信息并有一些可以创建另一个对象的表单。为此,您可以使用来自 rest-framework 的 APIView

    我有一个类似这样的项目:

    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    class MonitorList(APIView):
    
        ''' List all Monitors, or create a new Monitor '''
    
        def get(self, request, format=None):
            monitors = Monitor.objects.all()
            serializer = MonitorSerializer(monitors, many=True)
            return Response(serializer.data)
    
        def post(self, request, format=None):
            serializer = MonitorSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
    
    class MonitorDetail(APIView):
    
        ''' GET, PUT AND DELETE METHODS FOR Monitor '''
        def get_object(self, pk):
            try:
                return Monitor.objects.get(pk=pk)
            except Monitor.DoesNotExist:
                raise Http404
    
        def get(self, request, pk, format=None):
            monitor = self.get_object(pk=pk)
            serializer = MonitorSerializer(monitor)
            return Response(serializer.data)
    
        def put(self, request, pk, format=None):
            monitor = self.get_object(pk=pk)
            serializer = MonitorSerializer(monitor, data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_200_OK)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
        def delete(self, request, pk, format=None):
            monitor = self.get_object(pk=pk)
            monitor.delete()
            return Response(status=status.HTTP_204_NO_CONTENT)
    

    如果你想要创建或编辑某些对象的选项,你应该有 post、put 甚至 patch 方法。可以阅读docs 了解有关 DRF 视图的更多信息。希望我能帮助你。 :)

    【讨论】:

    • 你读到最后了吗? What will be the setbacks if I only use DRF.我认为你没有回答这个问题。
    • 这并没有解决为什么我只能使用 DRF 的问题
    猜你喜欢
    • 2016-09-29
    • 2018-10-09
    • 1970-01-01
    • 2016-11-29
    • 2018-05-08
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多