2010-09-02 3 views

Répondre

13

La différence entre la soumission des données à d'autres formes et votre cas est que vous devrez d'abord obtenir le jeton CSRF. Cela peut être fait en effectuant une requête GET sur la page d'abord, puis en analysant le csrfmiddlewaretoken en utilisant un analyseur approprié.

Gardez également à l'esprit que vous devrez installer un cookie-jar pour que cela fonctionne.

Par exemple:

#!/usr/bin/python 
import urllib, urllib2, cookielib 
from BeautifulSoup import BeautifulSoup 

cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 
urllib2.install_opener(opener) 

url = urllib2.urlopen('http://localhost:8000/accounts/login/') 
html = url.read() 

doc = BeautifulSoup(html) 
csrf_input = doc.find(attrs = dict(name = 'csrfmiddlewaretoken')) 
csrf_token = csrf_input['value'] 

params = urllib.urlencode(dict(username = 'foo', password='top_secret', 
     csrfmiddlewaretoken = csrf_token)) 
url = urllib2.urlopen('http://localhost:8000/accounts/login/', params) 
print url.read() 
+0

J'ai essayé votre code ci-dessus, mais je reçois l'erreur suivante (dans le code HTML) S'il vous plaît connecter à nouveau, parce que votre session a expiré. Savez-vous comment maintenir la session en vie? (Je l'ai essayé avec localhost: 8000/admin) – abrunet

+0

Ajoutez 'opener.addheaders = [('Referer', login_url)]'. Au moins certains déploiements Django nécessiteront un en-tête _Referer_ selon [cette réponse] (http://stackoverflow.com/questions/5082128/how-do-i-authenticate-a-urllib2-script-in-order-to-access -https-web-services-fro) – nmgeek

1

utiliser le décorateur csrf_exempt pour la vue qui gère la demande

from django.views.decorators.csrf import csrf_exempt 
Questions connexes