Подключение к бесплатному экземпляру pythonanywhere через http - PullRequest
1 голос
/ 02 июня 2019

Я пытаюсь поговорить с веб-приложением, размещенным на PythonAnywhere.Это низкоскоростное, низкочастотное соединение, поэтому я в порядке с интерфейсом http - и он отлично работает через http из браузера.Однако я не могу получить доступ к той же службе, работающей на хосте PythonAnywhere, работающем в облаке.

Если я запускаю сервер локально, это работает:

import socket
s = socket.socket()
s.connect(('127.0.0.1', 8080))
s.send('GET /check/nicky HTTP/1.1\r\n\r\n') 
print (s.recv(1024))

# 'HTTP/1.0 200 OK\r\nDate: Sat, 01 Jun 2019 23:45:14 GMT\r\nServer: WSGIServer/0.2 CPython/3.7.2\r\nContent-Type: application/json\r\nContent-Length: 19\r\n\r\n{"nicky": [0, 120]}'

Однако, если я использую socket.getaddrinfo() в URL-адресе pythonanywhere (для замены адреса в s.connect() выше), я получаюответ «неверный запрос»:

'HTTP/1.1 400 Bad Request\r\nServer: openresty/1.9.15.1\r\nDate: Sat, 01 Jun 2019 23:49:48 GMT\r\nContent-Type: text/html\r\nContent-Length: 179\r\nConnection: close\r\n\r\n<html>\r\n<head><title>400 Bad Request</title></head>\r\n<body bgcolor="white">\r\n<center><h1>400 Bad Request</h1></center>\r\n<hr><center>openresty/1.9.15.1</center>\r\n</body>\r\n</html>\r\n'

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

Это какая-то магия прокси или перенаправления портов, о которой я не знаю?Рассматриваемый аккаунт на pythonanwhere является бесплатной.

** На случай, если неясно **, диагноз @ @Steffen Ulrich правильный.В итоге я использовал клон запросов https://github.com/micropython/micropython-lib/tree/master/urequests,, и это решило проблему.

1 Ответ

1 голос
/ 02 июня 2019
s.send('GET /check/nicky HTTP/1.1\r\n\r\n') 
..
'HTTP/1.1 400 Bad Request\r\nServer: openresty/1.9.15.1\r\n ...

Сервер прав.То, что вы отправляете, не является правильным HTTP-запросом.Для HTTP/1.1 поле Host обязательно для заполнения в заголовке HTTP.

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

Хотя вы можете попытаться справиться со всем этим в своем собственном коде, я рекомендую вместо этого использовать существующую библиотеку HTTP, например запросы .

Если вы действительно хотите написать свой собственный слой HTTPЯ очень рекомендую прочитать и понять стандарт перед его внедрением, для этого и нужны стандарты.Для HTTP/1.1 это RFC 7230 и следующие RFC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...