2016-02-23 2 views
0

J'essaie de créer un script de requête POST en Python qui enverra automatiquement des données à la base de données. Puisque mon application web (faite en Django) est toujours en cours (sur localhost) j'ai essayé d'envoyer cette requête POST depuis un autre ordinateur sur le même réseau via IPv4: port.Erreur HTTP 500: erreur de serveur interne

Tout en faisant cela, j'obtiens l'erreur HTTP 500: Erreur interne du serveur avec retraçage à la ligne « réponse = urllib2.urlopen (REQ) » Mon script ressemble à ceci:

import urllib, urllib2, cookielib 
import re 

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

url_1 = 'http://192.168.1.104:8000/legacy' 
req = urllib2.Request(url_1) 
rsp = urllib2.urlopen(req) 


url_2 = 'http://192.168.1.104:8000/legacy' 
params = { 
    'temperature_max' : '186', 
    'temperature_min' : '88', 
    'submit': 'Submit', 
    } 

data = urllib.urlencode(params) 
req = urllib2.Request(url_2, data) 
response = urllib2.urlopen(req) 
the_page = response.read() 
pat = re.compile('Title:.*') 
print pat.search(the_page).group() 

Sur l'autre ordinateur hébergeant le serveur je reçois l'erreur suivante:

Exception happened during processing of request from ('192.168.1.65', 56996) 
    Traceback (most recent call last): 
    File "c:\python27\Lib\SocketServer.py", line 599, in process_request_thread 
self.finish_request(request, client_address) 
    File "c:\python27\Lib\SocketServer.py", line 334, in finish_request 
self.RequestHandlerClass(request, client_address, self) 
    File "C:\Users\Alex\Envs\rango\lib\site-packages\django\core\servers\basehttp. 
py", line 129, in __init__ 
super(WSGIRequestHandler, self).__init__(*args, **kwargs) 
    File "c:\python27\Lib\SocketServer.py", line 657, in __init__ 
self.finish() 
    File "c:\python27\Lib\SocketServer.py", line 716, in finish 
self.wfile.close() 
    File "c:\python27\Lib\socket.py", line 283, in close 
self.flush() 
    File "c:\python27\Lib\socket.py", line 307, in flush 
self._sock.sendall(view[write_offset:write_offset+buffer_size]) 
error: [Errno 10054] An existing connection was forcibly closed by the remote host 

EDIT: Je voudrais vous faire savoir que je peux publier des données de l'autre ordinateur à ma base de données si je me connecte à mon application avec mon navigateur.

+0

D'où vient le jeton CSRF? Êtes-vous sûr que c'est valide? – jsfan

+0

Depuis mon application web, je suis allé à la page où je veux insérer des données, cliqué sur "voir la source" et il était là en forme. – narn

+0

Ce jeton est probablement lié à une session. Cependant, vous ne copiez pas le cookie de session qui le rendrait invalide. – jsfan

Répondre

0

Vous devez obtenir un cookie de session, puis lire le cookie généré pour cette session.

La meilleure façon de faire est de récupérer la page avec le formulaire en premier, en enregistrant tous les cookies. Vous pouvez utiliser cookielib pour cela comme démontré here. Si vous voulez vous simplifier la vie, utilisez les requêtes à la place d'urllib. Le code devient alors a lot simpler.

Pour obtenir le jeton CSRF, vous pouvez rayer la page de formulaire avec BeautifulSoup. Pour cela, il y a beaucoup de tutorials que vous pouvez facilement trouver sur Google.

+0

Je ne pense pas que c'est le jeton CSRF ... si cela manquait ou que la réponse HTTP 403 serait retournée, pas 500. – mhawke

+0

Je m'attendrais aussi à un autre code d'erreur. Mais, si le jeton CSRF est invalide, il serait définitivement suspect jusqu'à ce qu'il soit exclu. J'ai vu Django faire des choses étranges plus d'une fois. – jsfan

+0

Ne sont pas des demandes de python 3.x? J'utilise 2.7, en plus je reçois toujours la même erreur. – narn