4

djangorestframework(DRF: http ://django-rest-framework.org/ )ビューを使用して、HTTPSPUTリクエストをRESTfulAPIDjangoWebサービスに送信しようとしています。Djangoのクロスサイトリクエストフォージェリ(CSRF)保護のため、これを機能させることができません。

PUT要求は、認証されていないユーザーがリソースを追加できるようにすることを目的としています。

私が検討/試行したこと:

  1. CSRFの無効化-受け入れられません。APIは、非APIサービスと同じDjangoインスタンスで実行されます。CSRF保護を無効にすることはリスクが大きすぎます。
  2. X-Requested-With: XMLHttpRequestPUTリクエストのヘッダーを使用します(私はクライアントを制御します)。動作しません-それでもCSRFエラーが発生します。
  3. @crsf_exemptPUTビューでデコレータを使用します。できれば、フレームワークはビューではなくクラスを定義します。

私の現在の最善のオプションは、DRFのViewクラスを使用せずに自分でPUTビューを作成することです。@crsf_exemptこれで、デコレータを正常に使用できます。

DRFのViewクラスを使用したいのですが、その方法がわかりません。あなたはできる?

4

1 に答える 1

4

James Cran Wellward のおかげで、method_decorator を使用してこの問題を解決することもできました。

class ExampleView(ResponseMixin,View):
  renderers=DEFAULT_RENDERERS
  def get(self,request):
    response=Response(200,{'msg':'called via GET'})
    return self.render(response)
  def post(self,request):
    response=Response(200,{'msg':'called via POST'})
    return self.render(response)
  @method_decorator(csrf_exempt):
  def dispatch(self,*args,**kwargs):
    return super(EampleView,self).dispatch(*args,**kwargs)

そしてそれをテストします:

curl -X GET http://www.example.com/rest/exampleview/

戻り値:

{msg: 'called via GET'}

curl -X POST http://www.example.com/rest/exampleview/

戻り値:

{msg: 'called via POST'}

HTH。元の投稿を参照してください。

于 2012-07-15T03:31:26.773 に答える