Kel*_*Tan 4 django json ruby-on-rails equivalent respond-to
在Rails中,我可以使用respond_to来定义控制器如何根据请求格式进行响应.
在routes.rb中
map.connect '/profile/:action.:format', :controller => "profile_controller"
Run Code Online (Sandbox Code Playgroud)
在profile_controller.rb中
def profile
@profile = ...
respond_to do |format|
format.html { }
format.json { }
end
end
Run Code Online (Sandbox Code Playgroud)
目前,在Django中,我必须使用两个URL和两个动作:一个返回html,一个返回json.
url.py:
urlpatterns = [
url(r'^profile_html', views.profile_html),
url(r'^profile_json', views.profile_json),
]
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
使用这种方法,逻辑代码变得重复.当然,我可以定义一个方法来进行逻辑计算,但代码直到详细.
在Django还有,我可以将它们组合在一起吗?
是的,您可以定义一个参数,指定格式:
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)Run Code Online (Sandbox Code Playgroud)
现在我们可以urls.py使用特定的格式参数来定义:
urlpatterns = [
url(r'^profile_(?P<format>\w+)', views.profile),
]
Run Code Online (Sandbox Code Playgroud)
所以现在Django会将格式解析为正则表达式\w+(您可能需要更改一下),这将作为format参数传递给profile(..)视图调用.
请注意,现在,用户可以键入任何内容,例如localhost:8000/profile_blabla.因此,您可以进一步限制正则表达式.
urlpatterns = [
url(r'^profile_(?P<format>(json|html))', views.profile),
]
Run Code Online (Sandbox Code Playgroud)
所以,现在唯一的json和html有效的格式.您可以action像定义参数一样(就像您的第一个代码片段似乎建议的那样).
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |