2017-01-12 18 views
0

APIViewクラスでメソッドとは独立した同じコードを実行するメソッドを持つことは可能ですか?つまりGET/POST/PUT。Django rest framework APIすべてのメソッドで同じコードを表示

+0

GET/POST/PUTメソッドのすべてのAPIで同じコードを実行しますか?またはただ1つのAPIのGET/POST/PUTメソッド? – zhaorong

+0

Getとpostと同じです。Putとは異なります。すべての方法について同様の解決法が認められるであろう。 –

答えて

0

多分、この要件を満たすためにdjangoミドルウェアを使用することができます。

class CommonResponseMiddleware: 

    def __init__(self): 
     pass 

    def process_request(self, request): 

     path = request.path_info.lstrip('/') 

     method = request.method.upper() 

     if method == "DELETE": 
      request.META['REQUEST_METHOD'] = 'DELETE' 
      request.DELETE = QueryDict(request.body) 
     if method == "PUT": 
      request.META['REQUEST_METHOD'] = 'PUT' 
      request.PUT = QueryDict(request.body) 

     params = {} 
     if method == "GET": 
      params = request.GET.items() 
      # do what ever you want for GET method 
     if method == "POST": 
      params = request.POST.items() 
      # do what ever you want for POST method 
     if method == "PUT": 
      params = request.PUT.items() 
      # do what ever you want for PUT method 
     if method == "DELETE": 
      params = request.DELETE.items() 
      # do what ever you want for DELETE method 

次に、このミドルウェアをsettings.pyに適用します。

MIDDLEWARE_CLASSES = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', # <--here 
    #'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.middleware.gzip.GZipMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'authentication.auth.middleware.LoginRequiredMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'core.middleware.CommonResponseMiddleware', 
] 

ミドルウェアについて詳しくは、お手数ですが、お役に立てば幸いです。ジャンゴと同様に

+0

このソリューションをお寄せいただきありがとうございますが、私はミドルウェアを使用したくありません。私は、単純で直接的な解決策が存在するかどうかを知りたがっています。 –

+0

ミドルウェアを使用すると、この種の使用のためにあなたのウェブサイトが脆弱になります。この単純なユースケースに関係なく、すべてのリクエストに実行されます。 – Sayse

+0

入手しました...私の考えでは、ミドルウェアは十分に柔軟で、この場所ですべてのAPIまたは1つのAPIを処理できます。あなたが望む方法を見つけることを幸運にする:) – zhaorong

1

は、APIViewはあなたが

def dispatch(self, request): 
    return super().dispatch(request) 

詳細についてはdispatch methodsを参照してください独自のビューでそれをオーバーライドすることができますので、使用するリクエストメソッドを決定する前に最初の発送方法を経由することで同じように動作します。

関連する問題