2013-09-30 13 views
10

これについての情報を見つけるのが難しいですが、これは正しいアプローチではないでしょう。私はHTTPメソッド(GETまたはPOSTまたはDELETEまたはPUT)に基づいて2つの異なるビュー関数にリクエストをルーティングしたいと思います。django urlpatternsでHTTPメソッドに基づいて識別する方法

通常、REST APIで実行されるため、同じURLはHTTPメソッドに基づいて異なる意味を持ちます。

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

(注:私はジャンゴ1.4で働いている)

私はジャンゴのurls.pyファイルでこれを行う方法が表示されていない、私のような何かをしたいと思います

+1

の可能な複製を(http://stackoverflow.com/questions/2964334/how-can-あなたのディスパッチ・オン・リクエスト・メソッド・メソッド・イン・ジャンゴ・ウルパターン) – 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 configでcallablesを使用できるようになっているため、ヘルパー関数を使用してコールバックを行うことができます。

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 

それを使用するには:[?どのようジャンゴURLpatternsでリクエストメソッドにディスパッチできる]

url(r'^foo', 
    method_dispatch(POST = post_handler, 
        GET = get_handler)), 
+0

きちんとしたアプローチは、これを自分自身でやっていると思っていました。 – sleepycal

関連する問題