2013-09-30 19 views
10

我在查找關於此的信息時遇到了一些困難,可能它不是正確的方法。我想根據http方法(GET或POST或DELETE或PUT)將請求路由到兩個不同的視圖函數。如何基於django urlpatterns中的HTTP方法進行區分

由於它通常在REST API中完成,這意味着相同的URL根據HTTP方法具有不同的含義。

我不明白的方式在Django的urls.py文件要做到這一點,我想是這樣的:

url(r'^tasks$', 'app.views.get_tasks', method='get'), 
url(r'^tasks$', 'app.views.create_task', method='post'), 

(注意:我使用Django 1.4工作)

+1

可能重複http://stackoverflow.com/questions/2964334/how-can-你在調度請求方法在Django的urlpatterns) – luca

回答

12

我不認爲你可以用不同的功能做到這一點沒有加入一些邏輯來的URL(這是不是一個好主意),但你可以檢查請求的方法在函數內部:

def myview(request): 
    if request.method == 'GET': 
     # Code for GET requests 
    elif request.method == 'POST': 
     # Code for POST requests 

你也可以切換到class-based views。你會那麼只需要定義爲每個HTTP方法的方法:如果你決定去基於類的路線

class CreateMyModelView(CreateView): 
    def get(self, request, *args, **kwargs): 
     # Code for GET requests 

    def post(self, request, *args, **kwargs): 
     # Code for POST requests 

,另一個很好的資源是http://ccbv.co.uk/

10

因爲Django允許你在URL配置中使用可調用,所以你可以用輔助函數來實現。

def method_dispatch(**table): 
    def invalid_method(request, *args, **kwargs): 
     logger.warning('Method Not Allowed (%s): %s', request.method, request.path, 
      extra={ 
       'status_code': 405, 
       'request': request 
      } 
     ) 
     return HttpResponseNotAllowed(table.keys()) 

    def d(request, *args, **kwargs): 
     handler = table.get(request.method, invalid_method) 
     return handler(request, *args, **kwargs) 
    return d 

要使用它:

url(r'^foo', 
    method_dispatch(POST = post_handler, 
        GET = get_handler)), 
的[?你怎麼能對派遣Django的URL模式請求方法(
+0

相當一個整潔的方法,考慮自己做這個,謝謝分享 – sleepycal

相關問題