【问题标题】:Django equivalent of rail respond_toDjango 等价于 rail respond_to
【发布时间】:2018-06-28 08:33:30
【问题描述】:

在 Rails 中,我可以使用 respond_to 来定义控制器如何根据请求格式响应。

在 routes.rb 中

 map.connect '/profile/:action.:format', :controller => "profile_controller" 

在 profile_controller.rb 中

def profile
      @profile = ...
      respond_to do |format|
        format.html {  }
        format.json {  }

      end
end

目前,在 Django 中,我必须使用两个 url 和两个操作:一个返回 html,一个返回 json。

url.py:

urlpatterns = [
    url(r'^profile_html', views.profile_html),
    url(r'^profile_json', views.profile_json),
]

view.py

def profile_html (request):

   #some logic calculations

   return render(request, 'profile.html', {'data': profile})

def profile_json(request):

  #some logic calculations

  serializer = ProfileSerializer(profile)

  return Response(serializer.data)

使用这种方法,逻辑代码变得重复。当然,我可以定义一种方法来进行逻辑计算,但代码很冗长。

无论如何,在 Django 中,我可以将它们组合在一起吗?

【问题讨论】:

    标签: ruby-on-rails json django equivalent respond-to


    【解决方案1】:

    是的,例如,您可以定义一个指定格式的参数:

    def profile(request, format='html'):
        #some logic calculations
    
        if format == 'html':
            return render(request, 'profile.html', {'data': profile})
        elif format == 'json':
            serializer = ProfileSerializer(profile)
            return Response(serializer.data)

    现在我们可以用特定的格式参数定义urls.py

    urlpatterns = [
        url(r'^profile_(?P<format>\w+)', views.profile),
    ]
    

    所以现在 Django 会将格式解析为正则表达式 \w+(您可能需要稍微更改一下),这将作为格式参数传递给 profile(..) 视图调用.

    请注意,现在用户可以输入任何内容,例如localhost:8000/profile_blabla。因此,您可以进一步限制正则表达式。

    urlpatterns = [
        url(r'^profile_(?P<format>(json|html))', views.profile),
    ]
    

    所以现在只有jsonhtml 是有效格式。您可以定义 action 参数的相同方式(就像您的第一个代码片段似乎暗示的那样)。

    【讨论】:

      【解决方案2】:

      从您对序列化程序类的使用来看,您显然在使用 Django Rest Framework。因此,您应该让该库通过使用渲染器来完成这里的工作 - 请参阅 the documentation

      如果您想在 JSONRenderer 和 TemplateHTMLRenderer 之间切换,DRF 将根据 URL 中的 Accept 标头或文件扩展名自动检测要使用哪一个。

      【讨论】:

        猜你喜欢
        • 2011-02-23
        • 1970-01-01
        • 1970-01-01
        • 2011-01-03
        • 2010-11-07
        • 2013-02-14
        • 2023-04-11
        • 2014-04-14
        • 1970-01-01
        相关资源
        最近更新 更多