2013-04-09 3 views
2

Je rencontre des problèmes lors de l'écriture d'un test d'acceptation de la fonctionnalité de connexion à l'aide de la bibliothèque de demandes. La connexion a été implémentée en utilisant la méthode post et je n'ai aucun moyen de modifier directement une chaîne de requête et de manipuler l'URL. Ce que j'essaie de faire est de soumettre manuellement les données de poste et rediriger la page vers la page où il irait régulièrement si un utilisateur connecté avec succès. Je voudrais récupérer le code HTML de cette page et vérifier la connexion réussie, comment est-ce que je ferais ça?Test d'acceptation avec bibliothèque de requêtes (python)

Cette méthode échoue:

data={'email': '[email protected]', 'password': 'example'} 

login_url="examplepage.com/signin" 

request_data = requests.post(login_url, data, allow_redirects=True) 

print request_data.content 

C'est ce que resp.headers retours:

{'content-length': '1124', 'date': 'Sun, 14 Apr 2013 16:12:51 GMT', 'set-cookie': 'session="+udnwfCkuAuFGp9QKOiU1YS2X1s=?_fresh=STAwCi4=&_id=Uyc3XHhkZVx4Y2J3T1x4YjBceDkxeFx4MWNceGFhXHhkNFx4OTMhKVx4MGJyJwpwMQou&csrf=Uyc2Mzk0YjVjZjMzMGZkMTNkY2NiM2EzZTZkYzgyMjhkY2IwOWQ2NmM3JwpwMQou"; Path=/; HttpOnly', 'content-type': 'text/html; charset=utf-8', 'connection': 'keep-alive', 'server': 'Werkzeug/0.8.3 Python/2.7.3'}

resp.content retourne juste le code HTML de la page de connexion:

<title>Web App</title> 

    </head> 
    <body> 
    <div>Web App: <a href="/home">Home</a> 

      | <a href="/signin">Login</a> 
      | <a href="/register">Register</a> 

    </div> 
    <hr> 




<h1>Sign in</h1> 


<form action="" method=post name="signin"> 
    <div style="display:none;"><input id="csrf_token" name="csrf_token" type="hidden" value="20130414164251##fd7e82d47974518d098b41cecf2a4452f890317f"></div> 
    <dl> 

    <dt><label for="email">Email Address</label> 
    <dd><input id="email" name="email" type="text" value="[email protected]"> 

    </dd> 


    <dt><label for="password">Password</label> 
    <dd><input id="password" name="password" type="password" value=""> 

    </dd> 

    </dl> 
    <p><input type="submit" value="Sign in"> 
</form> 

<a href="/login"> Click here to sign in using your Google, Yahoo, AOL, Flickr, or another OpenID account. </a> 


    </body> 
</html> 
+0

Comment est-ce que cela échoue? Qu'est-ce qui revient de la commande d'impression? – bbayles

+0

Il ne redirigeait pas, il retournerait juste le signe dans la page html. – Mike

Répondre

2

Si vous voulez vous connecter à une page, je suggère de créer une session malgré demandes andalone. Si vous envoyez des données correctement Vous devez récupérer un cookie de session. Je vérifie pour être sûr que vous êtes connecté. Lorsque le script se connecte et qu'il obtient un cookie, il doit également récupérer l'en-tête Location contenant la page cible. Essayez quelque chose comme ceci:

import requests 
data={'email': '[email protected]', 'password': 'example'} 
login_url="examplepage.com/signin" 
s = requests.session() 
resp = s.post(login_url,data) 
#now s.cookies should contain session cookie if properly logged in 
target = s.get(resp.headers['Location']) 

Mais je pense que le problème peut être sur la session.

+0

J'ai fait d'autres recherches, apparemment désactiver CSRF n'est pas l'idée la plus intelligente. Pouvez-vous me donner plus de détails sur la méthode que vous avez suggérée? J'ai essayé votre code mais j'obtiens ceci: 'requests.exceptions.MissingSchema: URL invalide u'None ': Aucun schéma fourni'' – Mike

+0

Il semble que la réponse ne contienne pas l'en-tête Location. Cela signifie que le code d'état de votre en-tête de réponse n'est pas 301, ce qui correspond à la redirection http. Pourriez-vous s'il vous plaît montrer votre response.headers et response.content? –

+0

Je l'ai ajouté ci-dessus. – Mike

0

Ma solution changeait la variable CSRF_ENABLED de Vrai Faux à dans le fichier config.py mon application. Le code ci-dessus a effectivement fonctionné une fois que j'ai changé ce paramètre. J'héberge sur Heroku en passant.

+0

Lisez sur CSRF, ce n'est pas suggéré. – Mike

0

Je l'ai fait:

if auth == True: 
     # fetch the login page in order to get the csrf token 
     cookieHandler = urllib2.HTTPCookieProcessor() 
     opener = urllib2.build_opener(urllib2.HTTPSHandler(), cookieHandler) 
     urllib2.install_opener(opener) 

     login_url = URL 
     login_page = opener.open(login_url) 

     # attempt to get the csrf token from the cookie jar 
     csrf_cookie = None 
     for cookie in cookieHandler.cookiejar: 
      if cookie.name == 'csrftoken': 
       csrf_cookie = cookie 
       break 
     if not cookie: 
      raise IOError("No csrf cookie found") 

     # login using the usr, pwd, and csrf token 
     login_data = urllib.urlencode(dict(
      username = username, password = password, 
      csrfmiddlewaretoken = csrf_cookie.value)) 

     req = urllib2.Request(login_url, login_data) 
     resp = urllib2.urlopen(req) 
     contents = resp.read() 

    target_download = target_url 
    status_code = urllib2.urlopen(target_download).getcode() 
    our_document = urllib2.urlopen(target_download).read() 
    return status_code, our_document 
Questions connexes