2012-07-06 3 views
4

J'essaye d'envoyer une demande de HTTPS PUT à un service Web de Django d'API de RESTful en utilisant une vue de djangorestframework (DRF: http://django-rest-framework.org/). Je n'arrive pas à faire fonctionner cela grâce à la protection CSRF (Cross Site Request Forgery) de Django.HTTPS PUT Demande utilisant djangorestframework

La demande PUT est destinée à permettre aux utilisateurs non authentifiés d'ajouter une ressource.

Ce que j'ai examiné/essayé:

  1. Désactivation CSRF - pas acceptable. L'API s'exécute sur la même instance Django que le service non-API. Désactiver la protection CSRF est trop risqué.
  2. En utilisant l'en-tête X-Requested-With: XMLHttpRequest sur la demande PUT (je contrôle les clients). Ne fonctionne pas - Je reçois toujours l'erreur CSRF. Utilisation du décorateur @crsf_exempt dans la vue PUT. Je voudrais si je pouvais - le cadre définit une classe, pas une vue.

Ma meilleure option actuelle est d'écrire des vues PUT moi-même sans utiliser la classe View de DRF. Je peux ensuite utiliser le décorateur @crsf_exempt avec succès. Je voudrais utiliser la classe View de DRF - mais je ne vois pas comment. Peut tu?

Répondre

4

Grâce à James Cran Wellward, j'ai également pu résoudre ce problème en utilisant 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) 

puis le tester:

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

retours:

{msg: 'called via GET'} 

et

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

retourne:

{msg: 'called via POST'} 

HTH. Voir le original post.

+0

Depuis que j'ai posé cette question je suis passé à django-tastypie - donc je ne peux pas facilement vérifier cela. Mais, votre réponse semble convaincante! – Erik