Django等效于rail response_to

时间:2018-06-28 08:33:30

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

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

在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中仍然可以将它们组合在一起吗?

2 个答案:

答案 0 :(得分:5)

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

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+ (您可能需要稍作更改),并将其作为format参数传递给{{1 }}查看通话。

请注意,现在用户可以键入任何内容,例如profile(..)。因此,您可以进一步限制正则表达式。

localhost:8000/profile_blabla

因此,现在只有urlpatterns = [ url(r'^profile_(?P<format>(json|html))', views.profile), ] json是有效格式。您可以使用定义html参数的相同方法(就像您的第一个代码片段似乎暗示了那样)。

答案 1 :(得分:3)

通过使用序列化程序类,您显然正在使用Django Rest Framework。因此,您应该让该库通过使用渲染器在此处完成工作-参见the documentation

在您的情况下,您想在JSONRenderer和TemplateHTMLRenderer之间进行切换,并且DRF将根据URL中的Accept标头或文件扩展名自动检测要使用哪个。