簡體   English   中英

Django相當於rails respond_to

[英]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),
]

所以現在只有jsonhtml是有效的格式。 您可以像定義action參數一樣(就像您的第一個代碼片段似乎建議的那樣)。

從使用序列化程序類開始,您顯然正在使用Django Rest Framework。 因此,您應該讓該庫通過使用渲染器來完成這項工作 - 請參閱文檔

在您的情況下,您希望在JSONRenderer和TemplateHTMLRenderer之間切換,DRF將根據Accept標頭或URL中的文件擴展名自動檢測要使用的是哪一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM