![](/img/trans.png)
[英]Rails equivalent of respond_to |format| with a straight render
[英]Django equivalent of rail respond_to
在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還有,我可以將它們組合在一起嗎?
是的,您可以定義一個參數,指定格式:
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參數傳遞給profile(..)
視圖調用。
請注意,現在,用戶可以鍵入任何內容,例如localhost:8000/profile_blabla
。 因此,您可以進一步限制正則表達式。
urlpatterns = [
url(r'^profile_(?P<format>(json|html))', views.profile),
]
所以現在只有json
和html
是有效的格式。 您可以像定義action
參數一樣(就像您的第一個代碼片段似乎建議的那樣)。
從使用序列化程序類開始,您顯然正在使用Django Rest Framework。 因此,您應該讓該庫通過使用渲染器來完成這項工作 - 請參閱文檔 。
在您的情況下,您希望在JSONRenderer和TemplateHTMLRenderer之間切換,DRF將根據Accept標頭或URL中的文件擴展名自動檢測要使用的是哪一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.