2016-02-23 2 views
0

Я пытаюсь создать скрипт запроса POST в Python, который автоматически отправит данные в базу данных. Поскольку мое веб-приложение (сделанное в Django) все еще выполняется (на localhost), я попытался отправить этот запрос POST с другого компьютера в той же сети через порт IPv4:.Ошибка HTTP 500: ошибка внутреннего сервера

Хотя делать это я получаю ошибку HTTP 500: Внутренняя ошибка сервера с TRACEBACK в строке «ответ = urllib2.urlopen (REQ)» Мой сценарий выглядит следующим образом:

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() 

На другом компьютере, что хозяйничает сервер я получаю следующее сообщение об ошибке:

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: Я хотел бы, чтобы вы знали, что я могу отправить данные с другого компьютера в моей базе данных, если я связываю мое приложение с моим браузером.

+0

Откуда появился токен CSRF? Вы уверены, что это действительно так? – jsfan

+0

Поскольку это мое веб-приложение, я перешел на страницу, где я хочу вставить данные, щелкнув «просмотр источника», и он был там по форме. – narn

+0

Этот токен, вероятно, связан с сеансом. Однако вы не копируете файл cookie сеанса, через который он будет недействительным. – jsfan

ответ

0

Вам нужно будет получить cookie сеанса, а затем прочитать сгенерированный cookie для этой сессии.

Лучший способ сделать это, чтобы сначала получить страницу с формой, сохранив все файлы cookie. Вы можете использовать cookielib для этого, как показано на рисунке here. Если вы хотите сделать жизнь проще для себя, используйте запросы, а не urllib. Затем код становится a lot simpler.

Чтобы получить токен CSRF, вы можете очистить страницу формы BeautifulSoup. Для этого есть много tutorials, которые вы можете легко найти в Google.

+0

Я не думаю, что это токен CSRF ... если бы это было отсутствующее или несопоставимое HTTP-ответ 403, он был бы возвращен, а не 500. – mhawke

+0

Я также ожидал бы другого кода ошибки. Но, если токен CSRF недействителен, он определенно будет подозрительным до тех пор, пока не будет исключен. Я видел, как Джанго делал странные вещи не один раз. – jsfan

+0

Не запросы от python 3.x? Я использую 2.7, кроме того, я все еще получаю ту же ошибку. – narn