2016-10-18 3 views
1

私はdjangoでtastypieを使用してREST API要求を処理しました。これまでにGET/POSTリクエストを行うときは、デフォルトでメソッドを脱水化します。しかし、DELETE/PUTリクエストでは、tastypieがそれを処理するメソッドがないため、リクエスト情報を記録する方法はありません。tastypie djangoですべてのリクエストを記録する方法

class ProjectResource(ModelResource): 
    allowed_methods = ['get', 'put', 'post', 'delete'] 
    resource_name = 'project' 
    queryset = Project.objects.all() 
    validation = FormValidation(form_class=ProjectForm) 
    always_return_data = True 
    filtering = { 
     'id': ALL, 
     'slug': ALL, 
     } 

def dehydrate(self, bundle): 
    import pdb;pdb.set_trace() #--> get/post request hit this function 
    logger.log('app.main','debug', 'Project info', bundle) 
    bundle.data['name'] = cgi.escape(bundle.obj.name) 
    return bundle 

tastypie.resourceモジュールでModelResourceをオーバーライドする機能はありますか?すべての要求に対してバンドルデータを取得してから処理する前にロガーに渡します。

+0

リクエストがまだルーティングされていない場合、WSGIミドルウェアレベルでログに記録できませんか?または、[Djangoミドルウェア](https://docs.djangoproject.com/en/1.10/topics/http/middleware/)レベル?必要なのはリクエストだけで、API URLの外観(例: '.startswith( '/ api /')')があれば十分でしょう。 – 9000

答えて

1

少し遅れますが、目的が何であるかを説明できる場合は、正しい方向を指す方が簡単かもしれません。

リクエスト情報をログに記録したいが、dehydrateメソッドでバンドルを記録しても、それは行われません。POSTリクエストでプライマリキーを追加するなどの変更は既に行われています。

request.bodyを直接dispatchメソッドに記録する方がよい場合があります。

実際に応答をログに記録する場合は、dispatchメソッドで応答を記録することもできます。

def dispatch(self, request_type, request, **kwargs): 
    logger.info('Project info [request method]: %s' % request.method) 
    logger.info('Project info [request]: %s' % request.body) 
    response = super(ClassName, self).dispatch(request_type, request, **kwargs) 
    logger.info('Project info [response status]: %d' % response.status_code) 
    logger.info('Project info [response]: %s' % response.content) 
    return response 
関連する問題